]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Revert to tracking new versions of rinku
[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) {
1087
1088     for (var groups0 = this._groups, groups1 = selection._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 dragDisable(view) {
1789     var root = view.document.documentElement,
1790         selection = select(view).on("dragstart.drag", noevent, true);
1791     if ("onselectstart" in root) {
1792       selection.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 = select(view).on("dragstart.drag", null);
1802     if (noclick) {
1803       selection.on("click.drag", noevent, true);
1804       setTimeout(function() { selection.on("click.drag", null); }, 0);
1805     }
1806     if ("onselectstart" in root) {
1807       selection.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 d3_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) {
1870       selection
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       dragDisable(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, that, args) {
1950       var p = point(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(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 = gamma(y);
2573
2574     function rgb$1(start, end) {
2575       var r = color((start = rgb(start)).r, (end = rgb(end)).r),
2576           g = color(start.g, end.g),
2577           b = color(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;
2600       for (i = 0; i < n; ++i) {
2601         color = rgb(colors[i]);
2602         r[i] = color.r || 0;
2603         g[i] = color.g || 0;
2604         b[i] = color.b || 0;
2605       }
2606       r = spline(r);
2607       g = spline(g);
2608       b = spline(b);
2609       color.opacity = 1;
2610       return function(t) {
2611         color.r = r(t);
2612         color.g = g(t);
2613         color.b = b(t);
2614         return color + "";
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) {
2932     return function(start, end) {
2933       var h = hue((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) {
2965     return function(start, end) {
2966       var h = hue((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) {
2984     return (function cubehelixGamma(y) {
2985       y = +y;
2986
2987       function cubehelix$1(start, end) {
2988         var h = hue((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,
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 = schedules[i]).name !== name) { empty = false; continue; }
3315       active = schedule.state > STARTING && schedule.state < ENDING;
3316       schedule.state = ENDED;
3317       schedule.timer.stop();
3318       if (active) schedule.on.call("interrupt", node, node.__data__, schedule.index, schedule.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 = set$1(this, id),
3335           tween = schedule.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.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 = set$1(this, id),
3360           tween = schedule.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.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 = set$1(this, id);
3403       (schedule.value || (schedule.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, 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(value00 = value0, value1);
3439     };
3440   }
3441
3442   function attrConstantNS$1(fullname, interpolate, 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(value00 = value0, value1);
3450     };
3451   }
3452
3453   function attrFunction$1(name, interpolate, 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(value00 = value0, value10 = value1);
3464     };
3465   }
3466
3467   function attrFunctionNS$1(fullname, interpolate, 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(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) {
3594     if (transition._id !== this._id) throw new Error;
3595
3596     for (var groups0 = this._groups, groups1 = transition._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 = sit(this, id),
3623           on = schedule.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.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) {
3655     var name = this._name,
3656         id = this._id;
3657
3658     if (typeof select !== "function") select = selector(select);
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.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) {
3674     var name = this._name,
3675         id = this._id;
3676
3677     if (typeof select !== "function") select = selectorAll(select);
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.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) {
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(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, 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(value00 = value0, value1);
3729     };
3730   }
3731
3732   function styleFunction$1(name, interpolate, 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(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,
4119         i;
4120
4121     if (schedules) {
4122       name = name == null ? null : name + "";
4123       for (i in schedules) {
4124         if ((schedule = schedules[i]).state > SCHEDULED && schedule.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) {
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 === "function" ? selection.apply(this, arguments) : selection, 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 === "function" ? selection.apply(that, args) : selection, 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 = local$1(this).selection;
4374
4375       if (selection) {
4376         group.selectAll(".selection")
4377             .style("display", null)
4378             .attr("x", selection[0][0])
4379             .attr("y", selection[0][1])
4380             .attr("width", selection[1][0] - selection[0][0])
4381             .attr("height", selection[1][1] - selection[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][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
4386             .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
4387             .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
4388             .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[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 = 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 = point0,
4459           emit = emitter(that, arguments).beforestart();
4460
4461       if (type === "overlay") {
4462         state.selection = selection = [
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[0][0];
4468         n0 = selection[0][1];
4469         e0 = selection[1][0];
4470         s0 = selection[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         dragDisable(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[0]) > Math.abs(point1[1] - point[1])) lockY = true;
4507           else lockX = true;
4508         }
4509         point = point1;
4510         moving = true;
4511         noevent$1();
4512         move();
4513       }
4514
4515       function move() {
4516         var t;
4517
4518         dx = point[0] - point0[0];
4519         dy = point[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 = state.selection; // May be set by brush.move!
4557         if (lockX) w1 = selection[0][0], e1 = selection[1][0];
4558         if (lockY) n1 = selection[0][1], s1 = selection[1][1];
4559
4560         if (selection[0][0] !== w1
4561             || selection[0][1] !== n1
4562             || selection[1][0] !== e1
4563             || selection[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 = state.selection; // May be set by brush.move (on start)!
4584         if (empty$1(selection)) 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 = delta > 0 ? 1 : -1,
7048           lambdai = inflection[0] * degrees$1 * sign,
7049           phii,
7050           antimeridian = abs(delta) > 180;
7051       if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
7052         phii = inflection[1] * degrees$1;
7053         if (phii > phi1) phi1 = phii;
7054       } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * 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 = delta >= 0 ? 1 : -1,
7626             absDelta = sign * delta,
7627             antimeridian = absDelta > pi$3,
7628             k = sinPhi0 * sinPhi1;
7629
7630         sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
7631         angle += antimeridian ? delta + sign * 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) {
11528       return parse(request.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, deinterpolate, reinterpolate) {
11717     var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[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, deinterpolate, reinterpolate) {
11724     var j = Math.min(domain.length, range.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 = range.slice().reverse();
11733     }
11734
11735     while (++i < j) {
11736       d[i] = deinterpolate(domain[i], domain[i + 1]);
11737       r[i] = reinterpolate(range[i], range[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 = 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.length) > 2 ? polymap : bimap;
11767       output = input = null;
11768       return scale;
11769     }
11770
11771     function scale(x) {
11772       return (output || (output = piecewise(domain, range, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$1)))(+x);
11773     }
11774
11775     scale.invert = function(y) {
11776       return (input || (input = piecewise(range, 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 = slice$5.call(_), rescale()) : range.slice();
11785     };
11786
11787     scale.rangeRound = function(_) {
11788       return range = 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 = [],
12096         thresholds = [];
12097
12098     function rescale() {
12099       var i = 0, n = Math.max(1, range.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[bisectRight(thresholds, x)];
12107     }
12108
12109     scale.invertExtent = function(y) {
12110       var i = range.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 = slice$5.call(_), rescale()) : range.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);
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 = [0, 1];
12148
12149     function scale(x) {
12150       if (x <= x) return range[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 = slice$5.call(_)).length - 1, rescale()) : range.slice();
12166     };
12167
12168     scale.invertExtent = function(y) {
12169       var i = range.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);
12180     };
12181
12182     return linearish(scale);
12183   }
12184
12185   function threshold() {
12186     var domain = [0.5],
12187         range = [0, 1],
12188         n = 1;
12189
12190     function scale(x) {
12191       if (x <= x) return range[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.length - 1), scale) : domain.slice();
12196     };
12197
12198     scale.range = function(_) {
12199       return arguments.length ? (range = slice$5.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
12200     };
12201
12202     scale.invertExtent = function(y) {
12203       var i = range.indexOf(y);
12204       return [domain[i - 1], domain[i]];
12205     };
12206
12207     scale.copy = function() {
12208       return threshold()
12209           .domain(domain)
12210           .range(range);
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 = d.getDay();
13026     return day === 0 ? 7 : day;
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 = d.getDay();
13035     d = (day >= 4 || day === 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 = d.getUTCDay();
13109     d = (day >= 4 || day === 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, month, week, day, hour, minute, second, millisecond, 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,      durationSecond$1],
13222       [second,  5,  5 * durationSecond$1],
13223       [second, 15, 15 * durationSecond$1],
13224       [second, 30, 30 * durationSecond$1],
13225       [minute,  1,      durationMinute$1],
13226       [minute,  5,  5 * durationMinute$1],
13227       [minute, 15, 15 * durationMinute$1],
13228       [minute, 30, 30 * durationMinute$1],
13229       [  hour,  1,      durationHour$1  ],
13230       [  hour,  3,  3 * durationHour$1  ],
13231       [  hour,  6,  6 * durationHour$1  ],
13232       [  hour, 12, 12 * durationHour$1  ],
13233       [   day,  1,      durationDay$1   ],
13234       [   day,  2,  2 * durationDay$1   ],
13235       [  week,  1,      durationWeek$1  ],
13236       [ month,  1,      durationMonth ],
13237       [ month,  3,  3 * durationMonth ],
13238       [  year,  1,      durationYear  ]
13239     ];
13240
13241     function tickFormat(date) {
13242       return (second(date) < date ? formatMillisecond
13243           : minute(date) < date ? formatSecond
13244           : hour(date) < date ? formatMinute
13245           : day(date) < date ? formatHour
13246           : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
13247           : year(date) < date ? formatMonth
13248           : formatYear)(date);
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;
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;
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, month, week, day, hour, minute, second, millisecond, 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 = x$3,
13722         y = 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(d, i, data), +y(d, i, data));
13743       }
13744
13745       if (buffer) return output = null, buffer + "" || null;
13746     }
13747
13748     line.x = function(_) {
13749       return arguments.length ? (x = typeof _ === "function" ? _ : constant$a(+_), line) : x;
13750     };
13751
13752     line.y = function(_) {
13753       return arguments.length ? (y = typeof _ === "function" ? _ : constant$a(+_), line) : y;
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 = x$3,
14054         y = 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.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.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 = typeof _ === "function" ? _ : constant$a(+_), link) : x;
14074     };
14075
14076     link.y = function(_) {
14077       return arguments.length ? (y = typeof _ === "function" ? _ : constant$a(+_), link) : y;
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(context) {
14578       return new CardinalClosed(context, tension);
14579     }
14580
14581     cardinal.tension = function(tension) {
14582       return custom(+tension);
14583     };
14584
14585     return cardinal;
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(context) {
14626       return new CardinalOpen(context, tension);
14627     }
14628
14629     cardinal.tension = function(tension) {
14630       return custom(+tension);
14631     };
14632
14633     return cardinal;
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(context) {
14783       return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14784     }
14785
14786     catmullRom.alpha = function(alpha) {
14787       return custom(+alpha);
14788     };
14789
14790     return catmullRom;
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(context) {
14843       return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14844     }
14845
14846     catmullRom.alpha = function(alpha) {
14847       return custom(+alpha);
14848     };
14849
14850     return catmullRom;
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 = x$4,
16215         y = 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(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(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 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x;
16241     };
16242
16243     voronoi.y = function(_) {
16244       return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y;
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, extent, translateExtent) {
16361     var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
16362         dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
16363         dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
16364         dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
16365     return transform.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 = 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) {
16390       selection
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) {
16404       var selection = collection.selection ? collection.selection() : collection;
16405       selection.property("__zoom", defaultTransform);
16406       if (collection !== selection) {
16407         schedule(collection, transform);
16408       } else {
16409         selection.interrupt().each(function() {
16410           gesture(this, arguments)
16411               .start()
16412               .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
16413               .end();
16414         });
16415       }
16416     };
16417
16418     zoom.scaleBy = function(selection, k) {
16419       zoom.scaleTo(selection, 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, k) {
16427       zoom.transform(selection, 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, x, y) {
16438       zoom.transform(selection, 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, x, y) {
16447       zoom.transform(selection, 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, k) {
16459       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16460       return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
16461     }
16462
16463     function translate(transform, p0, p1) {
16464       var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
16465       return x === transform.x && y === transform.y ? transform : new Transform(transform.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, transform, center) {
16473       transition
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 === "function" ? transform.apply(that, args) : transform,
16485                 i = interpolate(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) {
16520         if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
16521         if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
16522         if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
16523         this.that.__zoom = transform;
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       dragDisable(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 = _, zoom) : interpolate;
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: d3_drag,
16805     dragDisable: dragDisable,
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       var unmasked = true;
17432     } catch (e) {}
17433
17434     var result = nativeObjectToString.call(value);
17435     if (unmasked) {
17436       if (isOwn) {
17437         value[symToStringTag] = tag;
17438       } else {
17439         delete value[symToStringTag];
17440       }
17441     }
17442     return result;
17443   }
17444
17445   /** Used for built-in method references. */
17446   var objectProto$1 = Object.prototype;
17447
17448   /**
17449    * Used to resolve the
17450    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17451    * of values.
17452    */
17453   var nativeObjectToString$1 = objectProto$1.toString;
17454
17455   /**
17456    * Converts `value` to a string using `Object.prototype.toString`.
17457    *
17458    * @private
17459    * @param {*} value The value to convert.
17460    * @returns {string} Returns the converted string.
17461    */
17462   function objectToString(value) {
17463     return nativeObjectToString$1.call(value);
17464   }
17465
17466   /** `Object#toString` result references. */
17467   var nullTag = '[object Null]',
17468       undefinedTag = '[object Undefined]';
17469
17470   /** Built-in value references. */
17471   var symToStringTag$1 = Symbol ? Symbol.toStringTag : undefined;
17472
17473   /**
17474    * The base implementation of `getTag` without fallbacks for buggy environments.
17475    *
17476    * @private
17477    * @param {*} value The value to query.
17478    * @returns {string} Returns the `toStringTag`.
17479    */
17480   function baseGetTag(value) {
17481     if (value == null) {
17482       return value === undefined ? undefinedTag : nullTag;
17483     }
17484     return (symToStringTag$1 && symToStringTag$1 in Object(value))
17485       ? getRawTag(value)
17486       : objectToString(value);
17487   }
17488
17489   /**
17490    * Checks if `value` is the
17491    * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
17492    * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
17493    *
17494    * @static
17495    * @memberOf _
17496    * @since 0.1.0
17497    * @category Lang
17498    * @param {*} value The value to check.
17499    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
17500    * @example
17501    *
17502    * _.isObject({});
17503    * // => true
17504    *
17505    * _.isObject([1, 2, 3]);
17506    * // => true
17507    *
17508    * _.isObject(_.noop);
17509    * // => true
17510    *
17511    * _.isObject(null);
17512    * // => false
17513    */
17514   function isObject(value) {
17515     var type = typeof value;
17516     return value != null && (type == 'object' || type == 'function');
17517   }
17518
17519   /** `Object#toString` result references. */
17520   var asyncTag = '[object AsyncFunction]',
17521       funcTag = '[object Function]',
17522       genTag = '[object GeneratorFunction]',
17523       proxyTag = '[object Proxy]';
17524
17525   /**
17526    * Checks if `value` is classified as a `Function` object.
17527    *
17528    * @static
17529    * @memberOf _
17530    * @since 0.1.0
17531    * @category Lang
17532    * @param {*} value The value to check.
17533    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
17534    * @example
17535    *
17536    * _.isFunction(_);
17537    * // => true
17538    *
17539    * _.isFunction(/abc/);
17540    * // => false
17541    */
17542   function isFunction(value) {
17543     if (!isObject(value)) {
17544       return false;
17545     }
17546     // The use of `Object#toString` avoids issues with the `typeof` operator
17547     // in Safari 9 which returns 'object' for typed arrays and other constructors.
17548     var tag = baseGetTag(value);
17549     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
17550   }
17551
17552   /** Used to detect overreaching core-js shims. */
17553   var coreJsData = root$2['__core-js_shared__'];
17554
17555   /** Used to detect methods masquerading as native. */
17556   var maskSrcKey = (function() {
17557     var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
17558     return uid ? ('Symbol(src)_1.' + uid) : '';
17559   }());
17560
17561   /**
17562    * Checks if `func` has its source masked.
17563    *
17564    * @private
17565    * @param {Function} func The function to check.
17566    * @returns {boolean} Returns `true` if `func` is masked, else `false`.
17567    */
17568   function isMasked(func) {
17569     return !!maskSrcKey && (maskSrcKey in func);
17570   }
17571
17572   /** Used for built-in method references. */
17573   var funcProto = Function.prototype;
17574
17575   /** Used to resolve the decompiled source of functions. */
17576   var funcToString = funcProto.toString;
17577
17578   /**
17579    * Converts `func` to its source code.
17580    *
17581    * @private
17582    * @param {Function} func The function to convert.
17583    * @returns {string} Returns the source code.
17584    */
17585   function toSource(func) {
17586     if (func != null) {
17587       try {
17588         return funcToString.call(func);
17589       } catch (e) {}
17590       try {
17591         return (func + '');
17592       } catch (e) {}
17593     }
17594     return '';
17595   }
17596
17597   /**
17598    * Used to match `RegExp`
17599    * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
17600    */
17601   var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
17602
17603   /** Used to detect host constructors (Safari). */
17604   var reIsHostCtor = /^\[object .+?Constructor\]$/;
17605
17606   /** Used for built-in method references. */
17607   var funcProto$1 = Function.prototype,
17608       objectProto$2 = Object.prototype;
17609
17610   /** Used to resolve the decompiled source of functions. */
17611   var funcToString$1 = funcProto$1.toString;
17612
17613   /** Used to check objects for own properties. */
17614   var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
17615
17616   /** Used to detect if a method is native. */
17617   var reIsNative = RegExp('^' +
17618     funcToString$1.call(hasOwnProperty$1).replace(reRegExpChar, '\\$&')
17619     .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
17620   );
17621
17622   /**
17623    * The base implementation of `_.isNative` without bad shim checks.
17624    *
17625    * @private
17626    * @param {*} value The value to check.
17627    * @returns {boolean} Returns `true` if `value` is a native function,
17628    *  else `false`.
17629    */
17630   function baseIsNative(value) {
17631     if (!isObject(value) || isMasked(value)) {
17632       return false;
17633     }
17634     var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
17635     return pattern.test(toSource(value));
17636   }
17637
17638   /**
17639    * Gets the value at `key` of `object`.
17640    *
17641    * @private
17642    * @param {Object} [object] The object to query.
17643    * @param {string} key The key of the property to get.
17644    * @returns {*} Returns the property value.
17645    */
17646   function getValue(object, key) {
17647     return object == null ? undefined : object[key];
17648   }
17649
17650   /**
17651    * Gets the native function at `key` of `object`.
17652    *
17653    * @private
17654    * @param {Object} object The object to query.
17655    * @param {string} key The key of the method to get.
17656    * @returns {*} Returns the function if it's native, else `undefined`.
17657    */
17658   function getNative(object, key) {
17659     var value = getValue(object, key);
17660     return baseIsNative(value) ? value : undefined;
17661   }
17662
17663   /* Built-in method references that are verified to be native. */
17664   var Map$1 = getNative(root$2, 'Map');
17665
17666   /* Built-in method references that are verified to be native. */
17667   var nativeCreate = getNative(Object, 'create');
17668
17669   /**
17670    * Removes all key-value entries from the hash.
17671    *
17672    * @private
17673    * @name clear
17674    * @memberOf Hash
17675    */
17676   function hashClear() {
17677     this.__data__ = nativeCreate ? nativeCreate(null) : {};
17678     this.size = 0;
17679   }
17680
17681   /**
17682    * Removes `key` and its value from the hash.
17683    *
17684    * @private
17685    * @name delete
17686    * @memberOf Hash
17687    * @param {Object} hash The hash to modify.
17688    * @param {string} key The key of the value to remove.
17689    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17690    */
17691   function hashDelete(key) {
17692     var result = this.has(key) && delete this.__data__[key];
17693     this.size -= result ? 1 : 0;
17694     return result;
17695   }
17696
17697   /** Used to stand-in for `undefined` hash values. */
17698   var HASH_UNDEFINED = '__lodash_hash_undefined__';
17699
17700   /** Used for built-in method references. */
17701   var objectProto$3 = Object.prototype;
17702
17703   /** Used to check objects for own properties. */
17704   var hasOwnProperty$2 = objectProto$3.hasOwnProperty;
17705
17706   /**
17707    * Gets the hash value for `key`.
17708    *
17709    * @private
17710    * @name get
17711    * @memberOf Hash
17712    * @param {string} key The key of the value to get.
17713    * @returns {*} Returns the entry value.
17714    */
17715   function hashGet(key) {
17716     var data = this.__data__;
17717     if (nativeCreate) {
17718       var result = data[key];
17719       return result === HASH_UNDEFINED ? undefined : result;
17720     }
17721     return hasOwnProperty$2.call(data, key) ? data[key] : undefined;
17722   }
17723
17724   /** Used for built-in method references. */
17725   var objectProto$4 = Object.prototype;
17726
17727   /** Used to check objects for own properties. */
17728   var hasOwnProperty$3 = objectProto$4.hasOwnProperty;
17729
17730   /**
17731    * Checks if a hash value for `key` exists.
17732    *
17733    * @private
17734    * @name has
17735    * @memberOf Hash
17736    * @param {string} key The key of the entry to check.
17737    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17738    */
17739   function hashHas(key) {
17740     var data = this.__data__;
17741     return nativeCreate ? (data[key] !== undefined) : hasOwnProperty$3.call(data, key);
17742   }
17743
17744   /** Used to stand-in for `undefined` hash values. */
17745   var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
17746
17747   /**
17748    * Sets the hash `key` to `value`.
17749    *
17750    * @private
17751    * @name set
17752    * @memberOf Hash
17753    * @param {string} key The key of the value to set.
17754    * @param {*} value The value to set.
17755    * @returns {Object} Returns the hash instance.
17756    */
17757   function hashSet(key, value) {
17758     var data = this.__data__;
17759     this.size += this.has(key) ? 0 : 1;
17760     data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
17761     return this;
17762   }
17763
17764   /**
17765    * Creates a hash object.
17766    *
17767    * @private
17768    * @constructor
17769    * @param {Array} [entries] The key-value pairs to cache.
17770    */
17771   function Hash(entries) {
17772     var index = -1,
17773         length = entries == null ? 0 : entries.length;
17774
17775     this.clear();
17776     while (++index < length) {
17777       var entry = entries[index];
17778       this.set(entry[0], entry[1]);
17779     }
17780   }
17781
17782   // Add methods to `Hash`.
17783   Hash.prototype.clear = hashClear;
17784   Hash.prototype['delete'] = hashDelete;
17785   Hash.prototype.get = hashGet;
17786   Hash.prototype.has = hashHas;
17787   Hash.prototype.set = hashSet;
17788
17789   /**
17790    * Removes all key-value entries from the map.
17791    *
17792    * @private
17793    * @name clear
17794    * @memberOf MapCache
17795    */
17796   function mapCacheClear() {
17797     this.size = 0;
17798     this.__data__ = {
17799       'hash': new Hash,
17800       'map': new (Map$1 || ListCache),
17801       'string': new Hash
17802     };
17803   }
17804
17805   /**
17806    * Checks if `value` is suitable for use as unique object key.
17807    *
17808    * @private
17809    * @param {*} value The value to check.
17810    * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
17811    */
17812   function isKeyable(value) {
17813     var type = typeof value;
17814     return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
17815       ? (value !== '__proto__')
17816       : (value === null);
17817   }
17818
17819   /**
17820    * Gets the data for `map`.
17821    *
17822    * @private
17823    * @param {Object} map The map to query.
17824    * @param {string} key The reference key.
17825    * @returns {*} Returns the map data.
17826    */
17827   function getMapData(map, key) {
17828     var data = map.__data__;
17829     return isKeyable(key)
17830       ? data[typeof key == 'string' ? 'string' : 'hash']
17831       : data.map;
17832   }
17833
17834   /**
17835    * Removes `key` and its value from the map.
17836    *
17837    * @private
17838    * @name delete
17839    * @memberOf MapCache
17840    * @param {string} key The key of the value to remove.
17841    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17842    */
17843   function mapCacheDelete(key) {
17844     var result = getMapData(this, key)['delete'](key);
17845     this.size -= result ? 1 : 0;
17846     return result;
17847   }
17848
17849   /**
17850    * Gets the map value for `key`.
17851    *
17852    * @private
17853    * @name get
17854    * @memberOf MapCache
17855    * @param {string} key The key of the value to get.
17856    * @returns {*} Returns the entry value.
17857    */
17858   function mapCacheGet(key) {
17859     return getMapData(this, key).get(key);
17860   }
17861
17862   /**
17863    * Checks if a map value for `key` exists.
17864    *
17865    * @private
17866    * @name has
17867    * @memberOf MapCache
17868    * @param {string} key The key of the entry to check.
17869    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17870    */
17871   function mapCacheHas(key) {
17872     return getMapData(this, key).has(key);
17873   }
17874
17875   /**
17876    * Sets the map `key` to `value`.
17877    *
17878    * @private
17879    * @name set
17880    * @memberOf MapCache
17881    * @param {string} key The key of the value to set.
17882    * @param {*} value The value to set.
17883    * @returns {Object} Returns the map cache instance.
17884    */
17885   function mapCacheSet(key, value) {
17886     var data = getMapData(this, key),
17887         size = data.size;
17888
17889     data.set(key, value);
17890     this.size += data.size == size ? 0 : 1;
17891     return this;
17892   }
17893
17894   /**
17895    * Creates a map cache object to store key-value pairs.
17896    *
17897    * @private
17898    * @constructor
17899    * @param {Array} [entries] The key-value pairs to cache.
17900    */
17901   function MapCache(entries) {
17902     var index = -1,
17903         length = entries == null ? 0 : entries.length;
17904
17905     this.clear();
17906     while (++index < length) {
17907       var entry = entries[index];
17908       this.set(entry[0], entry[1]);
17909     }
17910   }
17911
17912   // Add methods to `MapCache`.
17913   MapCache.prototype.clear = mapCacheClear;
17914   MapCache.prototype['delete'] = mapCacheDelete;
17915   MapCache.prototype.get = mapCacheGet;
17916   MapCache.prototype.has = mapCacheHas;
17917   MapCache.prototype.set = mapCacheSet;
17918
17919   /** Used as the size to enable large array optimizations. */
17920   var LARGE_ARRAY_SIZE = 200;
17921
17922   /**
17923    * Sets the stack `key` to `value`.
17924    *
17925    * @private
17926    * @name set
17927    * @memberOf Stack
17928    * @param {string} key The key of the value to set.
17929    * @param {*} value The value to set.
17930    * @returns {Object} Returns the stack cache instance.
17931    */
17932   function stackSet(key, value) {
17933     var data = this.__data__;
17934     if (data instanceof ListCache) {
17935       var pairs = data.__data__;
17936       if (!Map$1 || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
17937         pairs.push([key, value]);
17938         this.size = ++data.size;
17939         return this;
17940       }
17941       data = this.__data__ = new MapCache(pairs);
17942     }
17943     data.set(key, value);
17944     this.size = data.size;
17945     return this;
17946   }
17947
17948   /**
17949    * Creates a stack cache object to store key-value pairs.
17950    *
17951    * @private
17952    * @constructor
17953    * @param {Array} [entries] The key-value pairs to cache.
17954    */
17955   function Stack(entries) {
17956     var data = this.__data__ = new ListCache(entries);
17957     this.size = data.size;
17958   }
17959
17960   // Add methods to `Stack`.
17961   Stack.prototype.clear = stackClear;
17962   Stack.prototype['delete'] = stackDelete;
17963   Stack.prototype.get = stackGet;
17964   Stack.prototype.has = stackHas;
17965   Stack.prototype.set = stackSet;
17966
17967   /**
17968    * A specialized version of `_.forEach` for arrays without support for
17969    * iteratee shorthands.
17970    *
17971    * @private
17972    * @param {Array} [array] The array to iterate over.
17973    * @param {Function} iteratee The function invoked per iteration.
17974    * @returns {Array} Returns `array`.
17975    */
17976   function arrayEach(array, iteratee) {
17977     var index = -1,
17978         length = array == null ? 0 : array.length;
17979
17980     while (++index < length) {
17981       if (iteratee(array[index], index, array) === false) {
17982         break;
17983       }
17984     }
17985     return array;
17986   }
17987
17988   var defineProperty = (function() {
17989     try {
17990       var func = getNative(Object, 'defineProperty');
17991       func({}, '', {});
17992       return func;
17993     } catch (e) {}
17994   }());
17995
17996   /**
17997    * The base implementation of `assignValue` and `assignMergeValue` without
17998    * value checks.
17999    *
18000    * @private
18001    * @param {Object} object The object to modify.
18002    * @param {string} key The key of the property to assign.
18003    * @param {*} value The value to assign.
18004    */
18005   function baseAssignValue(object, key, value) {
18006     if (key == '__proto__' && defineProperty) {
18007       defineProperty(object, key, {
18008         'configurable': true,
18009         'enumerable': true,
18010         'value': value,
18011         'writable': true
18012       });
18013     } else {
18014       object[key] = value;
18015     }
18016   }
18017
18018   /** Used for built-in method references. */
18019   var objectProto$5 = Object.prototype;
18020
18021   /** Used to check objects for own properties. */
18022   var hasOwnProperty$4 = objectProto$5.hasOwnProperty;
18023
18024   /**
18025    * Assigns `value` to `key` of `object` if the existing value is not equivalent
18026    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
18027    * for equality comparisons.
18028    *
18029    * @private
18030    * @param {Object} object The object to modify.
18031    * @param {string} key The key of the property to assign.
18032    * @param {*} value The value to assign.
18033    */
18034   function assignValue(object, key, value) {
18035     var objValue = object[key];
18036     if (!(hasOwnProperty$4.call(object, key) && eq(objValue, value)) ||
18037         (value === undefined && !(key in object))) {
18038       baseAssignValue(object, key, value);
18039     }
18040   }
18041
18042   /**
18043    * Copies properties of `source` to `object`.
18044    *
18045    * @private
18046    * @param {Object} source The object to copy properties from.
18047    * @param {Array} props The property identifiers to copy.
18048    * @param {Object} [object={}] The object to copy properties to.
18049    * @param {Function} [customizer] The function to customize copied values.
18050    * @returns {Object} Returns `object`.
18051    */
18052   function copyObject(source, props, object, customizer) {
18053     var isNew = !object;
18054     object || (object = {});
18055
18056     var index = -1,
18057         length = props.length;
18058
18059     while (++index < length) {
18060       var key = props[index];
18061
18062       var newValue = customizer
18063         ? customizer(object[key], source[key], key, object, source)
18064         : undefined;
18065
18066       if (newValue === undefined) {
18067         newValue = source[key];
18068       }
18069       if (isNew) {
18070         baseAssignValue(object, key, newValue);
18071       } else {
18072         assignValue(object, key, newValue);
18073       }
18074     }
18075     return object;
18076   }
18077
18078   /**
18079    * The base implementation of `_.times` without support for iteratee shorthands
18080    * or max array length checks.
18081    *
18082    * @private
18083    * @param {number} n The number of times to invoke `iteratee`.
18084    * @param {Function} iteratee The function invoked per iteration.
18085    * @returns {Array} Returns the array of results.
18086    */
18087   function baseTimes(n, iteratee) {
18088     var index = -1,
18089         result = Array(n);
18090
18091     while (++index < n) {
18092       result[index] = iteratee(index);
18093     }
18094     return result;
18095   }
18096
18097   /**
18098    * Checks if `value` is object-like. A value is object-like if it's not `null`
18099    * and has a `typeof` result of "object".
18100    *
18101    * @static
18102    * @memberOf _
18103    * @since 4.0.0
18104    * @category Lang
18105    * @param {*} value The value to check.
18106    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
18107    * @example
18108    *
18109    * _.isObjectLike({});
18110    * // => true
18111    *
18112    * _.isObjectLike([1, 2, 3]);
18113    * // => true
18114    *
18115    * _.isObjectLike(_.noop);
18116    * // => false
18117    *
18118    * _.isObjectLike(null);
18119    * // => false
18120    */
18121   function isObjectLike(value) {
18122     return value != null && typeof value == 'object';
18123   }
18124
18125   /** `Object#toString` result references. */
18126   var argsTag = '[object Arguments]';
18127
18128   /**
18129    * The base implementation of `_.isArguments`.
18130    *
18131    * @private
18132    * @param {*} value The value to check.
18133    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18134    */
18135   function baseIsArguments(value) {
18136     return isObjectLike(value) && baseGetTag(value) == argsTag;
18137   }
18138
18139   /** Used for built-in method references. */
18140   var objectProto$6 = Object.prototype;
18141
18142   /** Used to check objects for own properties. */
18143   var hasOwnProperty$5 = objectProto$6.hasOwnProperty;
18144
18145   /** Built-in value references. */
18146   var propertyIsEnumerable = objectProto$6.propertyIsEnumerable;
18147
18148   /**
18149    * Checks if `value` is likely an `arguments` object.
18150    *
18151    * @static
18152    * @memberOf _
18153    * @since 0.1.0
18154    * @category Lang
18155    * @param {*} value The value to check.
18156    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
18157    *  else `false`.
18158    * @example
18159    *
18160    * _.isArguments(function() { return arguments; }());
18161    * // => true
18162    *
18163    * _.isArguments([1, 2, 3]);
18164    * // => false
18165    */
18166   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
18167     return isObjectLike(value) && hasOwnProperty$5.call(value, 'callee') &&
18168       !propertyIsEnumerable.call(value, 'callee');
18169   };
18170
18171   /**
18172    * Checks if `value` is classified as an `Array` object.
18173    *
18174    * @static
18175    * @memberOf _
18176    * @since 0.1.0
18177    * @category Lang
18178    * @param {*} value The value to check.
18179    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
18180    * @example
18181    *
18182    * _.isArray([1, 2, 3]);
18183    * // => true
18184    *
18185    * _.isArray(document.body.children);
18186    * // => false
18187    *
18188    * _.isArray('abc');
18189    * // => false
18190    *
18191    * _.isArray(_.noop);
18192    * // => false
18193    */
18194   var isArray = Array.isArray;
18195
18196   /**
18197    * This method returns `false`.
18198    *
18199    * @static
18200    * @memberOf _
18201    * @since 4.13.0
18202    * @category Util
18203    * @returns {boolean} Returns `false`.
18204    * @example
18205    *
18206    * _.times(2, _.stubFalse);
18207    * // => [false, false]
18208    */
18209   function stubFalse() {
18210     return false;
18211   }
18212
18213   /** Detect free variable `exports`. */
18214   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
18215
18216   /** Detect free variable `module`. */
18217   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
18218
18219   /** Detect the popular CommonJS extension `module.exports`. */
18220   var moduleExports = freeModule && freeModule.exports === freeExports;
18221
18222   /** Built-in value references. */
18223   var Buffer = moduleExports ? root$2.Buffer : undefined;
18224
18225   /* Built-in method references for those with the same name as other `lodash` methods. */
18226   var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
18227
18228   /**
18229    * Checks if `value` is a buffer.
18230    *
18231    * @static
18232    * @memberOf _
18233    * @since 4.3.0
18234    * @category Lang
18235    * @param {*} value The value to check.
18236    * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
18237    * @example
18238    *
18239    * _.isBuffer(new Buffer(2));
18240    * // => true
18241    *
18242    * _.isBuffer(new Uint8Array(2));
18243    * // => false
18244    */
18245   var isBuffer = nativeIsBuffer || stubFalse;
18246
18247   /** Used as references for various `Number` constants. */
18248   var MAX_SAFE_INTEGER = 9007199254740991;
18249
18250   /** Used to detect unsigned integer values. */
18251   var reIsUint = /^(?:0|[1-9]\d*)$/;
18252
18253   /**
18254    * Checks if `value` is a valid array-like index.
18255    *
18256    * @private
18257    * @param {*} value The value to check.
18258    * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
18259    * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
18260    */
18261   function isIndex(value, length) {
18262     var type = typeof value;
18263     length = length == null ? MAX_SAFE_INTEGER : length;
18264
18265     return !!length &&
18266       (type == 'number' ||
18267         (type != 'symbol' && reIsUint.test(value))) &&
18268           (value > -1 && value % 1 == 0 && value < length);
18269   }
18270
18271   /** Used as references for various `Number` constants. */
18272   var MAX_SAFE_INTEGER$1 = 9007199254740991;
18273
18274   /**
18275    * Checks if `value` is a valid array-like length.
18276    *
18277    * **Note:** This method is loosely based on
18278    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
18279    *
18280    * @static
18281    * @memberOf _
18282    * @since 4.0.0
18283    * @category Lang
18284    * @param {*} value The value to check.
18285    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
18286    * @example
18287    *
18288    * _.isLength(3);
18289    * // => true
18290    *
18291    * _.isLength(Number.MIN_VALUE);
18292    * // => false
18293    *
18294    * _.isLength(Infinity);
18295    * // => false
18296    *
18297    * _.isLength('3');
18298    * // => false
18299    */
18300   function isLength(value) {
18301     return typeof value == 'number' &&
18302       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
18303   }
18304
18305   /** `Object#toString` result references. */
18306   var argsTag$1 = '[object Arguments]',
18307       arrayTag = '[object Array]',
18308       boolTag = '[object Boolean]',
18309       dateTag = '[object Date]',
18310       errorTag = '[object Error]',
18311       funcTag$1 = '[object Function]',
18312       mapTag = '[object Map]',
18313       numberTag = '[object Number]',
18314       objectTag = '[object Object]',
18315       regexpTag = '[object RegExp]',
18316       setTag = '[object Set]',
18317       stringTag = '[object String]',
18318       weakMapTag = '[object WeakMap]';
18319
18320   var arrayBufferTag = '[object ArrayBuffer]',
18321       dataViewTag = '[object DataView]',
18322       float32Tag = '[object Float32Array]',
18323       float64Tag = '[object Float64Array]',
18324       int8Tag = '[object Int8Array]',
18325       int16Tag = '[object Int16Array]',
18326       int32Tag = '[object Int32Array]',
18327       uint8Tag = '[object Uint8Array]',
18328       uint8ClampedTag = '[object Uint8ClampedArray]',
18329       uint16Tag = '[object Uint16Array]',
18330       uint32Tag = '[object Uint32Array]';
18331
18332   /** Used to identify `toStringTag` values of typed arrays. */
18333   var typedArrayTags = {};
18334   typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
18335   typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
18336   typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
18337   typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
18338   typedArrayTags[uint32Tag] = true;
18339   typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
18340   typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
18341   typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
18342   typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
18343   typedArrayTags[mapTag] = typedArrayTags[numberTag] =
18344   typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
18345   typedArrayTags[setTag] = typedArrayTags[stringTag] =
18346   typedArrayTags[weakMapTag] = false;
18347
18348   /**
18349    * The base implementation of `_.isTypedArray` without Node.js optimizations.
18350    *
18351    * @private
18352    * @param {*} value The value to check.
18353    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18354    */
18355   function baseIsTypedArray(value) {
18356     return isObjectLike(value) &&
18357       isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
18358   }
18359
18360   /**
18361    * The base implementation of `_.unary` without support for storing metadata.
18362    *
18363    * @private
18364    * @param {Function} func The function to cap arguments for.
18365    * @returns {Function} Returns the new capped function.
18366    */
18367   function baseUnary(func) {
18368     return function(value) {
18369       return func(value);
18370     };
18371   }
18372
18373   /** Detect free variable `exports`. */
18374   var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18375
18376   /** Detect free variable `module`. */
18377   var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;
18378
18379   /** Detect the popular CommonJS extension `module.exports`. */
18380   var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;
18381
18382   /** Detect free variable `process` from Node.js. */
18383   var freeProcess = moduleExports$1 && freeGlobal.process;
18384
18385   /** Used to access faster Node.js helpers. */
18386   var nodeUtil = (function() {
18387     try {
18388       // Use `util.types` for Node.js 10+.
18389       var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18390
18391       if (types) {
18392         return types;
18393       }
18394
18395       // Legacy `process.binding('util')` for Node.js < 10.
18396       return freeProcess && freeProcess.binding && freeProcess.binding('util');
18397     } catch (e) {}
18398   }());
18399
18400   /* Node.js helper references. */
18401   var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18402
18403   /**
18404    * Checks if `value` is classified as a typed array.
18405    *
18406    * @static
18407    * @memberOf _
18408    * @since 3.0.0
18409    * @category Lang
18410    * @param {*} value The value to check.
18411    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18412    * @example
18413    *
18414    * _.isTypedArray(new Uint8Array);
18415    * // => true
18416    *
18417    * _.isTypedArray([]);
18418    * // => false
18419    */
18420   var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18421
18422   /** Used for built-in method references. */
18423   var objectProto$7 = Object.prototype;
18424
18425   /** Used to check objects for own properties. */
18426   var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18427
18428   /**
18429    * Creates an array of the enumerable property names of the array-like `value`.
18430    *
18431    * @private
18432    * @param {*} value The value to query.
18433    * @param {boolean} inherited Specify returning inherited property names.
18434    * @returns {Array} Returns the array of property names.
18435    */
18436   function arrayLikeKeys(value, inherited) {
18437     var isArr = isArray(value),
18438         isArg = !isArr && isArguments(value),
18439         isBuff = !isArr && !isArg && isBuffer(value),
18440         isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18441         skipIndexes = isArr || isArg || isBuff || isType,
18442         result = skipIndexes ? baseTimes(value.length, String) : [],
18443         length = result.length;
18444
18445     for (var key in value) {
18446       if ((inherited || hasOwnProperty$6.call(value, key)) &&
18447           !(skipIndexes && (
18448              // Safari 9 has enumerable `arguments.length` in strict mode.
18449              key == 'length' ||
18450              // Node.js 0.10 has enumerable non-index properties on buffers.
18451              (isBuff && (key == 'offset' || key == 'parent')) ||
18452              // PhantomJS 2 has enumerable non-index properties on typed arrays.
18453              (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18454              // Skip index properties.
18455              isIndex(key, length)
18456           ))) {
18457         result.push(key);
18458       }
18459     }
18460     return result;
18461   }
18462
18463   /** Used for built-in method references. */
18464   var objectProto$8 = Object.prototype;
18465
18466   /**
18467    * Checks if `value` is likely a prototype object.
18468    *
18469    * @private
18470    * @param {*} value The value to check.
18471    * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18472    */
18473   function isPrototype(value) {
18474     var Ctor = value && value.constructor,
18475         proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18476
18477     return value === proto;
18478   }
18479
18480   /**
18481    * Creates a unary function that invokes `func` with its argument transformed.
18482    *
18483    * @private
18484    * @param {Function} func The function to wrap.
18485    * @param {Function} transform The argument transform.
18486    * @returns {Function} Returns the new function.
18487    */
18488   function overArg(func, transform) {
18489     return function(arg) {
18490       return func(transform(arg));
18491     };
18492   }
18493
18494   /* Built-in method references for those with the same name as other `lodash` methods. */
18495   var nativeKeys = overArg(Object.keys, Object);
18496
18497   /** Used for built-in method references. */
18498   var objectProto$9 = Object.prototype;
18499
18500   /** Used to check objects for own properties. */
18501   var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18502
18503   /**
18504    * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18505    *
18506    * @private
18507    * @param {Object} object The object to query.
18508    * @returns {Array} Returns the array of property names.
18509    */
18510   function baseKeys(object) {
18511     if (!isPrototype(object)) {
18512       return nativeKeys(object);
18513     }
18514     var result = [];
18515     for (var key in Object(object)) {
18516       if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18517         result.push(key);
18518       }
18519     }
18520     return result;
18521   }
18522
18523   /**
18524    * Checks if `value` is array-like. A value is considered array-like if it's
18525    * not a function and has a `value.length` that's an integer greater than or
18526    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18527    *
18528    * @static
18529    * @memberOf _
18530    * @since 4.0.0
18531    * @category Lang
18532    * @param {*} value The value to check.
18533    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18534    * @example
18535    *
18536    * _.isArrayLike([1, 2, 3]);
18537    * // => true
18538    *
18539    * _.isArrayLike(document.body.children);
18540    * // => true
18541    *
18542    * _.isArrayLike('abc');
18543    * // => true
18544    *
18545    * _.isArrayLike(_.noop);
18546    * // => false
18547    */
18548   function isArrayLike(value) {
18549     return value != null && isLength(value.length) && !isFunction(value);
18550   }
18551
18552   /**
18553    * Creates an array of the own enumerable property names of `object`.
18554    *
18555    * **Note:** Non-object values are coerced to objects. See the
18556    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18557    * for more details.
18558    *
18559    * @static
18560    * @since 0.1.0
18561    * @memberOf _
18562    * @category Object
18563    * @param {Object} object The object to query.
18564    * @returns {Array} Returns the array of property names.
18565    * @example
18566    *
18567    * function Foo() {
18568    *   this.a = 1;
18569    *   this.b = 2;
18570    * }
18571    *
18572    * Foo.prototype.c = 3;
18573    *
18574    * _.keys(new Foo);
18575    * // => ['a', 'b'] (iteration order is not guaranteed)
18576    *
18577    * _.keys('hi');
18578    * // => ['0', '1']
18579    */
18580   function keys$1(object) {
18581     return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18582   }
18583
18584   /**
18585    * The base implementation of `_.assign` without support for multiple sources
18586    * or `customizer` functions.
18587    *
18588    * @private
18589    * @param {Object} object The destination object.
18590    * @param {Object} source The source object.
18591    * @returns {Object} Returns `object`.
18592    */
18593   function baseAssign(object, source) {
18594     return object && copyObject(source, keys$1(source), object);
18595   }
18596
18597   /**
18598    * This function is like
18599    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18600    * except that it includes inherited enumerable properties.
18601    *
18602    * @private
18603    * @param {Object} object The object to query.
18604    * @returns {Array} Returns the array of property names.
18605    */
18606   function nativeKeysIn(object) {
18607     var result = [];
18608     if (object != null) {
18609       for (var key in Object(object)) {
18610         result.push(key);
18611       }
18612     }
18613     return result;
18614   }
18615
18616   /** Used for built-in method references. */
18617   var objectProto$a = Object.prototype;
18618
18619   /** Used to check objects for own properties. */
18620   var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18621
18622   /**
18623    * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18624    *
18625    * @private
18626    * @param {Object} object The object to query.
18627    * @returns {Array} Returns the array of property names.
18628    */
18629   function baseKeysIn(object) {
18630     if (!isObject(object)) {
18631       return nativeKeysIn(object);
18632     }
18633     var isProto = isPrototype(object),
18634         result = [];
18635
18636     for (var key in object) {
18637       if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18638         result.push(key);
18639       }
18640     }
18641     return result;
18642   }
18643
18644   /**
18645    * Creates an array of the own and inherited enumerable property names of `object`.
18646    *
18647    * **Note:** Non-object values are coerced to objects.
18648    *
18649    * @static
18650    * @memberOf _
18651    * @since 3.0.0
18652    * @category Object
18653    * @param {Object} object The object to query.
18654    * @returns {Array} Returns the array of property names.
18655    * @example
18656    *
18657    * function Foo() {
18658    *   this.a = 1;
18659    *   this.b = 2;
18660    * }
18661    *
18662    * Foo.prototype.c = 3;
18663    *
18664    * _.keysIn(new Foo);
18665    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18666    */
18667   function keysIn$1(object) {
18668     return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18669   }
18670
18671   /**
18672    * The base implementation of `_.assignIn` without support for multiple sources
18673    * or `customizer` functions.
18674    *
18675    * @private
18676    * @param {Object} object The destination object.
18677    * @param {Object} source The source object.
18678    * @returns {Object} Returns `object`.
18679    */
18680   function baseAssignIn(object, source) {
18681     return object && copyObject(source, keysIn$1(source), object);
18682   }
18683
18684   /** Detect free variable `exports`. */
18685   var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18686
18687   /** Detect free variable `module`. */
18688   var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18689
18690   /** Detect the popular CommonJS extension `module.exports`. */
18691   var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18692
18693   /** Built-in value references. */
18694   var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18695       allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18696
18697   /**
18698    * Creates a clone of  `buffer`.
18699    *
18700    * @private
18701    * @param {Buffer} buffer The buffer to clone.
18702    * @param {boolean} [isDeep] Specify a deep clone.
18703    * @returns {Buffer} Returns the cloned buffer.
18704    */
18705   function cloneBuffer(buffer, isDeep) {
18706     if (isDeep) {
18707       return buffer.slice();
18708     }
18709     var length = buffer.length,
18710         result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18711
18712     buffer.copy(result);
18713     return result;
18714   }
18715
18716   /**
18717    * Copies the values of `source` to `array`.
18718    *
18719    * @private
18720    * @param {Array} source The array to copy values from.
18721    * @param {Array} [array=[]] The array to copy values to.
18722    * @returns {Array} Returns `array`.
18723    */
18724   function copyArray(source, array) {
18725     var index = -1,
18726         length = source.length;
18727
18728     array || (array = Array(length));
18729     while (++index < length) {
18730       array[index] = source[index];
18731     }
18732     return array;
18733   }
18734
18735   /**
18736    * A specialized version of `_.filter` for arrays without support for
18737    * iteratee shorthands.
18738    *
18739    * @private
18740    * @param {Array} [array] The array to iterate over.
18741    * @param {Function} predicate The function invoked per iteration.
18742    * @returns {Array} Returns the new filtered array.
18743    */
18744   function arrayFilter(array, predicate) {
18745     var index = -1,
18746         length = array == null ? 0 : array.length,
18747         resIndex = 0,
18748         result = [];
18749
18750     while (++index < length) {
18751       var value = array[index];
18752       if (predicate(value, index, array)) {
18753         result[resIndex++] = value;
18754       }
18755     }
18756     return result;
18757   }
18758
18759   /**
18760    * This method returns a new empty array.
18761    *
18762    * @static
18763    * @memberOf _
18764    * @since 4.13.0
18765    * @category Util
18766    * @returns {Array} Returns the new empty array.
18767    * @example
18768    *
18769    * var arrays = _.times(2, _.stubArray);
18770    *
18771    * console.log(arrays);
18772    * // => [[], []]
18773    *
18774    * console.log(arrays[0] === arrays[1]);
18775    * // => false
18776    */
18777   function stubArray() {
18778     return [];
18779   }
18780
18781   /** Used for built-in method references. */
18782   var objectProto$b = Object.prototype;
18783
18784   /** Built-in value references. */
18785   var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18786
18787   /* Built-in method references for those with the same name as other `lodash` methods. */
18788   var nativeGetSymbols = Object.getOwnPropertySymbols;
18789
18790   /**
18791    * Creates an array of the own enumerable symbols of `object`.
18792    *
18793    * @private
18794    * @param {Object} object The object to query.
18795    * @returns {Array} Returns the array of symbols.
18796    */
18797   var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18798     if (object == null) {
18799       return [];
18800     }
18801     object = Object(object);
18802     return arrayFilter(nativeGetSymbols(object), function(symbol) {
18803       return propertyIsEnumerable$1.call(object, symbol);
18804     });
18805   };
18806
18807   /**
18808    * Copies own symbols of `source` to `object`.
18809    *
18810    * @private
18811    * @param {Object} source The object to copy symbols from.
18812    * @param {Object} [object={}] The object to copy symbols to.
18813    * @returns {Object} Returns `object`.
18814    */
18815   function copySymbols(source, object) {
18816     return copyObject(source, getSymbols(source), object);
18817   }
18818
18819   /**
18820    * Appends the elements of `values` to `array`.
18821    *
18822    * @private
18823    * @param {Array} array The array to modify.
18824    * @param {Array} values The values to append.
18825    * @returns {Array} Returns `array`.
18826    */
18827   function arrayPush(array, values) {
18828     var index = -1,
18829         length = values.length,
18830         offset = array.length;
18831
18832     while (++index < length) {
18833       array[offset + index] = values[index];
18834     }
18835     return array;
18836   }
18837
18838   /** Built-in value references. */
18839   var getPrototype = overArg(Object.getPrototypeOf, Object);
18840
18841   /* Built-in method references for those with the same name as other `lodash` methods. */
18842   var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18843
18844   /**
18845    * Creates an array of the own and inherited enumerable symbols of `object`.
18846    *
18847    * @private
18848    * @param {Object} object The object to query.
18849    * @returns {Array} Returns the array of symbols.
18850    */
18851   var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18852     var result = [];
18853     while (object) {
18854       arrayPush(result, getSymbols(object));
18855       object = getPrototype(object);
18856     }
18857     return result;
18858   };
18859
18860   /**
18861    * Copies own and inherited symbols of `source` to `object`.
18862    *
18863    * @private
18864    * @param {Object} source The object to copy symbols from.
18865    * @param {Object} [object={}] The object to copy symbols to.
18866    * @returns {Object} Returns `object`.
18867    */
18868   function copySymbolsIn(source, object) {
18869     return copyObject(source, getSymbolsIn(source), object);
18870   }
18871
18872   /**
18873    * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18874    * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18875    * symbols of `object`.
18876    *
18877    * @private
18878    * @param {Object} object The object to query.
18879    * @param {Function} keysFunc The function to get the keys of `object`.
18880    * @param {Function} symbolsFunc The function to get the symbols of `object`.
18881    * @returns {Array} Returns the array of property names and symbols.
18882    */
18883   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18884     var result = keysFunc(object);
18885     return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18886   }
18887
18888   /**
18889    * Creates an array of own enumerable property names and symbols of `object`.
18890    *
18891    * @private
18892    * @param {Object} object The object to query.
18893    * @returns {Array} Returns the array of property names and symbols.
18894    */
18895   function getAllKeys(object) {
18896     return baseGetAllKeys(object, keys$1, getSymbols);
18897   }
18898
18899   /**
18900    * Creates an array of own and inherited enumerable property names and
18901    * symbols of `object`.
18902    *
18903    * @private
18904    * @param {Object} object The object to query.
18905    * @returns {Array} Returns the array of property names and symbols.
18906    */
18907   function getAllKeysIn(object) {
18908     return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18909   }
18910
18911   /* Built-in method references that are verified to be native. */
18912   var DataView = getNative(root$2, 'DataView');
18913
18914   /* Built-in method references that are verified to be native. */
18915   var Promise = getNative(root$2, 'Promise');
18916
18917   /* Built-in method references that are verified to be native. */
18918   var Set$1 = getNative(root$2, 'Set');
18919
18920   /* Built-in method references that are verified to be native. */
18921   var WeakMap = getNative(root$2, 'WeakMap');
18922
18923   /** `Object#toString` result references. */
18924   var mapTag$1 = '[object Map]',
18925       objectTag$1 = '[object Object]',
18926       promiseTag = '[object Promise]',
18927       setTag$1 = '[object Set]',
18928       weakMapTag$1 = '[object WeakMap]';
18929
18930   var dataViewTag$1 = '[object DataView]';
18931
18932   /** Used to detect maps, sets, and weakmaps. */
18933   var dataViewCtorString = toSource(DataView),
18934       mapCtorString = toSource(Map$1),
18935       promiseCtorString = toSource(Promise),
18936       setCtorString = toSource(Set$1),
18937       weakMapCtorString = toSource(WeakMap);
18938
18939   /**
18940    * Gets the `toStringTag` of `value`.
18941    *
18942    * @private
18943    * @param {*} value The value to query.
18944    * @returns {string} Returns the `toStringTag`.
18945    */
18946   var getTag = baseGetTag;
18947
18948   // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18949   if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18950       (Map$1 && getTag(new Map$1) != mapTag$1) ||
18951       (Promise && getTag(Promise.resolve()) != promiseTag) ||
18952       (Set$1 && getTag(new Set$1) != setTag$1) ||
18953       (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18954     getTag = function(value) {
18955       var result = baseGetTag(value),
18956           Ctor = result == objectTag$1 ? value.constructor : undefined,
18957           ctorString = Ctor ? toSource(Ctor) : '';
18958
18959       if (ctorString) {
18960         switch (ctorString) {
18961           case dataViewCtorString: return dataViewTag$1;
18962           case mapCtorString: return mapTag$1;
18963           case promiseCtorString: return promiseTag;
18964           case setCtorString: return setTag$1;
18965           case weakMapCtorString: return weakMapTag$1;
18966         }
18967       }
18968       return result;
18969     };
18970   }
18971
18972   var getTag$1 = getTag;
18973
18974   /** Used for built-in method references. */
18975   var objectProto$c = Object.prototype;
18976
18977   /** Used to check objects for own properties. */
18978   var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18979
18980   /**
18981    * Initializes an array clone.
18982    *
18983    * @private
18984    * @param {Array} array The array to clone.
18985    * @returns {Array} Returns the initialized clone.
18986    */
18987   function initCloneArray(array) {
18988     var length = array.length,
18989         result = new array.constructor(length);
18990
18991     // Add properties assigned by `RegExp#exec`.
18992     if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18993       result.index = array.index;
18994       result.input = array.input;
18995     }
18996     return result;
18997   }
18998
18999   /** Built-in value references. */
19000   var Uint8Array$1 = root$2.Uint8Array;
19001
19002   /**
19003    * Creates a clone of `arrayBuffer`.
19004    *
19005    * @private
19006    * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19007    * @returns {ArrayBuffer} Returns the cloned array buffer.
19008    */
19009   function cloneArrayBuffer(arrayBuffer) {
19010     var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19011     new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
19012     return result;
19013   }
19014
19015   /**
19016    * Creates a clone of `dataView`.
19017    *
19018    * @private
19019    * @param {Object} dataView The data view to clone.
19020    * @param {boolean} [isDeep] Specify a deep clone.
19021    * @returns {Object} Returns the cloned data view.
19022    */
19023   function cloneDataView(dataView, isDeep) {
19024     var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19025     return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19026   }
19027
19028   /** Used to match `RegExp` flags from their coerced string values. */
19029   var reFlags = /\w*$/;
19030
19031   /**
19032    * Creates a clone of `regexp`.
19033    *
19034    * @private
19035    * @param {Object} regexp The regexp to clone.
19036    * @returns {Object} Returns the cloned regexp.
19037    */
19038   function cloneRegExp(regexp) {
19039     var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19040     result.lastIndex = regexp.lastIndex;
19041     return result;
19042   }
19043
19044   /** Used to convert symbols to primitives and strings. */
19045   var symbolProto = Symbol ? Symbol.prototype : undefined,
19046       symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19047
19048   /**
19049    * Creates a clone of the `symbol` object.
19050    *
19051    * @private
19052    * @param {Object} symbol The symbol object to clone.
19053    * @returns {Object} Returns the cloned symbol object.
19054    */
19055   function cloneSymbol(symbol) {
19056     return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19057   }
19058
19059   /**
19060    * Creates a clone of `typedArray`.
19061    *
19062    * @private
19063    * @param {Object} typedArray The typed array to clone.
19064    * @param {boolean} [isDeep] Specify a deep clone.
19065    * @returns {Object} Returns the cloned typed array.
19066    */
19067   function cloneTypedArray(typedArray, isDeep) {
19068     var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19069     return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19070   }
19071
19072   /** `Object#toString` result references. */
19073   var boolTag$1 = '[object Boolean]',
19074       dateTag$1 = '[object Date]',
19075       mapTag$2 = '[object Map]',
19076       numberTag$1 = '[object Number]',
19077       regexpTag$1 = '[object RegExp]',
19078       setTag$2 = '[object Set]',
19079       stringTag$1 = '[object String]',
19080       symbolTag = '[object Symbol]';
19081
19082   var arrayBufferTag$1 = '[object ArrayBuffer]',
19083       dataViewTag$2 = '[object DataView]',
19084       float32Tag$1 = '[object Float32Array]',
19085       float64Tag$1 = '[object Float64Array]',
19086       int8Tag$1 = '[object Int8Array]',
19087       int16Tag$1 = '[object Int16Array]',
19088       int32Tag$1 = '[object Int32Array]',
19089       uint8Tag$1 = '[object Uint8Array]',
19090       uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19091       uint16Tag$1 = '[object Uint16Array]',
19092       uint32Tag$1 = '[object Uint32Array]';
19093
19094   /**
19095    * Initializes an object clone based on its `toStringTag`.
19096    *
19097    * **Note:** This function only supports cloning values with tags of
19098    * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19099    *
19100    * @private
19101    * @param {Object} object The object to clone.
19102    * @param {string} tag The `toStringTag` of the object to clone.
19103    * @param {boolean} [isDeep] Specify a deep clone.
19104    * @returns {Object} Returns the initialized clone.
19105    */
19106   function initCloneByTag(object, tag, isDeep) {
19107     var Ctor = object.constructor;
19108     switch (tag) {
19109       case arrayBufferTag$1:
19110         return cloneArrayBuffer(object);
19111
19112       case boolTag$1:
19113       case dateTag$1:
19114         return new Ctor(+object);
19115
19116       case dataViewTag$2:
19117         return cloneDataView(object, isDeep);
19118
19119       case float32Tag$1: case float64Tag$1:
19120       case int8Tag$1: case int16Tag$1: case int32Tag$1:
19121       case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19122         return cloneTypedArray(object, isDeep);
19123
19124       case mapTag$2:
19125         return new Ctor;
19126
19127       case numberTag$1:
19128       case stringTag$1:
19129         return new Ctor(object);
19130
19131       case regexpTag$1:
19132         return cloneRegExp(object);
19133
19134       case setTag$2:
19135         return new Ctor;
19136
19137       case symbolTag:
19138         return cloneSymbol(object);
19139     }
19140   }
19141
19142   /** Built-in value references. */
19143   var objectCreate = Object.create;
19144
19145   /**
19146    * The base implementation of `_.create` without support for assigning
19147    * properties to the created object.
19148    *
19149    * @private
19150    * @param {Object} proto The object to inherit from.
19151    * @returns {Object} Returns the new object.
19152    */
19153   var baseCreate = (function() {
19154     function object() {}
19155     return function(proto) {
19156       if (!isObject(proto)) {
19157         return {};
19158       }
19159       if (objectCreate) {
19160         return objectCreate(proto);
19161       }
19162       object.prototype = proto;
19163       var result = new object;
19164       object.prototype = undefined;
19165       return result;
19166     };
19167   }());
19168
19169   /**
19170    * Initializes an object clone.
19171    *
19172    * @private
19173    * @param {Object} object The object to clone.
19174    * @returns {Object} Returns the initialized clone.
19175    */
19176   function initCloneObject(object) {
19177     return (typeof object.constructor == 'function' && !isPrototype(object))
19178       ? baseCreate(getPrototype(object))
19179       : {};
19180   }
19181
19182   /** `Object#toString` result references. */
19183   var mapTag$3 = '[object Map]';
19184
19185   /**
19186    * The base implementation of `_.isMap` without Node.js optimizations.
19187    *
19188    * @private
19189    * @param {*} value The value to check.
19190    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19191    */
19192   function baseIsMap(value) {
19193     return isObjectLike(value) && getTag$1(value) == mapTag$3;
19194   }
19195
19196   /* Node.js helper references. */
19197   var nodeIsMap = nodeUtil && nodeUtil.isMap;
19198
19199   /**
19200    * Checks if `value` is classified as a `Map` object.
19201    *
19202    * @static
19203    * @memberOf _
19204    * @since 4.3.0
19205    * @category Lang
19206    * @param {*} value The value to check.
19207    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19208    * @example
19209    *
19210    * _.isMap(new Map);
19211    * // => true
19212    *
19213    * _.isMap(new WeakMap);
19214    * // => false
19215    */
19216   var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19217
19218   /** `Object#toString` result references. */
19219   var setTag$3 = '[object Set]';
19220
19221   /**
19222    * The base implementation of `_.isSet` without Node.js optimizations.
19223    *
19224    * @private
19225    * @param {*} value The value to check.
19226    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19227    */
19228   function baseIsSet(value) {
19229     return isObjectLike(value) && getTag$1(value) == setTag$3;
19230   }
19231
19232   /* Node.js helper references. */
19233   var nodeIsSet = nodeUtil && nodeUtil.isSet;
19234
19235   /**
19236    * Checks if `value` is classified as a `Set` object.
19237    *
19238    * @static
19239    * @memberOf _
19240    * @since 4.3.0
19241    * @category Lang
19242    * @param {*} value The value to check.
19243    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19244    * @example
19245    *
19246    * _.isSet(new Set);
19247    * // => true
19248    *
19249    * _.isSet(new WeakSet);
19250    * // => false
19251    */
19252   var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19253
19254   /** Used to compose bitmasks for cloning. */
19255   var CLONE_DEEP_FLAG = 1,
19256       CLONE_FLAT_FLAG = 2,
19257       CLONE_SYMBOLS_FLAG = 4;
19258
19259   /** `Object#toString` result references. */
19260   var argsTag$2 = '[object Arguments]',
19261       arrayTag$1 = '[object Array]',
19262       boolTag$2 = '[object Boolean]',
19263       dateTag$2 = '[object Date]',
19264       errorTag$1 = '[object Error]',
19265       funcTag$2 = '[object Function]',
19266       genTag$1 = '[object GeneratorFunction]',
19267       mapTag$4 = '[object Map]',
19268       numberTag$2 = '[object Number]',
19269       objectTag$2 = '[object Object]',
19270       regexpTag$2 = '[object RegExp]',
19271       setTag$4 = '[object Set]',
19272       stringTag$2 = '[object String]',
19273       symbolTag$1 = '[object Symbol]',
19274       weakMapTag$2 = '[object WeakMap]';
19275
19276   var arrayBufferTag$2 = '[object ArrayBuffer]',
19277       dataViewTag$3 = '[object DataView]',
19278       float32Tag$2 = '[object Float32Array]',
19279       float64Tag$2 = '[object Float64Array]',
19280       int8Tag$2 = '[object Int8Array]',
19281       int16Tag$2 = '[object Int16Array]',
19282       int32Tag$2 = '[object Int32Array]',
19283       uint8Tag$2 = '[object Uint8Array]',
19284       uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19285       uint16Tag$2 = '[object Uint16Array]',
19286       uint32Tag$2 = '[object Uint32Array]';
19287
19288   /** Used to identify `toStringTag` values supported by `_.clone`. */
19289   var cloneableTags = {};
19290   cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19291   cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19292   cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19293   cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19294   cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19295   cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19296   cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19297   cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19298   cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19299   cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19300   cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19301   cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19302   cloneableTags[weakMapTag$2] = false;
19303
19304   /**
19305    * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19306    * traversed objects.
19307    *
19308    * @private
19309    * @param {*} value The value to clone.
19310    * @param {boolean} bitmask The bitmask flags.
19311    *  1 - Deep clone
19312    *  2 - Flatten inherited properties
19313    *  4 - Clone symbols
19314    * @param {Function} [customizer] The function to customize cloning.
19315    * @param {string} [key] The key of `value`.
19316    * @param {Object} [object] The parent object of `value`.
19317    * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19318    * @returns {*} Returns the cloned value.
19319    */
19320   function baseClone(value, bitmask, customizer, key, object, stack) {
19321     var result,
19322         isDeep = bitmask & CLONE_DEEP_FLAG,
19323         isFlat = bitmask & CLONE_FLAT_FLAG,
19324         isFull = bitmask & CLONE_SYMBOLS_FLAG;
19325
19326     if (customizer) {
19327       result = object ? customizer(value, key, object, stack) : customizer(value);
19328     }
19329     if (result !== undefined) {
19330       return result;
19331     }
19332     if (!isObject(value)) {
19333       return value;
19334     }
19335     var isArr = isArray(value);
19336     if (isArr) {
19337       result = initCloneArray(value);
19338       if (!isDeep) {
19339         return copyArray(value, result);
19340       }
19341     } else {
19342       var tag = getTag$1(value),
19343           isFunc = tag == funcTag$2 || tag == genTag$1;
19344
19345       if (isBuffer(value)) {
19346         return cloneBuffer(value, isDeep);
19347       }
19348       if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19349         result = (isFlat || isFunc) ? {} : initCloneObject(value);
19350         if (!isDeep) {
19351           return isFlat
19352             ? copySymbolsIn(value, baseAssignIn(result, value))
19353             : copySymbols(value, baseAssign(result, value));
19354         }
19355       } else {
19356         if (!cloneableTags[tag]) {
19357           return object ? value : {};
19358         }
19359         result = initCloneByTag(value, tag, isDeep);
19360       }
19361     }
19362     // Check for circular references and return its corresponding clone.
19363     stack || (stack = new Stack);
19364     var stacked = stack.get(value);
19365     if (stacked) {
19366       return stacked;
19367     }
19368     stack.set(value, result);
19369
19370     if (isSet(value)) {
19371       value.forEach(function(subValue) {
19372         result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19373       });
19374
19375       return result;
19376     }
19377
19378     if (isMap(value)) {
19379       value.forEach(function(subValue, key) {
19380         result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19381       });
19382
19383       return result;
19384     }
19385
19386     var keysFunc = isFull
19387       ? (isFlat ? getAllKeysIn : getAllKeys)
19388       : (isFlat ? keysIn : keys$1);
19389
19390     var props = isArr ? undefined : keysFunc(value);
19391     arrayEach(props || value, function(subValue, key) {
19392       if (props) {
19393         key = subValue;
19394         subValue = value[key];
19395       }
19396       // Recursively populate clone (susceptible to call stack limits).
19397       assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19398     });
19399     return result;
19400   }
19401
19402   /** Used to compose bitmasks for cloning. */
19403   var CLONE_SYMBOLS_FLAG$1 = 4;
19404
19405   /**
19406    * Creates a shallow clone of `value`.
19407    *
19408    * **Note:** This method is loosely based on the
19409    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19410    * and supports cloning arrays, array buffers, booleans, date objects, maps,
19411    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19412    * arrays. The own enumerable properties of `arguments` objects are cloned
19413    * as plain objects. An empty object is returned for uncloneable values such
19414    * as error objects, functions, DOM nodes, and WeakMaps.
19415    *
19416    * @static
19417    * @memberOf _
19418    * @since 0.1.0
19419    * @category Lang
19420    * @param {*} value The value to clone.
19421    * @returns {*} Returns the cloned value.
19422    * @see _.cloneDeep
19423    * @example
19424    *
19425    * var objects = [{ 'a': 1 }, { 'b': 2 }];
19426    *
19427    * var shallow = _.clone(objects);
19428    * console.log(shallow[0] === objects[0]);
19429    * // => true
19430    */
19431   function clone(value) {
19432     return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19433   }
19434
19435   /**
19436    * A specialized version of `baseAggregator` for arrays.
19437    *
19438    * @private
19439    * @param {Array} [array] The array to iterate over.
19440    * @param {Function} setter The function to set `accumulator` values.
19441    * @param {Function} iteratee The iteratee to transform keys.
19442    * @param {Object} accumulator The initial aggregated object.
19443    * @returns {Function} Returns `accumulator`.
19444    */
19445   function arrayAggregator(array, setter, iteratee, accumulator) {
19446     var index = -1,
19447         length = array == null ? 0 : array.length;
19448
19449     while (++index < length) {
19450       var value = array[index];
19451       setter(accumulator, value, iteratee(value), array);
19452     }
19453     return accumulator;
19454   }
19455
19456   /**
19457    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19458    *
19459    * @private
19460    * @param {boolean} [fromRight] Specify iterating from right to left.
19461    * @returns {Function} Returns the new base function.
19462    */
19463   function createBaseFor(fromRight) {
19464     return function(object, iteratee, keysFunc) {
19465       var index = -1,
19466           iterable = Object(object),
19467           props = keysFunc(object),
19468           length = props.length;
19469
19470       while (length--) {
19471         var key = props[fromRight ? length : ++index];
19472         if (iteratee(iterable[key], key, iterable) === false) {
19473           break;
19474         }
19475       }
19476       return object;
19477     };
19478   }
19479
19480   /**
19481    * The base implementation of `baseForOwn` which iterates over `object`
19482    * properties returned by `keysFunc` and invokes `iteratee` for each property.
19483    * Iteratee functions may exit iteration early by explicitly returning `false`.
19484    *
19485    * @private
19486    * @param {Object} object The object to iterate over.
19487    * @param {Function} iteratee The function invoked per iteration.
19488    * @param {Function} keysFunc The function to get the keys of `object`.
19489    * @returns {Object} Returns `object`.
19490    */
19491   var baseFor = createBaseFor();
19492
19493   /**
19494    * The base implementation of `_.forOwn` without support for iteratee shorthands.
19495    *
19496    * @private
19497    * @param {Object} object The object to iterate over.
19498    * @param {Function} iteratee The function invoked per iteration.
19499    * @returns {Object} Returns `object`.
19500    */
19501   function baseForOwn(object, iteratee) {
19502     return object && baseFor(object, iteratee, keys$1);
19503   }
19504
19505   /**
19506    * Creates a `baseEach` or `baseEachRight` function.
19507    *
19508    * @private
19509    * @param {Function} eachFunc The function to iterate over a collection.
19510    * @param {boolean} [fromRight] Specify iterating from right to left.
19511    * @returns {Function} Returns the new base function.
19512    */
19513   function createBaseEach(eachFunc, fromRight) {
19514     return function(collection, iteratee) {
19515       if (collection == null) {
19516         return collection;
19517       }
19518       if (!isArrayLike(collection)) {
19519         return eachFunc(collection, iteratee);
19520       }
19521       var length = collection.length,
19522           index = fromRight ? length : -1,
19523           iterable = Object(collection);
19524
19525       while ((fromRight ? index-- : ++index < length)) {
19526         if (iteratee(iterable[index], index, iterable) === false) {
19527           break;
19528         }
19529       }
19530       return collection;
19531     };
19532   }
19533
19534   /**
19535    * The base implementation of `_.forEach` without support for iteratee shorthands.
19536    *
19537    * @private
19538    * @param {Array|Object} collection The collection to iterate over.
19539    * @param {Function} iteratee The function invoked per iteration.
19540    * @returns {Array|Object} Returns `collection`.
19541    */
19542   var baseEach = createBaseEach(baseForOwn);
19543
19544   /**
19545    * Aggregates elements of `collection` on `accumulator` with keys transformed
19546    * by `iteratee` and values set by `setter`.
19547    *
19548    * @private
19549    * @param {Array|Object} collection The collection to iterate over.
19550    * @param {Function} setter The function to set `accumulator` values.
19551    * @param {Function} iteratee The iteratee to transform keys.
19552    * @param {Object} accumulator The initial aggregated object.
19553    * @returns {Function} Returns `accumulator`.
19554    */
19555   function baseAggregator(collection, setter, iteratee, accumulator) {
19556     baseEach(collection, function(value, key, collection) {
19557       setter(accumulator, value, iteratee(value), collection);
19558     });
19559     return accumulator;
19560   }
19561
19562   /** Used to stand-in for `undefined` hash values. */
19563   var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19564
19565   /**
19566    * Adds `value` to the array cache.
19567    *
19568    * @private
19569    * @name add
19570    * @memberOf SetCache
19571    * @alias push
19572    * @param {*} value The value to cache.
19573    * @returns {Object} Returns the cache instance.
19574    */
19575   function setCacheAdd(value) {
19576     this.__data__.set(value, HASH_UNDEFINED$2);
19577     return this;
19578   }
19579
19580   /**
19581    * Checks if `value` is in the array cache.
19582    *
19583    * @private
19584    * @name has
19585    * @memberOf SetCache
19586    * @param {*} value The value to search for.
19587    * @returns {number} Returns `true` if `value` is found, else `false`.
19588    */
19589   function setCacheHas(value) {
19590     return this.__data__.has(value);
19591   }
19592
19593   /**
19594    *
19595    * Creates an array cache object to store unique values.
19596    *
19597    * @private
19598    * @constructor
19599    * @param {Array} [values] The values to cache.
19600    */
19601   function SetCache(values) {
19602     var index = -1,
19603         length = values == null ? 0 : values.length;
19604
19605     this.__data__ = new MapCache;
19606     while (++index < length) {
19607       this.add(values[index]);
19608     }
19609   }
19610
19611   // Add methods to `SetCache`.
19612   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19613   SetCache.prototype.has = setCacheHas;
19614
19615   /**
19616    * A specialized version of `_.some` for arrays without support for iteratee
19617    * shorthands.
19618    *
19619    * @private
19620    * @param {Array} [array] The array to iterate over.
19621    * @param {Function} predicate The function invoked per iteration.
19622    * @returns {boolean} Returns `true` if any element passes the predicate check,
19623    *  else `false`.
19624    */
19625   function arraySome(array, predicate) {
19626     var index = -1,
19627         length = array == null ? 0 : array.length;
19628
19629     while (++index < length) {
19630       if (predicate(array[index], index, array)) {
19631         return true;
19632       }
19633     }
19634     return false;
19635   }
19636
19637   /**
19638    * Checks if a `cache` value for `key` exists.
19639    *
19640    * @private
19641    * @param {Object} cache The cache to query.
19642    * @param {string} key The key of the entry to check.
19643    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19644    */
19645   function cacheHas(cache, key) {
19646     return cache.has(key);
19647   }
19648
19649   /** Used to compose bitmasks for value comparisons. */
19650   var COMPARE_PARTIAL_FLAG = 1,
19651       COMPARE_UNORDERED_FLAG = 2;
19652
19653   /**
19654    * A specialized version of `baseIsEqualDeep` for arrays with support for
19655    * partial deep comparisons.
19656    *
19657    * @private
19658    * @param {Array} array The array to compare.
19659    * @param {Array} other The other array to compare.
19660    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19661    * @param {Function} customizer The function to customize comparisons.
19662    * @param {Function} equalFunc The function to determine equivalents of values.
19663    * @param {Object} stack Tracks traversed `array` and `other` objects.
19664    * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19665    */
19666   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19667     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19668         arrLength = array.length,
19669         othLength = other.length;
19670
19671     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19672       return false;
19673     }
19674     // Assume cyclic values are equal.
19675     var stacked = stack.get(array);
19676     if (stacked && stack.get(other)) {
19677       return stacked == other;
19678     }
19679     var index = -1,
19680         result = true,
19681         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19682
19683     stack.set(array, other);
19684     stack.set(other, array);
19685
19686     // Ignore non-index properties.
19687     while (++index < arrLength) {
19688       var arrValue = array[index],
19689           othValue = other[index];
19690
19691       if (customizer) {
19692         var compared = isPartial
19693           ? customizer(othValue, arrValue, index, other, array, stack)
19694           : customizer(arrValue, othValue, index, array, other, stack);
19695       }
19696       if (compared !== undefined) {
19697         if (compared) {
19698           continue;
19699         }
19700         result = false;
19701         break;
19702       }
19703       // Recursively compare arrays (susceptible to call stack limits).
19704       if (seen) {
19705         if (!arraySome(other, function(othValue, othIndex) {
19706               if (!cacheHas(seen, othIndex) &&
19707                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19708                 return seen.push(othIndex);
19709               }
19710             })) {
19711           result = false;
19712           break;
19713         }
19714       } else if (!(
19715             arrValue === othValue ||
19716               equalFunc(arrValue, othValue, bitmask, customizer, stack)
19717           )) {
19718         result = false;
19719         break;
19720       }
19721     }
19722     stack['delete'](array);
19723     stack['delete'](other);
19724     return result;
19725   }
19726
19727   /**
19728    * Converts `map` to its key-value pairs.
19729    *
19730    * @private
19731    * @param {Object} map The map to convert.
19732    * @returns {Array} Returns the key-value pairs.
19733    */
19734   function mapToArray(map) {
19735     var index = -1,
19736         result = Array(map.size);
19737
19738     map.forEach(function(value, key) {
19739       result[++index] = [key, value];
19740     });
19741     return result;
19742   }
19743
19744   /**
19745    * Converts `set` to an array of its values.
19746    *
19747    * @private
19748    * @param {Object} set The set to convert.
19749    * @returns {Array} Returns the values.
19750    */
19751   function setToArray(set) {
19752     var index = -1,
19753         result = Array(set.size);
19754
19755     set.forEach(function(value) {
19756       result[++index] = value;
19757     });
19758     return result;
19759   }
19760
19761   /** Used to compose bitmasks for value comparisons. */
19762   var COMPARE_PARTIAL_FLAG$1 = 1,
19763       COMPARE_UNORDERED_FLAG$1 = 2;
19764
19765   /** `Object#toString` result references. */
19766   var boolTag$3 = '[object Boolean]',
19767       dateTag$3 = '[object Date]',
19768       errorTag$2 = '[object Error]',
19769       mapTag$5 = '[object Map]',
19770       numberTag$3 = '[object Number]',
19771       regexpTag$3 = '[object RegExp]',
19772       setTag$5 = '[object Set]',
19773       stringTag$3 = '[object String]',
19774       symbolTag$2 = '[object Symbol]';
19775
19776   var arrayBufferTag$3 = '[object ArrayBuffer]',
19777       dataViewTag$4 = '[object DataView]';
19778
19779   /** Used to convert symbols to primitives and strings. */
19780   var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19781       symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19782
19783   /**
19784    * A specialized version of `baseIsEqualDeep` for comparing objects of
19785    * the same `toStringTag`.
19786    *
19787    * **Note:** This function only supports comparing values with tags of
19788    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19789    *
19790    * @private
19791    * @param {Object} object The object to compare.
19792    * @param {Object} other The other object to compare.
19793    * @param {string} tag The `toStringTag` of the objects to compare.
19794    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19795    * @param {Function} customizer The function to customize comparisons.
19796    * @param {Function} equalFunc The function to determine equivalents of values.
19797    * @param {Object} stack Tracks traversed `object` and `other` objects.
19798    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19799    */
19800   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19801     switch (tag) {
19802       case dataViewTag$4:
19803         if ((object.byteLength != other.byteLength) ||
19804             (object.byteOffset != other.byteOffset)) {
19805           return false;
19806         }
19807         object = object.buffer;
19808         other = other.buffer;
19809
19810       case arrayBufferTag$3:
19811         if ((object.byteLength != other.byteLength) ||
19812             !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
19813           return false;
19814         }
19815         return true;
19816
19817       case boolTag$3:
19818       case dateTag$3:
19819       case numberTag$3:
19820         // Coerce booleans to `1` or `0` and dates to milliseconds.
19821         // Invalid dates are coerced to `NaN`.
19822         return eq(+object, +other);
19823
19824       case errorTag$2:
19825         return object.name == other.name && object.message == other.message;
19826
19827       case regexpTag$3:
19828       case stringTag$3:
19829         // Coerce regexes to strings and treat strings, primitives and objects,
19830         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19831         // for more details.
19832         return object == (other + '');
19833
19834       case mapTag$5:
19835         var convert = mapToArray;
19836
19837       case setTag$5:
19838         var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19839         convert || (convert = setToArray);
19840
19841         if (object.size != other.size && !isPartial) {
19842           return false;
19843         }
19844         // Assume cyclic values are equal.
19845         var stacked = stack.get(object);
19846         if (stacked) {
19847           return stacked == other;
19848         }
19849         bitmask |= COMPARE_UNORDERED_FLAG$1;
19850
19851         // Recursively compare objects (susceptible to call stack limits).
19852         stack.set(object, other);
19853         var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19854         stack['delete'](object);
19855         return result;
19856
19857       case symbolTag$2:
19858         if (symbolValueOf$1) {
19859           return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19860         }
19861     }
19862     return false;
19863   }
19864
19865   /** Used to compose bitmasks for value comparisons. */
19866   var COMPARE_PARTIAL_FLAG$2 = 1;
19867
19868   /** Used for built-in method references. */
19869   var objectProto$d = Object.prototype;
19870
19871   /** Used to check objects for own properties. */
19872   var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19873
19874   /**
19875    * A specialized version of `baseIsEqualDeep` for objects with support for
19876    * partial deep comparisons.
19877    *
19878    * @private
19879    * @param {Object} object The object to compare.
19880    * @param {Object} other The other object to compare.
19881    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19882    * @param {Function} customizer The function to customize comparisons.
19883    * @param {Function} equalFunc The function to determine equivalents of values.
19884    * @param {Object} stack Tracks traversed `object` and `other` objects.
19885    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19886    */
19887   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19888     var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19889         objProps = getAllKeys(object),
19890         objLength = objProps.length,
19891         othProps = getAllKeys(other),
19892         othLength = othProps.length;
19893
19894     if (objLength != othLength && !isPartial) {
19895       return false;
19896     }
19897     var index = objLength;
19898     while (index--) {
19899       var key = objProps[index];
19900       if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19901         return false;
19902       }
19903     }
19904     // Assume cyclic values are equal.
19905     var stacked = stack.get(object);
19906     if (stacked && stack.get(other)) {
19907       return stacked == other;
19908     }
19909     var result = true;
19910     stack.set(object, other);
19911     stack.set(other, object);
19912
19913     var skipCtor = isPartial;
19914     while (++index < objLength) {
19915       key = objProps[index];
19916       var objValue = object[key],
19917           othValue = other[key];
19918
19919       if (customizer) {
19920         var compared = isPartial
19921           ? customizer(othValue, objValue, key, other, object, stack)
19922           : customizer(objValue, othValue, key, object, other, stack);
19923       }
19924       // Recursively compare objects (susceptible to call stack limits).
19925       if (!(compared === undefined
19926             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19927             : compared
19928           )) {
19929         result = false;
19930         break;
19931       }
19932       skipCtor || (skipCtor = key == 'constructor');
19933     }
19934     if (result && !skipCtor) {
19935       var objCtor = object.constructor,
19936           othCtor = other.constructor;
19937
19938       // Non `Object` object instances with different constructors are not equal.
19939       if (objCtor != othCtor &&
19940           ('constructor' in object && 'constructor' in other) &&
19941           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19942             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19943         result = false;
19944       }
19945     }
19946     stack['delete'](object);
19947     stack['delete'](other);
19948     return result;
19949   }
19950
19951   /** Used to compose bitmasks for value comparisons. */
19952   var COMPARE_PARTIAL_FLAG$3 = 1;
19953
19954   /** `Object#toString` result references. */
19955   var argsTag$3 = '[object Arguments]',
19956       arrayTag$2 = '[object Array]',
19957       objectTag$3 = '[object Object]';
19958
19959   /** Used for built-in method references. */
19960   var objectProto$e = Object.prototype;
19961
19962   /** Used to check objects for own properties. */
19963   var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19964
19965   /**
19966    * A specialized version of `baseIsEqual` for arrays and objects which performs
19967    * deep comparisons and tracks traversed objects enabling objects with circular
19968    * references to be compared.
19969    *
19970    * @private
19971    * @param {Object} object The object to compare.
19972    * @param {Object} other The other object to compare.
19973    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19974    * @param {Function} customizer The function to customize comparisons.
19975    * @param {Function} equalFunc The function to determine equivalents of values.
19976    * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19977    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19978    */
19979   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19980     var objIsArr = isArray(object),
19981         othIsArr = isArray(other),
19982         objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19983         othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19984
19985     objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19986     othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19987
19988     var objIsObj = objTag == objectTag$3,
19989         othIsObj = othTag == objectTag$3,
19990         isSameTag = objTag == othTag;
19991
19992     if (isSameTag && isBuffer(object)) {
19993       if (!isBuffer(other)) {
19994         return false;
19995       }
19996       objIsArr = true;
19997       objIsObj = false;
19998     }
19999     if (isSameTag && !objIsObj) {
20000       stack || (stack = new Stack);
20001       return (objIsArr || isTypedArray(object))
20002         ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20003         : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20004     }
20005     if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20006       var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20007           othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20008
20009       if (objIsWrapped || othIsWrapped) {
20010         var objUnwrapped = objIsWrapped ? object.value() : object,
20011             othUnwrapped = othIsWrapped ? other.value() : other;
20012
20013         stack || (stack = new Stack);
20014         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20015       }
20016     }
20017     if (!isSameTag) {
20018       return false;
20019     }
20020     stack || (stack = new Stack);
20021     return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20022   }
20023
20024   /**
20025    * The base implementation of `_.isEqual` which supports partial comparisons
20026    * and tracks traversed objects.
20027    *
20028    * @private
20029    * @param {*} value The value to compare.
20030    * @param {*} other The other value to compare.
20031    * @param {boolean} bitmask The bitmask flags.
20032    *  1 - Unordered comparison
20033    *  2 - Partial comparison
20034    * @param {Function} [customizer] The function to customize comparisons.
20035    * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20036    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20037    */
20038   function baseIsEqual(value, other, bitmask, customizer, stack) {
20039     if (value === other) {
20040       return true;
20041     }
20042     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20043       return value !== value && other !== other;
20044     }
20045     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20046   }
20047
20048   /** Used to compose bitmasks for value comparisons. */
20049   var COMPARE_PARTIAL_FLAG$4 = 1,
20050       COMPARE_UNORDERED_FLAG$2 = 2;
20051
20052   /**
20053    * The base implementation of `_.isMatch` without support for iteratee shorthands.
20054    *
20055    * @private
20056    * @param {Object} object The object to inspect.
20057    * @param {Object} source The object of property values to match.
20058    * @param {Array} matchData The property names, values, and compare flags to match.
20059    * @param {Function} [customizer] The function to customize comparisons.
20060    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20061    */
20062   function baseIsMatch(object, source, matchData, customizer) {
20063     var index = matchData.length,
20064         length = index,
20065         noCustomizer = !customizer;
20066
20067     if (object == null) {
20068       return !length;
20069     }
20070     object = Object(object);
20071     while (index--) {
20072       var data = matchData[index];
20073       if ((noCustomizer && data[2])
20074             ? data[1] !== object[data[0]]
20075             : !(data[0] in object)
20076           ) {
20077         return false;
20078       }
20079     }
20080     while (++index < length) {
20081       data = matchData[index];
20082       var key = data[0],
20083           objValue = object[key],
20084           srcValue = data[1];
20085
20086       if (noCustomizer && data[2]) {
20087         if (objValue === undefined && !(key in object)) {
20088           return false;
20089         }
20090       } else {
20091         var stack = new Stack;
20092         if (customizer) {
20093           var result = customizer(objValue, srcValue, key, object, source, stack);
20094         }
20095         if (!(result === undefined
20096               ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20097               : result
20098             )) {
20099           return false;
20100         }
20101       }
20102     }
20103     return true;
20104   }
20105
20106   /**
20107    * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20108    *
20109    * @private
20110    * @param {*} value The value to check.
20111    * @returns {boolean} Returns `true` if `value` if suitable for strict
20112    *  equality comparisons, else `false`.
20113    */
20114   function isStrictComparable(value) {
20115     return value === value && !isObject(value);
20116   }
20117
20118   /**
20119    * Gets the property names, values, and compare flags of `object`.
20120    *
20121    * @private
20122    * @param {Object} object The object to query.
20123    * @returns {Array} Returns the match data of `object`.
20124    */
20125   function getMatchData(object) {
20126     var result = keys$1(object),
20127         length = result.length;
20128
20129     while (length--) {
20130       var key = result[length],
20131           value = object[key];
20132
20133       result[length] = [key, value, isStrictComparable(value)];
20134     }
20135     return result;
20136   }
20137
20138   /**
20139    * A specialized version of `matchesProperty` for source values suitable
20140    * for strict equality comparisons, i.e. `===`.
20141    *
20142    * @private
20143    * @param {string} key The key of the property to get.
20144    * @param {*} srcValue The value to match.
20145    * @returns {Function} Returns the new spec function.
20146    */
20147   function matchesStrictComparable(key, srcValue) {
20148     return function(object) {
20149       if (object == null) {
20150         return false;
20151       }
20152       return object[key] === srcValue &&
20153         (srcValue !== undefined || (key in Object(object)));
20154     };
20155   }
20156
20157   /**
20158    * The base implementation of `_.matches` which doesn't clone `source`.
20159    *
20160    * @private
20161    * @param {Object} source The object of property values to match.
20162    * @returns {Function} Returns the new spec function.
20163    */
20164   function baseMatches(source) {
20165     var matchData = getMatchData(source);
20166     if (matchData.length == 1 && matchData[0][2]) {
20167       return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20168     }
20169     return function(object) {
20170       return object === source || baseIsMatch(object, source, matchData);
20171     };
20172   }
20173
20174   /** `Object#toString` result references. */
20175   var symbolTag$3 = '[object Symbol]';
20176
20177   /**
20178    * Checks if `value` is classified as a `Symbol` primitive or object.
20179    *
20180    * @static
20181    * @memberOf _
20182    * @since 4.0.0
20183    * @category Lang
20184    * @param {*} value The value to check.
20185    * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20186    * @example
20187    *
20188    * _.isSymbol(Symbol.iterator);
20189    * // => true
20190    *
20191    * _.isSymbol('abc');
20192    * // => false
20193    */
20194   function isSymbol(value) {
20195     return typeof value == 'symbol' ||
20196       (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20197   }
20198
20199   /** Used to match property names within property paths. */
20200   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20201       reIsPlainProp = /^\w*$/;
20202
20203   /**
20204    * Checks if `value` is a property name and not a property path.
20205    *
20206    * @private
20207    * @param {*} value The value to check.
20208    * @param {Object} [object] The object to query keys on.
20209    * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20210    */
20211   function isKey(value, object) {
20212     if (isArray(value)) {
20213       return false;
20214     }
20215     var type = typeof value;
20216     if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20217         value == null || isSymbol(value)) {
20218       return true;
20219     }
20220     return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20221       (object != null && value in Object(object));
20222   }
20223
20224   /** Error message constants. */
20225   var FUNC_ERROR_TEXT = 'Expected a function';
20226
20227   /**
20228    * Creates a function that memoizes the result of `func`. If `resolver` is
20229    * provided, it determines the cache key for storing the result based on the
20230    * arguments provided to the memoized function. By default, the first argument
20231    * provided to the memoized function is used as the map cache key. The `func`
20232    * is invoked with the `this` binding of the memoized function.
20233    *
20234    * **Note:** The cache is exposed as the `cache` property on the memoized
20235    * function. Its creation may be customized by replacing the `_.memoize.Cache`
20236    * constructor with one whose instances implement the
20237    * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20238    * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20239    *
20240    * @static
20241    * @memberOf _
20242    * @since 0.1.0
20243    * @category Function
20244    * @param {Function} func The function to have its output memoized.
20245    * @param {Function} [resolver] The function to resolve the cache key.
20246    * @returns {Function} Returns the new memoized function.
20247    * @example
20248    *
20249    * var object = { 'a': 1, 'b': 2 };
20250    * var other = { 'c': 3, 'd': 4 };
20251    *
20252    * var values = _.memoize(_.values);
20253    * values(object);
20254    * // => [1, 2]
20255    *
20256    * values(other);
20257    * // => [3, 4]
20258    *
20259    * object.a = 2;
20260    * values(object);
20261    * // => [1, 2]
20262    *
20263    * // Modify the result cache.
20264    * values.cache.set(object, ['a', 'b']);
20265    * values(object);
20266    * // => ['a', 'b']
20267    *
20268    * // Replace `_.memoize.Cache`.
20269    * _.memoize.Cache = WeakMap;
20270    */
20271   function memoize(func, resolver) {
20272     if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20273       throw new TypeError(FUNC_ERROR_TEXT);
20274     }
20275     var memoized = function() {
20276       var args = arguments,
20277           key = resolver ? resolver.apply(this, args) : args[0],
20278           cache = memoized.cache;
20279
20280       if (cache.has(key)) {
20281         return cache.get(key);
20282       }
20283       var result = func.apply(this, args);
20284       memoized.cache = cache.set(key, result) || cache;
20285       return result;
20286     };
20287     memoized.cache = new (memoize.Cache || MapCache);
20288     return memoized;
20289   }
20290
20291   // Expose `MapCache`.
20292   memoize.Cache = MapCache;
20293
20294   /** Used as the maximum memoize cache size. */
20295   var MAX_MEMOIZE_SIZE = 500;
20296
20297   /**
20298    * A specialized version of `_.memoize` which clears the memoized function's
20299    * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20300    *
20301    * @private
20302    * @param {Function} func The function to have its output memoized.
20303    * @returns {Function} Returns the new memoized function.
20304    */
20305   function memoizeCapped(func) {
20306     var result = memoize(func, function(key) {
20307       if (cache.size === MAX_MEMOIZE_SIZE) {
20308         cache.clear();
20309       }
20310       return key;
20311     });
20312
20313     var cache = result.cache;
20314     return result;
20315   }
20316
20317   /** Used to match property names within property paths. */
20318   var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20319
20320   /** Used to match backslashes in property paths. */
20321   var reEscapeChar = /\\(\\)?/g;
20322
20323   /**
20324    * Converts `string` to a property path array.
20325    *
20326    * @private
20327    * @param {string} string The string to convert.
20328    * @returns {Array} Returns the property path array.
20329    */
20330   var stringToPath = memoizeCapped(function(string) {
20331     var result = [];
20332     if (string.charCodeAt(0) === 46 /* . */) {
20333       result.push('');
20334     }
20335     string.replace(rePropName, function(match, number, quote, subString) {
20336       result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20337     });
20338     return result;
20339   });
20340
20341   /**
20342    * A specialized version of `_.map` for arrays without support for iteratee
20343    * shorthands.
20344    *
20345    * @private
20346    * @param {Array} [array] The array to iterate over.
20347    * @param {Function} iteratee The function invoked per iteration.
20348    * @returns {Array} Returns the new mapped array.
20349    */
20350   function arrayMap(array, iteratee) {
20351     var index = -1,
20352         length = array == null ? 0 : array.length,
20353         result = Array(length);
20354
20355     while (++index < length) {
20356       result[index] = iteratee(array[index], index, array);
20357     }
20358     return result;
20359   }
20360
20361   /** Used as references for various `Number` constants. */
20362   var INFINITY = 1 / 0;
20363
20364   /** Used to convert symbols to primitives and strings. */
20365   var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20366       symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20367
20368   /**
20369    * The base implementation of `_.toString` which doesn't convert nullish
20370    * values to empty strings.
20371    *
20372    * @private
20373    * @param {*} value The value to process.
20374    * @returns {string} Returns the string.
20375    */
20376   function baseToString(value) {
20377     // Exit early for strings to avoid a performance hit in some environments.
20378     if (typeof value == 'string') {
20379       return value;
20380     }
20381     if (isArray(value)) {
20382       // Recursively convert values (susceptible to call stack limits).
20383       return arrayMap(value, baseToString) + '';
20384     }
20385     if (isSymbol(value)) {
20386       return symbolToString ? symbolToString.call(value) : '';
20387     }
20388     var result = (value + '');
20389     return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20390   }
20391
20392   /**
20393    * Converts `value` to a string. An empty string is returned for `null`
20394    * and `undefined` values. The sign of `-0` is preserved.
20395    *
20396    * @static
20397    * @memberOf _
20398    * @since 4.0.0
20399    * @category Lang
20400    * @param {*} value The value to convert.
20401    * @returns {string} Returns the converted string.
20402    * @example
20403    *
20404    * _.toString(null);
20405    * // => ''
20406    *
20407    * _.toString(-0);
20408    * // => '-0'
20409    *
20410    * _.toString([1, 2, 3]);
20411    * // => '1,2,3'
20412    */
20413   function toString(value) {
20414     return value == null ? '' : baseToString(value);
20415   }
20416
20417   /**
20418    * Casts `value` to a path array if it's not one.
20419    *
20420    * @private
20421    * @param {*} value The value to inspect.
20422    * @param {Object} [object] The object to query keys on.
20423    * @returns {Array} Returns the cast property path array.
20424    */
20425   function castPath(value, object) {
20426     if (isArray(value)) {
20427       return value;
20428     }
20429     return isKey(value, object) ? [value] : stringToPath(toString(value));
20430   }
20431
20432   /** Used as references for various `Number` constants. */
20433   var INFINITY$1 = 1 / 0;
20434
20435   /**
20436    * Converts `value` to a string key if it's not a string or symbol.
20437    *
20438    * @private
20439    * @param {*} value The value to inspect.
20440    * @returns {string|symbol} Returns the key.
20441    */
20442   function toKey(value) {
20443     if (typeof value == 'string' || isSymbol(value)) {
20444       return value;
20445     }
20446     var result = (value + '');
20447     return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20448   }
20449
20450   /**
20451    * The base implementation of `_.get` without support for default values.
20452    *
20453    * @private
20454    * @param {Object} object The object to query.
20455    * @param {Array|string} path The path of the property to get.
20456    * @returns {*} Returns the resolved value.
20457    */
20458   function baseGet(object, path) {
20459     path = castPath(path, object);
20460
20461     var index = 0,
20462         length = path.length;
20463
20464     while (object != null && index < length) {
20465       object = object[toKey(path[index++])];
20466     }
20467     return (index && index == length) ? object : undefined;
20468   }
20469
20470   /**
20471    * Gets the value at `path` of `object`. If the resolved value is
20472    * `undefined`, the `defaultValue` is returned in its place.
20473    *
20474    * @static
20475    * @memberOf _
20476    * @since 3.7.0
20477    * @category Object
20478    * @param {Object} object The object to query.
20479    * @param {Array|string} path The path of the property to get.
20480    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20481    * @returns {*} Returns the resolved value.
20482    * @example
20483    *
20484    * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20485    *
20486    * _.get(object, 'a[0].b.c');
20487    * // => 3
20488    *
20489    * _.get(object, ['a', '0', 'b', 'c']);
20490    * // => 3
20491    *
20492    * _.get(object, 'a.b.c', 'default');
20493    * // => 'default'
20494    */
20495   function get$2(object, path, defaultValue) {
20496     var result = object == null ? undefined : baseGet(object, path);
20497     return result === undefined ? defaultValue : result;
20498   }
20499
20500   /**
20501    * The base implementation of `_.hasIn` without support for deep paths.
20502    *
20503    * @private
20504    * @param {Object} [object] The object to query.
20505    * @param {Array|string} key The key to check.
20506    * @returns {boolean} Returns `true` if `key` exists, else `false`.
20507    */
20508   function baseHasIn(object, key) {
20509     return object != null && key in Object(object);
20510   }
20511
20512   /**
20513    * Checks if `path` exists on `object`.
20514    *
20515    * @private
20516    * @param {Object} object The object to query.
20517    * @param {Array|string} path The path to check.
20518    * @param {Function} hasFunc The function to check properties.
20519    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20520    */
20521   function hasPath(object, path, hasFunc) {
20522     path = castPath(path, object);
20523
20524     var index = -1,
20525         length = path.length,
20526         result = false;
20527
20528     while (++index < length) {
20529       var key = toKey(path[index]);
20530       if (!(result = object != null && hasFunc(object, key))) {
20531         break;
20532       }
20533       object = object[key];
20534     }
20535     if (result || ++index != length) {
20536       return result;
20537     }
20538     length = object == null ? 0 : object.length;
20539     return !!length && isLength(length) && isIndex(key, length) &&
20540       (isArray(object) || isArguments(object));
20541   }
20542
20543   /**
20544    * Checks if `path` is a direct or inherited property of `object`.
20545    *
20546    * @static
20547    * @memberOf _
20548    * @since 4.0.0
20549    * @category Object
20550    * @param {Object} object The object to query.
20551    * @param {Array|string} path The path to check.
20552    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20553    * @example
20554    *
20555    * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20556    *
20557    * _.hasIn(object, 'a');
20558    * // => true
20559    *
20560    * _.hasIn(object, 'a.b');
20561    * // => true
20562    *
20563    * _.hasIn(object, ['a', 'b']);
20564    * // => true
20565    *
20566    * _.hasIn(object, 'b');
20567    * // => false
20568    */
20569   function hasIn(object, path) {
20570     return object != null && hasPath(object, path, baseHasIn);
20571   }
20572
20573   /** Used to compose bitmasks for value comparisons. */
20574   var COMPARE_PARTIAL_FLAG$5 = 1,
20575       COMPARE_UNORDERED_FLAG$3 = 2;
20576
20577   /**
20578    * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20579    *
20580    * @private
20581    * @param {string} path The path of the property to get.
20582    * @param {*} srcValue The value to match.
20583    * @returns {Function} Returns the new spec function.
20584    */
20585   function baseMatchesProperty(path, srcValue) {
20586     if (isKey(path) && isStrictComparable(srcValue)) {
20587       return matchesStrictComparable(toKey(path), srcValue);
20588     }
20589     return function(object) {
20590       var objValue = get$2(object, path);
20591       return (objValue === undefined && objValue === srcValue)
20592         ? hasIn(object, path)
20593         : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20594     };
20595   }
20596
20597   /**
20598    * This method returns the first argument it receives.
20599    *
20600    * @static
20601    * @since 0.1.0
20602    * @memberOf _
20603    * @category Util
20604    * @param {*} value Any value.
20605    * @returns {*} Returns `value`.
20606    * @example
20607    *
20608    * var object = { 'a': 1 };
20609    *
20610    * console.log(_.identity(object) === object);
20611    * // => true
20612    */
20613   function identity$8(value) {
20614     return value;
20615   }
20616
20617   /**
20618    * The base implementation of `_.property` without support for deep paths.
20619    *
20620    * @private
20621    * @param {string} key The key of the property to get.
20622    * @returns {Function} Returns the new accessor function.
20623    */
20624   function baseProperty(key) {
20625     return function(object) {
20626       return object == null ? undefined : object[key];
20627     };
20628   }
20629
20630   /**
20631    * A specialized version of `baseProperty` which supports deep paths.
20632    *
20633    * @private
20634    * @param {Array|string} path The path of the property to get.
20635    * @returns {Function} Returns the new accessor function.
20636    */
20637   function basePropertyDeep(path) {
20638     return function(object) {
20639       return baseGet(object, path);
20640     };
20641   }
20642
20643   /**
20644    * Creates a function that returns the value at `path` of a given object.
20645    *
20646    * @static
20647    * @memberOf _
20648    * @since 2.4.0
20649    * @category Util
20650    * @param {Array|string} path The path of the property to get.
20651    * @returns {Function} Returns the new accessor function.
20652    * @example
20653    *
20654    * var objects = [
20655    *   { 'a': { 'b': 2 } },
20656    *   { 'a': { 'b': 1 } }
20657    * ];
20658    *
20659    * _.map(objects, _.property('a.b'));
20660    * // => [2, 1]
20661    *
20662    * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20663    * // => [1, 2]
20664    */
20665   function property(path) {
20666     return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20667   }
20668
20669   /**
20670    * The base implementation of `_.iteratee`.
20671    *
20672    * @private
20673    * @param {*} [value=_.identity] The value to convert to an iteratee.
20674    * @returns {Function} Returns the iteratee.
20675    */
20676   function baseIteratee(value) {
20677     // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20678     // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20679     if (typeof value == 'function') {
20680       return value;
20681     }
20682     if (value == null) {
20683       return identity$8;
20684     }
20685     if (typeof value == 'object') {
20686       return isArray(value)
20687         ? baseMatchesProperty(value[0], value[1])
20688         : baseMatches(value);
20689     }
20690     return property(value);
20691   }
20692
20693   /**
20694    * Creates a function like `_.groupBy`.
20695    *
20696    * @private
20697    * @param {Function} setter The function to set accumulator values.
20698    * @param {Function} [initializer] The accumulator object initializer.
20699    * @returns {Function} Returns the new aggregator function.
20700    */
20701   function createAggregator(setter, initializer) {
20702     return function(collection, iteratee) {
20703       var func = isArray(collection) ? arrayAggregator : baseAggregator,
20704           accumulator = initializer ? initializer() : {};
20705
20706       return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20707     };
20708   }
20709
20710   /** Used for built-in method references. */
20711   var objectProto$f = Object.prototype;
20712
20713   /** Used to check objects for own properties. */
20714   var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20715
20716   /**
20717    * Creates an object composed of keys generated from the results of running
20718    * each element of `collection` thru `iteratee`. The order of grouped values
20719    * is determined by the order they occur in `collection`. The corresponding
20720    * value of each key is an array of elements responsible for generating the
20721    * key. The iteratee is invoked with one argument: (value).
20722    *
20723    * @static
20724    * @memberOf _
20725    * @since 0.1.0
20726    * @category Collection
20727    * @param {Array|Object} collection The collection to iterate over.
20728    * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20729    * @returns {Object} Returns the composed aggregate object.
20730    * @example
20731    *
20732    * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20733    * // => { '4': [4.2], '6': [6.1, 6.3] }
20734    *
20735    * // The `_.property` iteratee shorthand.
20736    * _.groupBy(['one', 'two', 'three'], 'length');
20737    * // => { '3': ['one', 'two'], '5': ['three'] }
20738    */
20739   var groupBy = createAggregator(function(result, value, key) {
20740     if (hasOwnProperty$c.call(result, key)) {
20741       result[key].push(value);
20742     } else {
20743       baseAssignValue(result, key, [value]);
20744     }
20745   });
20746
20747   /**
20748    * Gets the last element of `array`.
20749    *
20750    * @static
20751    * @memberOf _
20752    * @since 0.1.0
20753    * @category Array
20754    * @param {Array} array The array to query.
20755    * @returns {*} Returns the last element of `array`.
20756    * @example
20757    *
20758    * _.last([1, 2, 3]);
20759    * // => 3
20760    */
20761   function last(array) {
20762     var length = array == null ? 0 : array.length;
20763     return length ? array[length - 1] : undefined;
20764   }
20765
20766   /**
20767    * The base implementation of `_.slice` without an iteratee call guard.
20768    *
20769    * @private
20770    * @param {Array} array The array to slice.
20771    * @param {number} [start=0] The start position.
20772    * @param {number} [end=array.length] The end position.
20773    * @returns {Array} Returns the slice of `array`.
20774    */
20775   function baseSlice(array, start, end) {
20776     var index = -1,
20777         length = array.length;
20778
20779     if (start < 0) {
20780       start = -start > length ? 0 : (length + start);
20781     }
20782     end = end > length ? length : end;
20783     if (end < 0) {
20784       end += length;
20785     }
20786     length = start > end ? 0 : ((end - start) >>> 0);
20787     start >>>= 0;
20788
20789     var result = Array(length);
20790     while (++index < length) {
20791       result[index] = array[index + start];
20792     }
20793     return result;
20794   }
20795
20796   /**
20797    * Gets the parent value at `path` of `object`.
20798    *
20799    * @private
20800    * @param {Object} object The object to query.
20801    * @param {Array} path The path to get the parent value of.
20802    * @returns {*} Returns the parent value.
20803    */
20804   function parent(object, path) {
20805     return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20806   }
20807
20808   /**
20809    * The base implementation of `_.unset`.
20810    *
20811    * @private
20812    * @param {Object} object The object to modify.
20813    * @param {Array|string} path The property path to unset.
20814    * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20815    */
20816   function baseUnset(object, path) {
20817     path = castPath(path, object);
20818     object = parent(object, path);
20819     return object == null || delete object[toKey(last(path))];
20820   }
20821
20822   /** `Object#toString` result references. */
20823   var objectTag$4 = '[object Object]';
20824
20825   /** Used for built-in method references. */
20826   var funcProto$2 = Function.prototype,
20827       objectProto$g = Object.prototype;
20828
20829   /** Used to resolve the decompiled source of functions. */
20830   var funcToString$2 = funcProto$2.toString;
20831
20832   /** Used to check objects for own properties. */
20833   var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20834
20835   /** Used to infer the `Object` constructor. */
20836   var objectCtorString = funcToString$2.call(Object);
20837
20838   /**
20839    * Checks if `value` is a plain object, that is, an object created by the
20840    * `Object` constructor or one with a `[[Prototype]]` of `null`.
20841    *
20842    * @static
20843    * @memberOf _
20844    * @since 0.8.0
20845    * @category Lang
20846    * @param {*} value The value to check.
20847    * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20848    * @example
20849    *
20850    * function Foo() {
20851    *   this.a = 1;
20852    * }
20853    *
20854    * _.isPlainObject(new Foo);
20855    * // => false
20856    *
20857    * _.isPlainObject([1, 2, 3]);
20858    * // => false
20859    *
20860    * _.isPlainObject({ 'x': 0, 'y': 0 });
20861    * // => true
20862    *
20863    * _.isPlainObject(Object.create(null));
20864    * // => true
20865    */
20866   function isPlainObject(value) {
20867     if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20868       return false;
20869     }
20870     var proto = getPrototype(value);
20871     if (proto === null) {
20872       return true;
20873     }
20874     var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20875     return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20876       funcToString$2.call(Ctor) == objectCtorString;
20877   }
20878
20879   /**
20880    * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20881    * objects.
20882    *
20883    * @private
20884    * @param {*} value The value to inspect.
20885    * @param {string} key The key of the property to inspect.
20886    * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20887    */
20888   function customOmitClone(value) {
20889     return isPlainObject(value) ? undefined : value;
20890   }
20891
20892   /** Built-in value references. */
20893   var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20894
20895   /**
20896    * Checks if `value` is a flattenable `arguments` object or array.
20897    *
20898    * @private
20899    * @param {*} value The value to check.
20900    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20901    */
20902   function isFlattenable(value) {
20903     return isArray(value) || isArguments(value) ||
20904       !!(spreadableSymbol && value && value[spreadableSymbol]);
20905   }
20906
20907   /**
20908    * The base implementation of `_.flatten` with support for restricting flattening.
20909    *
20910    * @private
20911    * @param {Array} array The array to flatten.
20912    * @param {number} depth The maximum recursion depth.
20913    * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20914    * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20915    * @param {Array} [result=[]] The initial result value.
20916    * @returns {Array} Returns the new flattened array.
20917    */
20918   function baseFlatten(array, depth, predicate, isStrict, result) {
20919     var index = -1,
20920         length = array.length;
20921
20922     predicate || (predicate = isFlattenable);
20923     result || (result = []);
20924
20925     while (++index < length) {
20926       var value = array[index];
20927       if (depth > 0 && predicate(value)) {
20928         if (depth > 1) {
20929           // Recursively flatten arrays (susceptible to call stack limits).
20930           baseFlatten(value, depth - 1, predicate, isStrict, result);
20931         } else {
20932           arrayPush(result, value);
20933         }
20934       } else if (!isStrict) {
20935         result[result.length] = value;
20936       }
20937     }
20938     return result;
20939   }
20940
20941   /**
20942    * Flattens `array` a single level deep.
20943    *
20944    * @static
20945    * @memberOf _
20946    * @since 0.1.0
20947    * @category Array
20948    * @param {Array} array The array to flatten.
20949    * @returns {Array} Returns the new flattened array.
20950    * @example
20951    *
20952    * _.flatten([1, [2, [3, [4]], 5]]);
20953    * // => [1, 2, [3, [4]], 5]
20954    */
20955   function flatten(array) {
20956     var length = array == null ? 0 : array.length;
20957     return length ? baseFlatten(array, 1) : [];
20958   }
20959
20960   /**
20961    * A faster alternative to `Function#apply`, this function invokes `func`
20962    * with the `this` binding of `thisArg` and the arguments of `args`.
20963    *
20964    * @private
20965    * @param {Function} func The function to invoke.
20966    * @param {*} thisArg The `this` binding of `func`.
20967    * @param {Array} args The arguments to invoke `func` with.
20968    * @returns {*} Returns the result of `func`.
20969    */
20970   function apply(func, thisArg, args) {
20971     switch (args.length) {
20972       case 0: return func.call(thisArg);
20973       case 1: return func.call(thisArg, args[0]);
20974       case 2: return func.call(thisArg, args[0], args[1]);
20975       case 3: return func.call(thisArg, args[0], args[1], args[2]);
20976     }
20977     return func.apply(thisArg, args);
20978   }
20979
20980   /* Built-in method references for those with the same name as other `lodash` methods. */
20981   var nativeMax = Math.max;
20982
20983   /**
20984    * A specialized version of `baseRest` which transforms the rest array.
20985    *
20986    * @private
20987    * @param {Function} func The function to apply a rest parameter to.
20988    * @param {number} [start=func.length-1] The start position of the rest parameter.
20989    * @param {Function} transform The rest array transform.
20990    * @returns {Function} Returns the new function.
20991    */
20992   function overRest(func, start, transform) {
20993     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20994     return function() {
20995       var args = arguments,
20996           index = -1,
20997           length = nativeMax(args.length - start, 0),
20998           array = Array(length);
20999
21000       while (++index < length) {
21001         array[index] = args[start + index];
21002       }
21003       index = -1;
21004       var otherArgs = Array(start + 1);
21005       while (++index < start) {
21006         otherArgs[index] = args[index];
21007       }
21008       otherArgs[start] = transform(array);
21009       return apply(func, this, otherArgs);
21010     };
21011   }
21012
21013   /**
21014    * Creates a function that returns `value`.
21015    *
21016    * @static
21017    * @memberOf _
21018    * @since 2.4.0
21019    * @category Util
21020    * @param {*} value The value to return from the new function.
21021    * @returns {Function} Returns the new constant function.
21022    * @example
21023    *
21024    * var objects = _.times(2, _.constant({ 'a': 1 }));
21025    *
21026    * console.log(objects);
21027    * // => [{ 'a': 1 }, { 'a': 1 }]
21028    *
21029    * console.log(objects[0] === objects[1]);
21030    * // => true
21031    */
21032   function constant$d(value) {
21033     return function() {
21034       return value;
21035     };
21036   }
21037
21038   /**
21039    * The base implementation of `setToString` without support for hot loop shorting.
21040    *
21041    * @private
21042    * @param {Function} func The function to modify.
21043    * @param {Function} string The `toString` result.
21044    * @returns {Function} Returns `func`.
21045    */
21046   var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21047     return defineProperty(func, 'toString', {
21048       'configurable': true,
21049       'enumerable': false,
21050       'value': constant$d(string),
21051       'writable': true
21052     });
21053   };
21054
21055   /** Used to detect hot functions by number of calls within a span of milliseconds. */
21056   var HOT_COUNT = 800,
21057       HOT_SPAN = 16;
21058
21059   /* Built-in method references for those with the same name as other `lodash` methods. */
21060   var nativeNow = Date.now;
21061
21062   /**
21063    * Creates a function that'll short out and invoke `identity` instead
21064    * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21065    * milliseconds.
21066    *
21067    * @private
21068    * @param {Function} func The function to restrict.
21069    * @returns {Function} Returns the new shortable function.
21070    */
21071   function shortOut(func) {
21072     var count = 0,
21073         lastCalled = 0;
21074
21075     return function() {
21076       var stamp = nativeNow(),
21077           remaining = HOT_SPAN - (stamp - lastCalled);
21078
21079       lastCalled = stamp;
21080       if (remaining > 0) {
21081         if (++count >= HOT_COUNT) {
21082           return arguments[0];
21083         }
21084       } else {
21085         count = 0;
21086       }
21087       return func.apply(undefined, arguments);
21088     };
21089   }
21090
21091   /**
21092    * Sets the `toString` method of `func` to return `string`.
21093    *
21094    * @private
21095    * @param {Function} func The function to modify.
21096    * @param {Function} string The `toString` result.
21097    * @returns {Function} Returns `func`.
21098    */
21099   var setToString = shortOut(baseSetToString);
21100
21101   /**
21102    * A specialized version of `baseRest` which flattens the rest array.
21103    *
21104    * @private
21105    * @param {Function} func The function to apply a rest parameter to.
21106    * @returns {Function} Returns the new function.
21107    */
21108   function flatRest(func) {
21109     return setToString(overRest(func, undefined, flatten), func + '');
21110   }
21111
21112   /** Used to compose bitmasks for cloning. */
21113   var CLONE_DEEP_FLAG$1 = 1,
21114       CLONE_FLAT_FLAG$1 = 2,
21115       CLONE_SYMBOLS_FLAG$2 = 4;
21116
21117   /**
21118    * The opposite of `_.pick`; this method creates an object composed of the
21119    * own and inherited enumerable property paths of `object` that are not omitted.
21120    *
21121    * **Note:** This method is considerably slower than `_.pick`.
21122    *
21123    * @static
21124    * @since 0.1.0
21125    * @memberOf _
21126    * @category Object
21127    * @param {Object} object The source object.
21128    * @param {...(string|string[])} [paths] The property paths to omit.
21129    * @returns {Object} Returns the new object.
21130    * @example
21131    *
21132    * var object = { 'a': 1, 'b': '2', 'c': 3 };
21133    *
21134    * _.omit(object, ['a', 'c']);
21135    * // => { 'b': '2' }
21136    */
21137   var omit = flatRest(function(object, paths) {
21138     var result = {};
21139     if (object == null) {
21140       return result;
21141     }
21142     var isDeep = false;
21143     paths = arrayMap(paths, function(path) {
21144       path = castPath(path, object);
21145       isDeep || (isDeep = path.length > 1);
21146       return path;
21147     });
21148     copyObject(object, getAllKeysIn(object), result);
21149     if (isDeep) {
21150       result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21151     }
21152     var length = paths.length;
21153     while (length--) {
21154       baseUnset(result, paths[length]);
21155     }
21156     return result;
21157   });
21158
21159   /**
21160    * Creates an array with all falsey values removed. The values `false`, `null`,
21161    * `0`, `""`, `undefined`, and `NaN` are falsey.
21162    *
21163    * @static
21164    * @memberOf _
21165    * @since 0.1.0
21166    * @category Array
21167    * @param {Array} array The array to compact.
21168    * @returns {Array} Returns the new array of filtered values.
21169    * @example
21170    *
21171    * _.compact([0, 1, false, 2, '', 3]);
21172    * // => [1, 2, 3]
21173    */
21174   function compact(array) {
21175     var index = -1,
21176         length = array == null ? 0 : array.length,
21177         resIndex = 0,
21178         result = [];
21179
21180     while (++index < length) {
21181       var value = array[index];
21182       if (value) {
21183         result[resIndex++] = value;
21184       }
21185     }
21186     return result;
21187   }
21188
21189   /**
21190    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21191    *
21192    * @private
21193    * @param {Function} func The function to apply a rest parameter to.
21194    * @param {number} [start=func.length-1] The start position of the rest parameter.
21195    * @returns {Function} Returns the new function.
21196    */
21197   function baseRest(func, start) {
21198     return setToString(overRest(func, start, identity$8), func + '');
21199   }
21200
21201   /**
21202    * Checks if the given arguments are from an iteratee call.
21203    *
21204    * @private
21205    * @param {*} value The potential iteratee value argument.
21206    * @param {*} index The potential iteratee index or key argument.
21207    * @param {*} object The potential iteratee object argument.
21208    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21209    *  else `false`.
21210    */
21211   function isIterateeCall(value, index, object) {
21212     if (!isObject(object)) {
21213       return false;
21214     }
21215     var type = typeof index;
21216     if (type == 'number'
21217           ? (isArrayLike(object) && isIndex(index, object.length))
21218           : (type == 'string' && index in object)
21219         ) {
21220       return eq(object[index], value);
21221     }
21222     return false;
21223   }
21224
21225   /**
21226    * Creates a function like `_.assign`.
21227    *
21228    * @private
21229    * @param {Function} assigner The function to assign values.
21230    * @returns {Function} Returns the new assigner function.
21231    */
21232   function createAssigner(assigner) {
21233     return baseRest(function(object, sources) {
21234       var index = -1,
21235           length = sources.length,
21236           customizer = length > 1 ? sources[length - 1] : undefined,
21237           guard = length > 2 ? sources[2] : undefined;
21238
21239       customizer = (assigner.length > 3 && typeof customizer == 'function')
21240         ? (length--, customizer)
21241         : undefined;
21242
21243       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21244         customizer = length < 3 ? undefined : customizer;
21245         length = 1;
21246       }
21247       object = Object(object);
21248       while (++index < length) {
21249         var source = sources[index];
21250         if (source) {
21251           assigner(object, source, index, customizer);
21252         }
21253       }
21254       return object;
21255     });
21256   }
21257
21258   /**
21259    * This method is like `_.assign` except that it iterates over own and
21260    * inherited source properties.
21261    *
21262    * **Note:** This method mutates `object`.
21263    *
21264    * @static
21265    * @memberOf _
21266    * @since 4.0.0
21267    * @alias extend
21268    * @category Object
21269    * @param {Object} object The destination object.
21270    * @param {...Object} [sources] The source objects.
21271    * @returns {Object} Returns `object`.
21272    * @see _.assign
21273    * @example
21274    *
21275    * function Foo() {
21276    *   this.a = 1;
21277    * }
21278    *
21279    * function Bar() {
21280    *   this.c = 3;
21281    * }
21282    *
21283    * Foo.prototype.b = 2;
21284    * Bar.prototype.d = 4;
21285    *
21286    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21287    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21288    */
21289   var assignIn = createAssigner(function(object, source) {
21290     copyObject(source, keysIn$1(source), object);
21291   });
21292
21293   /**
21294    * The base implementation of `_.filter` without support for iteratee shorthands.
21295    *
21296    * @private
21297    * @param {Array|Object} collection The collection to iterate over.
21298    * @param {Function} predicate The function invoked per iteration.
21299    * @returns {Array} Returns the new filtered array.
21300    */
21301   function baseFilter(collection, predicate) {
21302     var result = [];
21303     baseEach(collection, function(value, index, collection) {
21304       if (predicate(value, index, collection)) {
21305         result.push(value);
21306       }
21307     });
21308     return result;
21309   }
21310
21311   /**
21312    * Iterates over elements of `collection`, returning an array of all elements
21313    * `predicate` returns truthy for. The predicate is invoked with three
21314    * arguments: (value, index|key, collection).
21315    *
21316    * **Note:** Unlike `_.remove`, this method returns a new array.
21317    *
21318    * @static
21319    * @memberOf _
21320    * @since 0.1.0
21321    * @category Collection
21322    * @param {Array|Object} collection The collection to iterate over.
21323    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21324    * @returns {Array} Returns the new filtered array.
21325    * @see _.reject
21326    * @example
21327    *
21328    * var users = [
21329    *   { 'user': 'barney', 'age': 36, 'active': true },
21330    *   { 'user': 'fred',   'age': 40, 'active': false }
21331    * ];
21332    *
21333    * _.filter(users, function(o) { return !o.active; });
21334    * // => objects for ['fred']
21335    *
21336    * // The `_.matches` iteratee shorthand.
21337    * _.filter(users, { 'age': 36, 'active': true });
21338    * // => objects for ['barney']
21339    *
21340    * // The `_.matchesProperty` iteratee shorthand.
21341    * _.filter(users, ['active', false]);
21342    * // => objects for ['fred']
21343    *
21344    * // The `_.property` iteratee shorthand.
21345    * _.filter(users, 'active');
21346    * // => objects for ['barney']
21347    */
21348   function filter(collection, predicate) {
21349     var func = isArray(collection) ? arrayFilter : baseFilter;
21350     return func(collection, baseIteratee(predicate, 3));
21351   }
21352
21353   /**
21354    * Creates a `_.find` or `_.findLast` function.
21355    *
21356    * @private
21357    * @param {Function} findIndexFunc The function to find the collection index.
21358    * @returns {Function} Returns the new find function.
21359    */
21360   function createFind(findIndexFunc) {
21361     return function(collection, predicate, fromIndex) {
21362       var iterable = Object(collection);
21363       if (!isArrayLike(collection)) {
21364         var iteratee = baseIteratee(predicate, 3);
21365         collection = keys$1(collection);
21366         predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21367       }
21368       var index = findIndexFunc(collection, predicate, fromIndex);
21369       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21370     };
21371   }
21372
21373   /**
21374    * The base implementation of `_.findIndex` and `_.findLastIndex` without
21375    * support for iteratee shorthands.
21376    *
21377    * @private
21378    * @param {Array} array The array to inspect.
21379    * @param {Function} predicate The function invoked per iteration.
21380    * @param {number} fromIndex The index to search from.
21381    * @param {boolean} [fromRight] Specify iterating from right to left.
21382    * @returns {number} Returns the index of the matched value, else `-1`.
21383    */
21384   function baseFindIndex(array, predicate, fromIndex, fromRight) {
21385     var length = array.length,
21386         index = fromIndex + (fromRight ? 1 : -1);
21387
21388     while ((fromRight ? index-- : ++index < length)) {
21389       if (predicate(array[index], index, array)) {
21390         return index;
21391       }
21392     }
21393     return -1;
21394   }
21395
21396   /** Used as references for various `Number` constants. */
21397   var NAN = 0 / 0;
21398
21399   /** Used to match leading and trailing whitespace. */
21400   var reTrim = /^\s+|\s+$/g;
21401
21402   /** Used to detect bad signed hexadecimal string values. */
21403   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21404
21405   /** Used to detect binary string values. */
21406   var reIsBinary = /^0b[01]+$/i;
21407
21408   /** Used to detect octal string values. */
21409   var reIsOctal = /^0o[0-7]+$/i;
21410
21411   /** Built-in method references without a dependency on `root`. */
21412   var freeParseInt = parseInt;
21413
21414   /**
21415    * Converts `value` to a number.
21416    *
21417    * @static
21418    * @memberOf _
21419    * @since 4.0.0
21420    * @category Lang
21421    * @param {*} value The value to process.
21422    * @returns {number} Returns the number.
21423    * @example
21424    *
21425    * _.toNumber(3.2);
21426    * // => 3.2
21427    *
21428    * _.toNumber(Number.MIN_VALUE);
21429    * // => 5e-324
21430    *
21431    * _.toNumber(Infinity);
21432    * // => Infinity
21433    *
21434    * _.toNumber('3.2');
21435    * // => 3.2
21436    */
21437   function toNumber(value) {
21438     if (typeof value == 'number') {
21439       return value;
21440     }
21441     if (isSymbol(value)) {
21442       return NAN;
21443     }
21444     if (isObject(value)) {
21445       var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21446       value = isObject(other) ? (other + '') : other;
21447     }
21448     if (typeof value != 'string') {
21449       return value === 0 ? value : +value;
21450     }
21451     value = value.replace(reTrim, '');
21452     var isBinary = reIsBinary.test(value);
21453     return (isBinary || reIsOctal.test(value))
21454       ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21455       : (reIsBadHex.test(value) ? NAN : +value);
21456   }
21457
21458   /** Used as references for various `Number` constants. */
21459   var INFINITY$2 = 1 / 0,
21460       MAX_INTEGER = 1.7976931348623157e+308;
21461
21462   /**
21463    * Converts `value` to a finite number.
21464    *
21465    * @static
21466    * @memberOf _
21467    * @since 4.12.0
21468    * @category Lang
21469    * @param {*} value The value to convert.
21470    * @returns {number} Returns the converted number.
21471    * @example
21472    *
21473    * _.toFinite(3.2);
21474    * // => 3.2
21475    *
21476    * _.toFinite(Number.MIN_VALUE);
21477    * // => 5e-324
21478    *
21479    * _.toFinite(Infinity);
21480    * // => 1.7976931348623157e+308
21481    *
21482    * _.toFinite('3.2');
21483    * // => 3.2
21484    */
21485   function toFinite(value) {
21486     if (!value) {
21487       return value === 0 ? value : 0;
21488     }
21489     value = toNumber(value);
21490     if (value === INFINITY$2 || value === -INFINITY$2) {
21491       var sign = (value < 0 ? -1 : 1);
21492       return sign * MAX_INTEGER;
21493     }
21494     return value === value ? value : 0;
21495   }
21496
21497   /**
21498    * Converts `value` to an integer.
21499    *
21500    * **Note:** This method is loosely based on
21501    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21502    *
21503    * @static
21504    * @memberOf _
21505    * @since 4.0.0
21506    * @category Lang
21507    * @param {*} value The value to convert.
21508    * @returns {number} Returns the converted integer.
21509    * @example
21510    *
21511    * _.toInteger(3.2);
21512    * // => 3
21513    *
21514    * _.toInteger(Number.MIN_VALUE);
21515    * // => 0
21516    *
21517    * _.toInteger(Infinity);
21518    * // => 1.7976931348623157e+308
21519    *
21520    * _.toInteger('3.2');
21521    * // => 3
21522    */
21523   function toInteger(value) {
21524     var result = toFinite(value),
21525         remainder = result % 1;
21526
21527     return result === result ? (remainder ? result - remainder : result) : 0;
21528   }
21529
21530   /* Built-in method references for those with the same name as other `lodash` methods. */
21531   var nativeMax$1 = Math.max;
21532
21533   /**
21534    * This method is like `_.find` except that it returns the index of the first
21535    * element `predicate` returns truthy for instead of the element itself.
21536    *
21537    * @static
21538    * @memberOf _
21539    * @since 1.1.0
21540    * @category Array
21541    * @param {Array} array The array to inspect.
21542    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21543    * @param {number} [fromIndex=0] The index to search from.
21544    * @returns {number} Returns the index of the found element, else `-1`.
21545    * @example
21546    *
21547    * var users = [
21548    *   { 'user': 'barney',  'active': false },
21549    *   { 'user': 'fred',    'active': false },
21550    *   { 'user': 'pebbles', 'active': true }
21551    * ];
21552    *
21553    * _.findIndex(users, function(o) { return o.user == 'barney'; });
21554    * // => 0
21555    *
21556    * // The `_.matches` iteratee shorthand.
21557    * _.findIndex(users, { 'user': 'fred', 'active': false });
21558    * // => 1
21559    *
21560    * // The `_.matchesProperty` iteratee shorthand.
21561    * _.findIndex(users, ['active', false]);
21562    * // => 0
21563    *
21564    * // The `_.property` iteratee shorthand.
21565    * _.findIndex(users, 'active');
21566    * // => 2
21567    */
21568   function findIndex(array, predicate, fromIndex) {
21569     var length = array == null ? 0 : array.length;
21570     if (!length) {
21571       return -1;
21572     }
21573     var index = fromIndex == null ? 0 : toInteger(fromIndex);
21574     if (index < 0) {
21575       index = nativeMax$1(length + index, 0);
21576     }
21577     return baseFindIndex(array, baseIteratee(predicate, 3), index);
21578   }
21579
21580   /**
21581    * Iterates over elements of `collection`, returning the first element
21582    * `predicate` returns truthy for. The predicate is invoked with three
21583    * arguments: (value, index|key, collection).
21584    *
21585    * @static
21586    * @memberOf _
21587    * @since 0.1.0
21588    * @category Collection
21589    * @param {Array|Object} collection The collection to inspect.
21590    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21591    * @param {number} [fromIndex=0] The index to search from.
21592    * @returns {*} Returns the matched element, else `undefined`.
21593    * @example
21594    *
21595    * var users = [
21596    *   { 'user': 'barney',  'age': 36, 'active': true },
21597    *   { 'user': 'fred',    'age': 40, 'active': false },
21598    *   { 'user': 'pebbles', 'age': 1,  'active': true }
21599    * ];
21600    *
21601    * _.find(users, function(o) { return o.age < 40; });
21602    * // => object for 'barney'
21603    *
21604    * // The `_.matches` iteratee shorthand.
21605    * _.find(users, { 'age': 1, 'active': true });
21606    * // => object for 'pebbles'
21607    *
21608    * // The `_.matchesProperty` iteratee shorthand.
21609    * _.find(users, ['active', false]);
21610    * // => object for 'fred'
21611    *
21612    * // The `_.property` iteratee shorthand.
21613    * _.find(users, 'active');
21614    * // => object for 'barney'
21615    */
21616   var find$1 = createFind(findIndex);
21617
21618   /**
21619    * The base implementation of `_.map` without support for iteratee shorthands.
21620    *
21621    * @private
21622    * @param {Array|Object} collection The collection to iterate over.
21623    * @param {Function} iteratee The function invoked per iteration.
21624    * @returns {Array} Returns the new mapped array.
21625    */
21626   function baseMap(collection, iteratee) {
21627     var index = -1,
21628         result = isArrayLike(collection) ? Array(collection.length) : [];
21629
21630     baseEach(collection, function(value, key, collection) {
21631       result[++index] = iteratee(value, key, collection);
21632     });
21633     return result;
21634   }
21635
21636   /**
21637    * Creates an array of values by running each element in `collection` thru
21638    * `iteratee`. The iteratee is invoked with three arguments:
21639    * (value, index|key, collection).
21640    *
21641    * Many lodash methods are guarded to work as iteratees for methods like
21642    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21643    *
21644    * The guarded methods are:
21645    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21646    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21647    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21648    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21649    *
21650    * @static
21651    * @memberOf _
21652    * @since 0.1.0
21653    * @category Collection
21654    * @param {Array|Object} collection The collection to iterate over.
21655    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21656    * @returns {Array} Returns the new mapped array.
21657    * @example
21658    *
21659    * function square(n) {
21660    *   return n * n;
21661    * }
21662    *
21663    * _.map([4, 8], square);
21664    * // => [16, 64]
21665    *
21666    * _.map({ 'a': 4, 'b': 8 }, square);
21667    * // => [16, 64] (iteration order is not guaranteed)
21668    *
21669    * var users = [
21670    *   { 'user': 'barney' },
21671    *   { 'user': 'fred' }
21672    * ];
21673    *
21674    * // The `_.property` iteratee shorthand.
21675    * _.map(users, 'user');
21676    * // => ['barney', 'fred']
21677    */
21678   function map$3(collection, iteratee) {
21679     var func = isArray(collection) ? arrayMap : baseMap;
21680     return func(collection, baseIteratee(iteratee, 3));
21681   }
21682
21683   /**
21684    * The base implementation of `_.values` and `_.valuesIn` which creates an
21685    * array of `object` property values corresponding to the property names
21686    * of `props`.
21687    *
21688    * @private
21689    * @param {Object} object The object to query.
21690    * @param {Array} props The property names to get values for.
21691    * @returns {Object} Returns the array of property values.
21692    */
21693   function baseValues(object, props) {
21694     return arrayMap(props, function(key) {
21695       return object[key];
21696     });
21697   }
21698
21699   /**
21700    * Creates an array of the own enumerable string keyed property values of `object`.
21701    *
21702    * **Note:** Non-object values are coerced to objects.
21703    *
21704    * @static
21705    * @since 0.1.0
21706    * @memberOf _
21707    * @category Object
21708    * @param {Object} object The object to query.
21709    * @returns {Array} Returns the array of property values.
21710    * @example
21711    *
21712    * function Foo() {
21713    *   this.a = 1;
21714    *   this.b = 2;
21715    * }
21716    *
21717    * Foo.prototype.c = 3;
21718    *
21719    * _.values(new Foo);
21720    * // => [1, 2] (iteration order is not guaranteed)
21721    *
21722    * _.values('hi');
21723    * // => ['h', 'i']
21724    */
21725   function values$1(object) {
21726     return object == null ? [] : baseValues(object, keys$1(object));
21727   }
21728
21729   /**
21730    * A specialized version of `_.every` for arrays without support for
21731    * iteratee shorthands.
21732    *
21733    * @private
21734    * @param {Array} [array] The array to iterate over.
21735    * @param {Function} predicate The function invoked per iteration.
21736    * @returns {boolean} Returns `true` if all elements pass the predicate check,
21737    *  else `false`.
21738    */
21739   function arrayEvery(array, predicate) {
21740     var index = -1,
21741         length = array == null ? 0 : array.length;
21742
21743     while (++index < length) {
21744       if (!predicate(array[index], index, array)) {
21745         return false;
21746       }
21747     }
21748     return true;
21749   }
21750
21751   /**
21752    * The base implementation of `_.every` without support for iteratee shorthands.
21753    *
21754    * @private
21755    * @param {Array|Object} collection The collection to iterate over.
21756    * @param {Function} predicate The function invoked per iteration.
21757    * @returns {boolean} Returns `true` if all elements pass the predicate check,
21758    *  else `false`
21759    */
21760   function baseEvery(collection, predicate) {
21761     var result = true;
21762     baseEach(collection, function(value, index, collection) {
21763       result = !!predicate(value, index, collection);
21764       return result;
21765     });
21766     return result;
21767   }
21768
21769   /**
21770    * Checks if `predicate` returns truthy for **all** elements of `collection`.
21771    * Iteration is stopped once `predicate` returns falsey. The predicate is
21772    * invoked with three arguments: (value, index|key, collection).
21773    *
21774    * **Note:** This method returns `true` for
21775    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
21776    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
21777    * elements of empty collections.
21778    *
21779    * @static
21780    * @memberOf _
21781    * @since 0.1.0
21782    * @category Collection
21783    * @param {Array|Object} collection The collection to iterate over.
21784    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21785    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
21786    * @returns {boolean} Returns `true` if all elements pass the predicate check,
21787    *  else `false`.
21788    * @example
21789    *
21790    * _.every([true, 1, null, 'yes'], Boolean);
21791    * // => false
21792    *
21793    * var users = [
21794    *   { 'user': 'barney', 'age': 36, 'active': false },
21795    *   { 'user': 'fred',   'age': 40, 'active': false }
21796    * ];
21797    *
21798    * // The `_.matches` iteratee shorthand.
21799    * _.every(users, { 'user': 'barney', 'active': false });
21800    * // => false
21801    *
21802    * // The `_.matchesProperty` iteratee shorthand.
21803    * _.every(users, ['active', false]);
21804    * // => true
21805    *
21806    * // The `_.property` iteratee shorthand.
21807    * _.every(users, 'active');
21808    * // => false
21809    */
21810   function every(collection, predicate, guard) {
21811     var func = isArray(collection) ? arrayEvery : baseEvery;
21812     if (guard && isIterateeCall(collection, predicate, guard)) {
21813       predicate = undefined;
21814     }
21815     return func(collection, baseIteratee(predicate, 3));
21816   }
21817
21818   /**
21819    * The base implementation of `_.isNaN` without support for number objects.
21820    *
21821    * @private
21822    * @param {*} value The value to check.
21823    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21824    */
21825   function baseIsNaN(value) {
21826     return value !== value;
21827   }
21828
21829   /**
21830    * A specialized version of `_.indexOf` which performs strict equality
21831    * comparisons of values, i.e. `===`.
21832    *
21833    * @private
21834    * @param {Array} array The array to inspect.
21835    * @param {*} value The value to search for.
21836    * @param {number} fromIndex The index to search from.
21837    * @returns {number} Returns the index of the matched value, else `-1`.
21838    */
21839   function strictIndexOf(array, value, fromIndex) {
21840     var index = fromIndex - 1,
21841         length = array.length;
21842
21843     while (++index < length) {
21844       if (array[index] === value) {
21845         return index;
21846       }
21847     }
21848     return -1;
21849   }
21850
21851   /**
21852    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21853    *
21854    * @private
21855    * @param {Array} array The array to inspect.
21856    * @param {*} value The value to search for.
21857    * @param {number} fromIndex The index to search from.
21858    * @returns {number} Returns the index of the matched value, else `-1`.
21859    */
21860   function baseIndexOf(array, value, fromIndex) {
21861     return value === value
21862       ? strictIndexOf(array, value, fromIndex)
21863       : baseFindIndex(array, baseIsNaN, fromIndex);
21864   }
21865
21866   /**
21867    * A specialized version of `_.includes` for arrays without support for
21868    * specifying an index to search from.
21869    *
21870    * @private
21871    * @param {Array} [array] The array to inspect.
21872    * @param {*} target The value to search for.
21873    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21874    */
21875   function arrayIncludes(array, value) {
21876     var length = array == null ? 0 : array.length;
21877     return !!length && baseIndexOf(array, value, 0) > -1;
21878   }
21879
21880   /**
21881    * This function is like `arrayIncludes` except that it accepts a comparator.
21882    *
21883    * @private
21884    * @param {Array} [array] The array to inspect.
21885    * @param {*} target The value to search for.
21886    * @param {Function} comparator The comparator invoked per element.
21887    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21888    */
21889   function arrayIncludesWith(array, value, comparator) {
21890     var index = -1,
21891         length = array == null ? 0 : array.length;
21892
21893     while (++index < length) {
21894       if (comparator(value, array[index])) {
21895         return true;
21896       }
21897     }
21898     return false;
21899   }
21900
21901   /**
21902    * This method returns `undefined`.
21903    *
21904    * @static
21905    * @memberOf _
21906    * @since 2.3.0
21907    * @category Util
21908    * @example
21909    *
21910    * _.times(2, _.noop);
21911    * // => [undefined, undefined]
21912    */
21913   function noop$3() {
21914     // No operation performed.
21915   }
21916
21917   /** Used as references for various `Number` constants. */
21918   var INFINITY$3 = 1 / 0;
21919
21920   /**
21921    * Creates a set object of `values`.
21922    *
21923    * @private
21924    * @param {Array} values The values to add to the set.
21925    * @returns {Object} Returns the new set.
21926    */
21927   var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21928     return new Set$1(values);
21929   };
21930
21931   /** Used as the size to enable large array optimizations. */
21932   var LARGE_ARRAY_SIZE$1 = 200;
21933
21934   /**
21935    * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21936    *
21937    * @private
21938    * @param {Array} array The array to inspect.
21939    * @param {Function} [iteratee] The iteratee invoked per element.
21940    * @param {Function} [comparator] The comparator invoked per element.
21941    * @returns {Array} Returns the new duplicate free array.
21942    */
21943   function baseUniq(array, iteratee, comparator) {
21944     var index = -1,
21945         includes = arrayIncludes,
21946         length = array.length,
21947         isCommon = true,
21948         result = [],
21949         seen = result;
21950
21951     if (comparator) {
21952       isCommon = false;
21953       includes = arrayIncludesWith;
21954     }
21955     else if (length >= LARGE_ARRAY_SIZE$1) {
21956       var set = iteratee ? null : createSet(array);
21957       if (set) {
21958         return setToArray(set);
21959       }
21960       isCommon = false;
21961       includes = cacheHas;
21962       seen = new SetCache;
21963     }
21964     else {
21965       seen = iteratee ? [] : result;
21966     }
21967     outer:
21968     while (++index < length) {
21969       var value = array[index],
21970           computed = iteratee ? iteratee(value) : value;
21971
21972       value = (comparator || value !== 0) ? value : 0;
21973       if (isCommon && computed === computed) {
21974         var seenIndex = seen.length;
21975         while (seenIndex--) {
21976           if (seen[seenIndex] === computed) {
21977             continue outer;
21978           }
21979         }
21980         if (iteratee) {
21981           seen.push(computed);
21982         }
21983         result.push(value);
21984       }
21985       else if (!includes(seen, computed, comparator)) {
21986         if (seen !== result) {
21987           seen.push(computed);
21988         }
21989         result.push(value);
21990       }
21991     }
21992     return result;
21993   }
21994
21995   /**
21996    * This method is like `_.isArrayLike` except that it also checks if `value`
21997    * is an object.
21998    *
21999    * @static
22000    * @memberOf _
22001    * @since 4.0.0
22002    * @category Lang
22003    * @param {*} value The value to check.
22004    * @returns {boolean} Returns `true` if `value` is an array-like object,
22005    *  else `false`.
22006    * @example
22007    *
22008    * _.isArrayLikeObject([1, 2, 3]);
22009    * // => true
22010    *
22011    * _.isArrayLikeObject(document.body.children);
22012    * // => true
22013    *
22014    * _.isArrayLikeObject('abc');
22015    * // => false
22016    *
22017    * _.isArrayLikeObject(_.noop);
22018    * // => false
22019    */
22020   function isArrayLikeObject(value) {
22021     return isObjectLike(value) && isArrayLike(value);
22022   }
22023
22024   /**
22025    * Creates an array of unique values, in order, from all given arrays using
22026    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22027    * for equality comparisons.
22028    *
22029    * @static
22030    * @memberOf _
22031    * @since 0.1.0
22032    * @category Array
22033    * @param {...Array} [arrays] The arrays to inspect.
22034    * @returns {Array} Returns the new array of combined values.
22035    * @example
22036    *
22037    * _.union([2], [1, 2]);
22038    * // => [2, 1]
22039    */
22040   var union = baseRest(function(arrays) {
22041     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22042   });
22043
22044   /** Used as the size to enable large array optimizations. */
22045   var LARGE_ARRAY_SIZE$2 = 200;
22046
22047   /**
22048    * The base implementation of methods like `_.difference` without support
22049    * for excluding multiple arrays or iteratee shorthands.
22050    *
22051    * @private
22052    * @param {Array} array The array to inspect.
22053    * @param {Array} values The values to exclude.
22054    * @param {Function} [iteratee] The iteratee invoked per element.
22055    * @param {Function} [comparator] The comparator invoked per element.
22056    * @returns {Array} Returns the new array of filtered values.
22057    */
22058   function baseDifference(array, values, iteratee, comparator) {
22059     var index = -1,
22060         includes = arrayIncludes,
22061         isCommon = true,
22062         length = array.length,
22063         result = [],
22064         valuesLength = values.length;
22065
22066     if (!length) {
22067       return result;
22068     }
22069     if (iteratee) {
22070       values = arrayMap(values, baseUnary(iteratee));
22071     }
22072     if (comparator) {
22073       includes = arrayIncludesWith;
22074       isCommon = false;
22075     }
22076     else if (values.length >= LARGE_ARRAY_SIZE$2) {
22077       includes = cacheHas;
22078       isCommon = false;
22079       values = new SetCache(values);
22080     }
22081     outer:
22082     while (++index < length) {
22083       var value = array[index],
22084           computed = iteratee == null ? value : iteratee(value);
22085
22086       value = (comparator || value !== 0) ? value : 0;
22087       if (isCommon && computed === computed) {
22088         var valuesIndex = valuesLength;
22089         while (valuesIndex--) {
22090           if (values[valuesIndex] === computed) {
22091             continue outer;
22092           }
22093         }
22094         result.push(value);
22095       }
22096       else if (!includes(values, computed, comparator)) {
22097         result.push(value);
22098       }
22099     }
22100     return result;
22101   }
22102
22103   /**
22104    * Creates an array excluding all given values using
22105    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22106    * for equality comparisons.
22107    *
22108    * **Note:** Unlike `_.pull`, this method returns a new array.
22109    *
22110    * @static
22111    * @memberOf _
22112    * @since 0.1.0
22113    * @category Array
22114    * @param {Array} array The array to inspect.
22115    * @param {...*} [values] The values to exclude.
22116    * @returns {Array} Returns the new array of filtered values.
22117    * @see _.difference, _.xor
22118    * @example
22119    *
22120    * _.without([2, 1, 2, 3], 1, 2);
22121    * // => [3]
22122    */
22123   var without = baseRest(function(array, values) {
22124     return isArrayLikeObject(array)
22125       ? baseDifference(array, values)
22126       : [];
22127   });
22128
22129   function osmIsInterestingTag(key) {
22130       return key !== 'attribution' &&
22131           key !== 'created_by' &&
22132           key !== 'source' &&
22133           key !== 'odbl' &&
22134           key.indexOf('tiger:') !== 0;
22135   }
22136
22137
22138   var osmOneWayTags = {
22139       'aerialway': {
22140           'chair_lift': true,
22141           'drag_lift': true,
22142           'j-bar': true,
22143           'magic_carpet': true,
22144           'mixed_lift': true,
22145           'platter': true,
22146           'rope_tow': true,
22147           't-bar': true,
22148           'zipline': true
22149       },
22150       'highway': {
22151           'motorway': true
22152       },
22153       'junction': {
22154           'circular': true,
22155           'roundabout': true
22156       },
22157       'man_made': {
22158           'piste:halfpipe': true
22159       },
22160       'piste:type': {
22161           'downhill': true,
22162           'sled': true,
22163           'yes': true
22164       },
22165       'waterway': {
22166           'canal': true,
22167           'ditch': true,
22168           'drain': true,
22169           'river': true,
22170           'stream': true
22171       }
22172   };
22173
22174
22175   var osmPavedTags = {
22176       'surface': {
22177           'paved': true,
22178           'asphalt': true,
22179           'concrete': true,
22180           'concrete:lanes': true,
22181           'concrete:plates': true
22182       },
22183       'tracktype': {
22184           'grade1': true
22185       }
22186   };
22187
22188   var osmRightSideIsInsideTags = {
22189       'natural': {
22190           'cliff': true,
22191           'coastline': 'coastline',
22192       },
22193       'barrier': {
22194           'retaining_wall': true,
22195           'kerb': true,
22196           'guard_rail': true,
22197           'city_wall': true,
22198       },
22199       'man_made': {
22200           'embankment': true
22201       }
22202   };
22203
22204   var wikibooks = [
22205       [
22206           "Afrikaans",
22207           "Afrikaans",
22208           "af"
22209       ],
22210       [
22211           "Arabic",
22212           "العربية",
22213           "ar"
22214       ],
22215       [
22216           "Azerbaijani",
22217           "azərbaycanca",
22218           "az"
22219       ],
22220       [
22221           "Belarusian",
22222           "беларуская",
22223           "be"
22224       ],
22225       [
22226           "Bulgarian",
22227           "български",
22228           "bg"
22229       ],
22230       [
22231           "Bangla",
22232           "বাংলা",
22233           "bn"
22234       ],
22235       [
22236           "Bosnian",
22237           "bosanski",
22238           "bs"
22239       ],
22240       [
22241           "Catalan",
22242           "català",
22243           "ca"
22244       ],
22245       [
22246           "Czech",
22247           "čeština",
22248           "cs"
22249       ],
22250       [
22251           "Chuvash",
22252           "Чӑвашла",
22253           "cv"
22254       ],
22255       [
22256           "Welsh",
22257           "Cymraeg",
22258           "cy"
22259       ],
22260       [
22261           "Danish",
22262           "dansk",
22263           "da"
22264       ],
22265       [
22266           "German",
22267           "Deutsch",
22268           "de"
22269       ],
22270       [
22271           "Greek",
22272           "Ελληνικά",
22273           "el"
22274       ],
22275       [
22276           "English",
22277           "English",
22278           "en"
22279       ],
22280       [
22281           "Esperanto",
22282           "Esperanto",
22283           "eo"
22284       ],
22285       [
22286           "Spanish",
22287           "español",
22288           "es"
22289       ],
22290       [
22291           "Estonian",
22292           "eesti",
22293           "et"
22294       ],
22295       [
22296           "Basque",
22297           "euskara",
22298           "eu"
22299       ],
22300       [
22301           "Persian",
22302           "فارسی",
22303           "fa"
22304       ],
22305       [
22306           "Finnish",
22307           "suomi",
22308           "fi"
22309       ],
22310       [
22311           "French",
22312           "français",
22313           "fr"
22314       ],
22315       [
22316           "Western Frisian",
22317           "Frysk",
22318           "fy"
22319       ],
22320       [
22321           "Galician",
22322           "galego",
22323           "gl"
22324       ],
22325       [
22326           "Hebrew",
22327           "עברית",
22328           "he"
22329       ],
22330       [
22331           "Hindi",
22332           "हिन्दी",
22333           "hi"
22334       ],
22335       [
22336           "Croatian",
22337           "hrvatski",
22338           "hr"
22339       ],
22340       [
22341           "Hungarian",
22342           "magyar",
22343           "hu"
22344       ],
22345       [
22346           "Armenian",
22347           "Հայերեն",
22348           "hy"
22349       ],
22350       [
22351           "Interlingua",
22352           "interlingua",
22353           "ia"
22354       ],
22355       [
22356           "Indonesian",
22357           "Bahasa Indonesia",
22358           "id"
22359       ],
22360       [
22361           "Icelandic",
22362           "íslenska",
22363           "is"
22364       ],
22365       [
22366           "Italian",
22367           "italiano",
22368           "it"
22369       ],
22370       [
22371           "Japanese",
22372           "日本語",
22373           "ja"
22374       ],
22375       [
22376           "Georgian",
22377           "ქართული",
22378           "ka"
22379       ],
22380       [
22381           "Kazakh",
22382           "қазақша",
22383           "kk"
22384       ],
22385       [
22386           "Khmer",
22387           "ភាសាខ្មែរ",
22388           "km"
22389       ],
22390       [
22391           "Korean",
22392           "한국어",
22393           "ko"
22394       ],
22395       [
22396           "Kurdish",
22397           "Kurdî",
22398           "ku"
22399       ],
22400       [
22401           "Kyrgyz",
22402           "Кыргызча",
22403           "ky"
22404       ],
22405       [
22406           "Latin",
22407           "Latina",
22408           "la"
22409       ],
22410       [
22411           "Limburgish",
22412           "Limburgs",
22413           "li"
22414       ],
22415       [
22416           "Lithuanian",
22417           "lietuvių",
22418           "lt"
22419       ],
22420       [
22421           "Malagasy",
22422           "Malagasy",
22423           "mg"
22424       ],
22425       [
22426           "Macedonian",
22427           "македонски",
22428           "mk"
22429       ],
22430       [
22431           "Malayalam",
22432           "മലയാളം",
22433           "ml"
22434       ],
22435       [
22436           "Marathi",
22437           "मराठी",
22438           "mr"
22439       ],
22440       [
22441           "Malay",
22442           "Bahasa Melayu",
22443           "ms"
22444       ],
22445       [
22446           "Nepali",
22447           "नेपाली",
22448           "ne"
22449       ],
22450       [
22451           "Dutch",
22452           "Nederlands",
22453           "nl"
22454       ],
22455       [
22456           "Norwegian",
22457           "norsk bokmål",
22458           "no"
22459       ],
22460       [
22461           "Occitan",
22462           "occitan",
22463           "oc"
22464       ],
22465       [
22466           "Punjabi",
22467           "ਪੰਜਾਬੀ",
22468           "pa"
22469       ],
22470       [
22471           "Polish",
22472           "polski",
22473           "pl"
22474       ],
22475       [
22476           "Portuguese",
22477           "português",
22478           "pt"
22479       ],
22480       [
22481           "Romanian",
22482           "română",
22483           "ro"
22484       ],
22485       [
22486           "Russian",
22487           "русский",
22488           "ru"
22489       ],
22490       [
22491           "Sanskrit",
22492           "संस्कृतम्",
22493           "sa"
22494       ],
22495       [
22496           "Sinhala",
22497           "සිංහල",
22498           "si"
22499       ],
22500       [
22501           "Slovak",
22502           "slovenčina",
22503           "sk"
22504       ],
22505       [
22506           "Slovenian",
22507           "slovenščina",
22508           "sl"
22509       ],
22510       [
22511           "Albanian",
22512           "shqip",
22513           "sq"
22514       ],
22515       [
22516           "Serbian",
22517           "српски / srpski",
22518           "sr"
22519       ],
22520       [
22521           "Swedish",
22522           "svenska",
22523           "sv"
22524       ],
22525       [
22526           "Tamil",
22527           "தமிழ்",
22528           "ta"
22529       ],
22530       [
22531           "Telugu",
22532           "తెలుగు",
22533           "te"
22534       ],
22535       [
22536           "Tajik",
22537           "тоҷикӣ",
22538           "tg"
22539       ],
22540       [
22541           "Thai",
22542           "ไทย",
22543           "th"
22544       ],
22545       [
22546           "Tagalog",
22547           "Tagalog",
22548           "tl"
22549       ],
22550       [
22551           "Turkish",
22552           "Türkçe",
22553           "tr"
22554       ],
22555       [
22556           "Tatar",
22557           "татарча/tatarça",
22558           "tt"
22559       ],
22560       [
22561           "Ukrainian",
22562           "українська",
22563           "uk"
22564       ],
22565       [
22566           "Urdu",
22567           "اردو",
22568           "ur"
22569       ],
22570       [
22571           "Vietnamese",
22572           "Tiếng Việt",
22573           "vi"
22574       ],
22575       [
22576           "Chinese",
22577           "中文",
22578           "zh"
22579       ]
22580   ];
22581
22582   var wikibooks$1 = /*#__PURE__*/Object.freeze({
22583     default: wikibooks
22584   });
22585
22586   var wikinews = [
22587       [
22588           "Arabic",
22589           "العربية",
22590           "ar"
22591       ],
22592       [
22593           "Bulgarian",
22594           "български",
22595           "bg"
22596       ],
22597       [
22598           "Bosnian",
22599           "bosanski",
22600           "bs"
22601       ],
22602       [
22603           "Catalan",
22604           "català",
22605           "ca"
22606       ],
22607       [
22608           "Czech",
22609           "čeština",
22610           "cs"
22611       ],
22612       [
22613           "German",
22614           "Deutsch",
22615           "de"
22616       ],
22617       [
22618           "Greek",
22619           "Ελληνικά",
22620           "el"
22621       ],
22622       [
22623           "English",
22624           "English",
22625           "en"
22626       ],
22627       [
22628           "Esperanto",
22629           "Esperanto",
22630           "eo"
22631       ],
22632       [
22633           "Spanish",
22634           "español",
22635           "es"
22636       ],
22637       [
22638           "Persian",
22639           "فارسی",
22640           "fa"
22641       ],
22642       [
22643           "Finnish",
22644           "suomi",
22645           "fi"
22646       ],
22647       [
22648           "French",
22649           "français",
22650           "fr"
22651       ],
22652       [
22653           "Hebrew",
22654           "עברית",
22655           "he"
22656       ],
22657       [
22658           "Italian",
22659           "italiano",
22660           "it"
22661       ],
22662       [
22663           "Japanese",
22664           "日本語",
22665           "ja"
22666       ],
22667       [
22668           "Korean",
22669           "한국어",
22670           "ko"
22671       ],
22672       [
22673           "Norwegian",
22674           "norsk bokmål",
22675           "no"
22676       ],
22677       [
22678           "Polish",
22679           "polski",
22680           "pl"
22681       ],
22682       [
22683           "Portuguese",
22684           "português",
22685           "pt"
22686       ],
22687       [
22688           "Romanian",
22689           "română",
22690           "ro"
22691       ],
22692       [
22693           "Russian",
22694           "русский",
22695           "ru"
22696       ],
22697       [
22698           "Albanian",
22699           "shqip",
22700           "sq"
22701       ],
22702       [
22703           "Serbian",
22704           "српски / srpski",
22705           "sr"
22706       ],
22707       [
22708           "Swedish",
22709           "svenska",
22710           "sv"
22711       ],
22712       [
22713           "Tamil",
22714           "தமிழ்",
22715           "ta"
22716       ],
22717       [
22718           "Turkish",
22719           "Türkçe",
22720           "tr"
22721       ],
22722       [
22723           "Ukrainian",
22724           "українська",
22725           "uk"
22726       ],
22727       [
22728           "Chinese",
22729           "中文",
22730           "zh"
22731       ]
22732   ];
22733
22734   var wikinews$1 = /*#__PURE__*/Object.freeze({
22735     default: wikinews
22736   });
22737
22738   var wikiquote = [
22739       [
22740           "Afrikaans",
22741           "Afrikaans",
22742           "af"
22743       ],
22744       [
22745           "Arabic",
22746           "العربية",
22747           "ar"
22748       ],
22749       [
22750           "Azerbaijani",
22751           "azərbaycanca",
22752           "az"
22753       ],
22754       [
22755           "Belarusian",
22756           "беларуская",
22757           "be"
22758       ],
22759       [
22760           "Bulgarian",
22761           "български",
22762           "bg"
22763       ],
22764       [
22765           "Breton",
22766           "brezhoneg",
22767           "br"
22768       ],
22769       [
22770           "Bosnian",
22771           "bosanski",
22772           "bs"
22773       ],
22774       [
22775           "Catalan",
22776           "català",
22777           "ca"
22778       ],
22779       [
22780           "Czech",
22781           "čeština",
22782           "cs"
22783       ],
22784       [
22785           "Welsh",
22786           "Cymraeg",
22787           "cy"
22788       ],
22789       [
22790           "Danish",
22791           "dansk",
22792           "da"
22793       ],
22794       [
22795           "German",
22796           "Deutsch",
22797           "de"
22798       ],
22799       [
22800           "Greek",
22801           "Ελληνικά",
22802           "el"
22803       ],
22804       [
22805           "English",
22806           "English",
22807           "en"
22808       ],
22809       [
22810           "Esperanto",
22811           "Esperanto",
22812           "eo"
22813       ],
22814       [
22815           "Spanish",
22816           "español",
22817           "es"
22818       ],
22819       [
22820           "Estonian",
22821           "eesti",
22822           "et"
22823       ],
22824       [
22825           "Basque",
22826           "euskara",
22827           "eu"
22828       ],
22829       [
22830           "Persian",
22831           "فارسی",
22832           "fa"
22833       ],
22834       [
22835           "Finnish",
22836           "suomi",
22837           "fi"
22838       ],
22839       [
22840           "French",
22841           "français",
22842           "fr"
22843       ],
22844       [
22845           "Galician",
22846           "galego",
22847           "gl"
22848       ],
22849       [
22850           "Gujarati",
22851           "ગુજરાતી",
22852           "gu"
22853       ],
22854       [
22855           "Hebrew",
22856           "עברית",
22857           "he"
22858       ],
22859       [
22860           "Hindi",
22861           "हिन्दी",
22862           "hi"
22863       ],
22864       [
22865           "Croatian",
22866           "hrvatski",
22867           "hr"
22868       ],
22869       [
22870           "Hungarian",
22871           "magyar",
22872           "hu"
22873       ],
22874       [
22875           "Armenian",
22876           "Հայերեն",
22877           "hy"
22878       ],
22879       [
22880           "Indonesian",
22881           "Bahasa Indonesia",
22882           "id"
22883       ],
22884       [
22885           "Icelandic",
22886           "íslenska",
22887           "is"
22888       ],
22889       [
22890           "Italian",
22891           "italiano",
22892           "it"
22893       ],
22894       [
22895           "Japanese",
22896           "日本語",
22897           "ja"
22898       ],
22899       [
22900           "Georgian",
22901           "ქართული",
22902           "ka"
22903       ],
22904       [
22905           "Kannada",
22906           "ಕನ್ನಡ",
22907           "kn"
22908       ],
22909       [
22910           "Korean",
22911           "한국어",
22912           "ko"
22913       ],
22914       [
22915           "Kurdish",
22916           "Kurdî",
22917           "ku"
22918       ],
22919       [
22920           "Kyrgyz",
22921           "Кыргызча",
22922           "ky"
22923       ],
22924       [
22925           "Latin",
22926           "Latina",
22927           "la"
22928       ],
22929       [
22930           "Limburgish",
22931           "Limburgs",
22932           "li"
22933       ],
22934       [
22935           "Lithuanian",
22936           "lietuvių",
22937           "lt"
22938       ],
22939       [
22940           "Malayalam",
22941           "മലയാളം",
22942           "ml"
22943       ],
22944       [
22945           "Marathi",
22946           "मराठी",
22947           "mr"
22948       ],
22949       [
22950           "Dutch",
22951           "Nederlands",
22952           "nl"
22953       ],
22954       [
22955           "Norwegian Nynorsk",
22956           "norsk nynorsk",
22957           "nn"
22958       ],
22959       [
22960           "Norwegian",
22961           "norsk bokmål",
22962           "no"
22963       ],
22964       [
22965           "Polish",
22966           "polski",
22967           "pl"
22968       ],
22969       [
22970           "Portuguese",
22971           "português",
22972           "pt"
22973       ],
22974       [
22975           "Romanian",
22976           "română",
22977           "ro"
22978       ],
22979       [
22980           "Russian",
22981           "русский",
22982           "ru"
22983       ],
22984       [
22985           "Sanskrit",
22986           "संस्कृतम्",
22987           "sa"
22988       ],
22989       [
22990           "Slovak",
22991           "slovenčina",
22992           "sk"
22993       ],
22994       [
22995           "Slovenian",
22996           "slovenščina",
22997           "sl"
22998       ],
22999       [
23000           "Albanian",
23001           "shqip",
23002           "sq"
23003       ],
23004       [
23005           "Serbian",
23006           "српски / srpski",
23007           "sr"
23008       ],
23009       [
23010           "Sundanese",
23011           "Basa Sunda",
23012           "su"
23013       ],
23014       [
23015           "Swedish",
23016           "svenska",
23017           "sv"
23018       ],
23019       [
23020           "Tamil",
23021           "தமிழ்",
23022           "ta"
23023       ],
23024       [
23025           "Telugu",
23026           "తెలుగు",
23027           "te"
23028       ],
23029       [
23030           "Thai",
23031           "ไทย",
23032           "th"
23033       ],
23034       [
23035           "Turkish",
23036           "Türkçe",
23037           "tr"
23038       ],
23039       [
23040           "Ukrainian",
23041           "українська",
23042           "uk"
23043       ],
23044       [
23045           "Urdu",
23046           "اردو",
23047           "ur"
23048       ],
23049       [
23050           "Uzbek",
23051           "oʻzbekcha/ўзбекча",
23052           "uz"
23053       ],
23054       [
23055           "Vietnamese",
23056           "Tiếng Việt",
23057           "vi"
23058       ],
23059       [
23060           "Wolof",
23061           "Wolof",
23062           "wo"
23063       ],
23064       [
23065           "Chinese",
23066           "中文",
23067           "zh"
23068       ]
23069   ];
23070
23071   var wikiquote$1 = /*#__PURE__*/Object.freeze({
23072     default: wikiquote
23073   });
23074
23075   var wikiversity = [
23076       [
23077           "Arabic",
23078           "العربية",
23079           "ar"
23080       ],
23081       [
23082           "Czech",
23083           "čeština",
23084           "cs"
23085       ],
23086       [
23087           "German",
23088           "Deutsch",
23089           "de"
23090       ],
23091       [
23092           "Greek",
23093           "Ελληνικά",
23094           "el"
23095       ],
23096       [
23097           "English",
23098           "English",
23099           "en"
23100       ],
23101       [
23102           "Spanish",
23103           "español",
23104           "es"
23105       ],
23106       [
23107           "Finnish",
23108           "suomi",
23109           "fi"
23110       ],
23111       [
23112           "French",
23113           "français",
23114           "fr"
23115       ],
23116       [
23117           "Italian",
23118           "italiano",
23119           "it"
23120       ],
23121       [
23122           "Japanese",
23123           "日本語",
23124           "ja"
23125       ],
23126       [
23127           "Korean",
23128           "한국어",
23129           "ko"
23130       ],
23131       [
23132           "Portuguese",
23133           "português",
23134           "pt"
23135       ],
23136       [
23137           "Russian",
23138           "русский",
23139           "ru"
23140       ],
23141       [
23142           "Slovenian",
23143           "slovenščina",
23144           "sl"
23145       ],
23146       [
23147           "Swedish",
23148           "svenska",
23149           "sv"
23150       ]
23151   ];
23152
23153   var wikiversity$1 = /*#__PURE__*/Object.freeze({
23154     default: wikiversity
23155   });
23156
23157   var wikivoyage = [
23158       [
23159           "German",
23160           "Deutsch",
23161           "de"
23162       ],
23163       [
23164           "Greek",
23165           "Ελληνικά",
23166           "el"
23167       ],
23168       [
23169           "English",
23170           "English",
23171           "en"
23172       ],
23173       [
23174           "Spanish",
23175           "español",
23176           "es"
23177       ],
23178       [
23179           "Persian",
23180           "فارسی",
23181           "fa"
23182       ],
23183       [
23184           "Finnish",
23185           "suomi",
23186           "fi"
23187       ],
23188       [
23189           "French",
23190           "français",
23191           "fr"
23192       ],
23193       [
23194           "Hebrew",
23195           "עברית",
23196           "he"
23197       ],
23198       [
23199           "Italian",
23200           "italiano",
23201           "it"
23202       ],
23203       [
23204           "Dutch",
23205           "Nederlands",
23206           "nl"
23207       ],
23208       [
23209           "Polish",
23210           "polski",
23211           "pl"
23212       ],
23213       [
23214           "Portuguese",
23215           "português",
23216           "pt"
23217       ],
23218       [
23219           "Romanian",
23220           "română",
23221           "ro"
23222       ],
23223       [
23224           "Russian",
23225           "русский",
23226           "ru"
23227       ],
23228       [
23229           "Swedish",
23230           "svenska",
23231           "sv"
23232       ],
23233       [
23234           "Ukrainian",
23235           "українська",
23236           "uk"
23237       ],
23238       [
23239           "Vietnamese",
23240           "Tiếng Việt",
23241           "vi"
23242       ],
23243       [
23244           "Chinese",
23245           "中文",
23246           "zh"
23247       ]
23248   ];
23249
23250   var wikivoyage$1 = /*#__PURE__*/Object.freeze({
23251     default: wikivoyage
23252   });
23253
23254   var wiktionary = [
23255       [
23256           "Afrikaans",
23257           "Afrikaans",
23258           "af"
23259       ],
23260       [
23261           "Amharic",
23262           "አማርኛ",
23263           "am"
23264       ],
23265       [
23266           "Aragonese",
23267           "aragonés",
23268           "an"
23269       ],
23270       [
23271           "Old English",
23272           "Ænglisc",
23273           "ang"
23274       ],
23275       [
23276           "Arabic",
23277           "العربية",
23278           "ar"
23279       ],
23280       [
23281           "Asturian",
23282           "asturianu",
23283           "ast"
23284       ],
23285       [
23286           "Aymara",
23287           "Aymar aru",
23288           "ay"
23289       ],
23290       [
23291           "Azerbaijani",
23292           "azərbaycanca",
23293           "az"
23294       ],
23295       [
23296           "Belarusian",
23297           "беларуская",
23298           "be"
23299       ],
23300       [
23301           "Bulgarian",
23302           "български",
23303           "bg"
23304       ],
23305       [
23306           "Bangla",
23307           "বাংলা",
23308           "bn"
23309       ],
23310       [
23311           "Breton",
23312           "brezhoneg",
23313           "br"
23314       ],
23315       [
23316           "Bosnian",
23317           "bosanski",
23318           "bs"
23319       ],
23320       [
23321           "Catalan",
23322           "català",
23323           "ca"
23324       ],
23325       [
23326           "Cherokee",
23327           "ᏣᎳᎩ",
23328           "chr"
23329       ],
23330       [
23331           "Corsican",
23332           "corsu",
23333           "co"
23334       ],
23335       [
23336           "Czech",
23337           "čeština",
23338           "cs"
23339       ],
23340       [
23341           "Kashubian",
23342           "kaszëbsczi",
23343           "csb"
23344       ],
23345       [
23346           "Welsh",
23347           "Cymraeg",
23348           "cy"
23349       ],
23350       [
23351           "Danish",
23352           "dansk",
23353           "da"
23354       ],
23355       [
23356           "German",
23357           "Deutsch",
23358           "de"
23359       ],
23360       [
23361           "Divehi",
23362           "ދިވެހިބަސް",
23363           "dv"
23364       ],
23365       [
23366           "Greek",
23367           "Ελληνικά",
23368           "el"
23369       ],
23370       [
23371           "English",
23372           "English",
23373           "en"
23374       ],
23375       [
23376           "Esperanto",
23377           "Esperanto",
23378           "eo"
23379       ],
23380       [
23381           "Spanish",
23382           "español",
23383           "es"
23384       ],
23385       [
23386           "Estonian",
23387           "eesti",
23388           "et"
23389       ],
23390       [
23391           "Basque",
23392           "euskara",
23393           "eu"
23394       ],
23395       [
23396           "Persian",
23397           "فارسی",
23398           "fa"
23399       ],
23400       [
23401           "Finnish",
23402           "suomi",
23403           "fi"
23404       ],
23405       [
23406           "Fijian",
23407           "Na Vosa Vakaviti",
23408           "fj"
23409       ],
23410       [
23411           "Faroese",
23412           "føroyskt",
23413           "fo"
23414       ],
23415       [
23416           "French",
23417           "français",
23418           "fr"
23419       ],
23420       [
23421           "Western Frisian",
23422           "Frysk",
23423           "fy"
23424       ],
23425       [
23426           "Irish",
23427           "Gaeilge",
23428           "ga"
23429       ],
23430       [
23431           "Scottish Gaelic",
23432           "Gàidhlig",
23433           "gd"
23434       ],
23435       [
23436           "Galician",
23437           "galego",
23438           "gl"
23439       ],
23440       [
23441           "Guarani",
23442           "Avañe'ẽ",
23443           "gn"
23444       ],
23445       [
23446           "Gujarati",
23447           "ગુજરાતી",
23448           "gu"
23449       ],
23450       [
23451           "Manx",
23452           "Gaelg",
23453           "gv"
23454       ],
23455       [
23456           "Hausa",
23457           "Hausa",
23458           "ha"
23459       ],
23460       [
23461           "Hebrew",
23462           "עברית",
23463           "he"
23464       ],
23465       [
23466           "Hindi",
23467           "हिन्दी",
23468           "hi"
23469       ],
23470       [
23471           "Croatian",
23472           "hrvatski",
23473           "hr"
23474       ],
23475       [
23476           "Upper Sorbian",
23477           "hornjoserbsce",
23478           "hsb"
23479       ],
23480       [
23481           "Hungarian",
23482           "magyar",
23483           "hu"
23484       ],
23485       [
23486           "Armenian",
23487           "Հայերեն",
23488           "hy"
23489       ],
23490       [
23491           "Interlingua",
23492           "interlingua",
23493           "ia"
23494       ],
23495       [
23496           "Indonesian",
23497           "Bahasa Indonesia",
23498           "id"
23499       ],
23500       [
23501           "Interlingue",
23502           "Interlingue",
23503           "ie"
23504       ],
23505       [
23506           "Ido",
23507           "Ido",
23508           "io"
23509       ],
23510       [
23511           "Icelandic",
23512           "íslenska",
23513           "is"
23514       ],
23515       [
23516           "Italian",
23517           "italiano",
23518           "it"
23519       ],
23520       [
23521           "Inuktitut",
23522           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
23523           "iu"
23524       ],
23525       [
23526           "Japanese",
23527           "日本語",
23528           "ja"
23529       ],
23530       [
23531           "Lojban",
23532           "la .lojban.",
23533           "jbo"
23534       ],
23535       [
23536           "Javanese",
23537           "Basa Jawa",
23538           "jv"
23539       ],
23540       [
23541           "Georgian",
23542           "ქართული",
23543           "ka"
23544       ],
23545       [
23546           "Kazakh",
23547           "қазақша",
23548           "kk"
23549       ],
23550       [
23551           "Kalaallisut",
23552           "kalaallisut",
23553           "kl"
23554       ],
23555       [
23556           "Khmer",
23557           "ភាសាខ្មែរ",
23558           "km"
23559       ],
23560       [
23561           "Kannada",
23562           "ಕನ್ನಡ",
23563           "kn"
23564       ],
23565       [
23566           "Korean",
23567           "한국어",
23568           "ko"
23569       ],
23570       [
23571           "Kashmiri",
23572           "कॉशुर / کٲشُر",
23573           "ks"
23574       ],
23575       [
23576           "Kurdish",
23577           "Kurdî",
23578           "ku"
23579       ],
23580       [
23581           "Cornish",
23582           "kernowek",
23583           "kw"
23584       ],
23585       [
23586           "Kyrgyz",
23587           "Кыргызча",
23588           "ky"
23589       ],
23590       [
23591           "Latin",
23592           "Latina",
23593           "la"
23594       ],
23595       [
23596           "Luxembourgish",
23597           "Lëtzebuergesch",
23598           "lb"
23599       ],
23600       [
23601           "Limburgish",
23602           "Limburgs",
23603           "li"
23604       ],
23605       [
23606           "Lingala",
23607           "lingála",
23608           "ln"
23609       ],
23610       [
23611           "Lao",
23612           "ລາວ",
23613           "lo"
23614       ],
23615       [
23616           "Lithuanian",
23617           "lietuvių",
23618           "lt"
23619       ],
23620       [
23621           "Latvian",
23622           "latviešu",
23623           "lv"
23624       ],
23625       [
23626           "Malagasy",
23627           "Malagasy",
23628           "mg"
23629       ],
23630       [
23631           "Maori",
23632           "Māori",
23633           "mi"
23634       ],
23635       [
23636           "Macedonian",
23637           "македонски",
23638           "mk"
23639       ],
23640       [
23641           "Malayalam",
23642           "മലയാളം",
23643           "ml"
23644       ],
23645       [
23646           "Mongolian",
23647           "монгол",
23648           "mn"
23649       ],
23650       [
23651           "Marathi",
23652           "मराठी",
23653           "mr"
23654       ],
23655       [
23656           "Malay",
23657           "Bahasa Melayu",
23658           "ms"
23659       ],
23660       [
23661           "Maltese",
23662           "Malti",
23663           "mt"
23664       ],
23665       [
23666           "Burmese",
23667           "မြန်မာဘာသာ",
23668           "my"
23669       ],
23670       [
23671           "Nauru",
23672           "Dorerin Naoero",
23673           "na"
23674       ],
23675       [
23676           "Nāhuatl",
23677           "Nāhuatl",
23678           "nah"
23679       ],
23680       [
23681           "Low German",
23682           "Plattdüütsch",
23683           "nds"
23684       ],
23685       [
23686           "Nepali",
23687           "नेपाली",
23688           "ne"
23689       ],
23690       [
23691           "Dutch",
23692           "Nederlands",
23693           "nl"
23694       ],
23695       [
23696           "Norwegian Nynorsk",
23697           "norsk nynorsk",
23698           "nn"
23699       ],
23700       [
23701           "Norwegian",
23702           "norsk bokmål",
23703           "no"
23704       ],
23705       [
23706           "Occitan",
23707           "occitan",
23708           "oc"
23709       ],
23710       [
23711           "Oromo",
23712           "Oromoo",
23713           "om"
23714       ],
23715       [
23716           "Odia",
23717           "ଓଡ଼ିଆ",
23718           "or"
23719       ],
23720       [
23721           "Punjabi",
23722           "ਪੰਜਾਬੀ",
23723           "pa"
23724       ],
23725       [
23726           "Polish",
23727           "polski",
23728           "pl"
23729       ],
23730       [
23731           "Western Punjabi",
23732           "پنجابی",
23733           "pnb"
23734       ],
23735       [
23736           "Pashto",
23737           "پښتو",
23738           "ps"
23739       ],
23740       [
23741           "Portuguese",
23742           "português",
23743           "pt"
23744       ],
23745       [
23746           "Quechua",
23747           "Runa Simi",
23748           "qu"
23749       ],
23750       [
23751           "Romanian",
23752           "română",
23753           "ro"
23754       ],
23755       [
23756           "Aromanian",
23757           "armãneashti",
23758           "roa-rup"
23759       ],
23760       [
23761           "Russian",
23762           "русский",
23763           "ru"
23764       ],
23765       [
23766           "Kinyarwanda",
23767           "Kinyarwanda",
23768           "rw"
23769       ],
23770       [
23771           "Sanskrit",
23772           "संस्कृतम्",
23773           "sa"
23774       ],
23775       [
23776           "Sicilian",
23777           "sicilianu",
23778           "scn"
23779       ],
23780       [
23781           "Sindhi",
23782           "سنڌي",
23783           "sd"
23784       ],
23785       [
23786           "Sango",
23787           "Sängö",
23788           "sg"
23789       ],
23790       [
23791           "Serbo-Croatian",
23792           "srpskohrvatski / српскохрватски",
23793           "sh"
23794       ],
23795       [
23796           "Sinhala",
23797           "සිංහල",
23798           "si"
23799       ],
23800       [
23801           "Simple English",
23802           "Simple English",
23803           "simple"
23804       ],
23805       [
23806           "Slovak",
23807           "slovenčina",
23808           "sk"
23809       ],
23810       [
23811           "Slovenian",
23812           "slovenščina",
23813           "sl"
23814       ],
23815       [
23816           "Samoan",
23817           "Gagana Samoa",
23818           "sm"
23819       ],
23820       [
23821           "Somali",
23822           "Soomaaliga",
23823           "so"
23824       ],
23825       [
23826           "Albanian",
23827           "shqip",
23828           "sq"
23829       ],
23830       [
23831           "Serbian",
23832           "српски / srpski",
23833           "sr"
23834       ],
23835       [
23836           "Swati",
23837           "SiSwati",
23838           "ss"
23839       ],
23840       [
23841           "Southern Sotho",
23842           "Sesotho",
23843           "st"
23844       ],
23845       [
23846           "Sundanese",
23847           "Basa Sunda",
23848           "su"
23849       ],
23850       [
23851           "Swedish",
23852           "svenska",
23853           "sv"
23854       ],
23855       [
23856           "Swahili",
23857           "Kiswahili",
23858           "sw"
23859       ],
23860       [
23861           "Tamil",
23862           "தமிழ்",
23863           "ta"
23864       ],
23865       [
23866           "Telugu",
23867           "తెలుగు",
23868           "te"
23869       ],
23870       [
23871           "Tajik",
23872           "тоҷикӣ",
23873           "tg"
23874       ],
23875       [
23876           "Thai",
23877           "ไทย",
23878           "th"
23879       ],
23880       [
23881           "Tigrinya",
23882           "ትግርኛ",
23883           "ti"
23884       ],
23885       [
23886           "Turkmen",
23887           "Türkmençe",
23888           "tk"
23889       ],
23890       [
23891           "Tagalog",
23892           "Tagalog",
23893           "tl"
23894       ],
23895       [
23896           "Tswana",
23897           "Setswana",
23898           "tn"
23899       ],
23900       [
23901           "Tok Pisin",
23902           "Tok Pisin",
23903           "tpi"
23904       ],
23905       [
23906           "Turkish",
23907           "Türkçe",
23908           "tr"
23909       ],
23910       [
23911           "Tsonga",
23912           "Xitsonga",
23913           "ts"
23914       ],
23915       [
23916           "Tatar",
23917           "татарча/tatarça",
23918           "tt"
23919       ],
23920       [
23921           "Uyghur",
23922           "ئۇيغۇرچە / Uyghurche",
23923           "ug"
23924       ],
23925       [
23926           "Ukrainian",
23927           "українська",
23928           "uk"
23929       ],
23930       [
23931           "Urdu",
23932           "اردو",
23933           "ur"
23934       ],
23935       [
23936           "Uzbek",
23937           "oʻzbekcha/ўзбекча",
23938           "uz"
23939       ],
23940       [
23941           "Venetian",
23942           "vèneto",
23943           "vec"
23944       ],
23945       [
23946           "Vietnamese",
23947           "Tiếng Việt",
23948           "vi"
23949       ],
23950       [
23951           "Volapük",
23952           "Volapük",
23953           "vo"
23954       ],
23955       [
23956           "Walloon",
23957           "walon",
23958           "wa"
23959       ],
23960       [
23961           "Wolof",
23962           "Wolof",
23963           "wo"
23964       ],
23965       [
23966           "Yiddish",
23967           "ייִדיש",
23968           "yi"
23969       ],
23970       [
23971           "Chinese",
23972           "中文",
23973           "zh"
23974       ],
23975       [
23976           "Chinese (Min Nan)",
23977           "Bân-lâm-gú",
23978           "zh-min-nan"
23979       ],
23980       [
23981           "Zulu",
23982           "isiZulu",
23983           "zu"
23984       ]
23985   ];
23986
23987   var wiktionary$1 = /*#__PURE__*/Object.freeze({
23988     default: wiktionary
23989   });
23990
23991   var wikipedia = [
23992       [
23993           "Abkhazian",
23994           "Аҧсшәа",
23995           "ab"
23996       ],
23997       [
23998           "Achinese",
23999           "Acèh",
24000           "ace"
24001       ],
24002       [
24003           "Adyghe",
24004           "адыгабзэ",
24005           "ady"
24006       ],
24007       [
24008           "Afrikaans",
24009           "Afrikaans",
24010           "af"
24011       ],
24012       [
24013           "Akan",
24014           "Akan",
24015           "ak"
24016       ],
24017       [
24018           "Alemannisch",
24019           "Alemannisch",
24020           "als"
24021       ],
24022       [
24023           "Amharic",
24024           "አማርኛ",
24025           "am"
24026       ],
24027       [
24028           "Aragonese",
24029           "aragonés",
24030           "an"
24031       ],
24032       [
24033           "Old English",
24034           "Ænglisc",
24035           "ang"
24036       ],
24037       [
24038           "Arabic",
24039           "العربية",
24040           "ar"
24041       ],
24042       [
24043           "Aramaic",
24044           "ܐܪܡܝܐ",
24045           "arc"
24046       ],
24047       [
24048           "Egyptian Arabic",
24049           "مصرى",
24050           "arz"
24051       ],
24052       [
24053           "Assamese",
24054           "অসমীয়া",
24055           "as"
24056       ],
24057       [
24058           "Asturian",
24059           "asturianu",
24060           "ast"
24061       ],
24062       [
24063           "Avaric",
24064           "авар",
24065           "av"
24066       ],
24067       [
24068           "Aymara",
24069           "Aymar aru",
24070           "ay"
24071       ],
24072       [
24073           "Azerbaijani",
24074           "azərbaycanca",
24075           "az"
24076       ],
24077       [
24078           "تۆرکجه",
24079           "تۆرکجه",
24080           "azb"
24081       ],
24082       [
24083           "Bashkir",
24084           "башҡортса",
24085           "ba"
24086       ],
24087       [
24088           "Bavarian",
24089           "Boarisch",
24090           "bar"
24091       ],
24092       [
24093           "Samogitian",
24094           "žemaitėška",
24095           "bat-smg"
24096       ],
24097       [
24098           "Bikol Central",
24099           "Bikol Central",
24100           "bcl"
24101       ],
24102       [
24103           "Belarusian",
24104           "беларуская",
24105           "be"
24106       ],
24107       [
24108           "беларуская (тарашкевіца)‎",
24109           "беларуская (тарашкевіца)‎",
24110           "be-x-old"
24111       ],
24112       [
24113           "Bulgarian",
24114           "български",
24115           "bg"
24116       ],
24117       [
24118           "भोजपुरी",
24119           "भोजपुरी",
24120           "bh"
24121       ],
24122       [
24123           "Bislama",
24124           "Bislama",
24125           "bi"
24126       ],
24127       [
24128           "Banjar",
24129           "Bahasa Banjar",
24130           "bjn"
24131       ],
24132       [
24133           "Bambara",
24134           "bamanankan",
24135           "bm"
24136       ],
24137       [
24138           "Bangla",
24139           "বাংলা",
24140           "bn"
24141       ],
24142       [
24143           "Tibetan",
24144           "བོད་ཡིག",
24145           "bo"
24146       ],
24147       [
24148           "Bishnupriya",
24149           "বিষ্ণুপ্রিয়া মণিপুরী",
24150           "bpy"
24151       ],
24152       [
24153           "Breton",
24154           "brezhoneg",
24155           "br"
24156       ],
24157       [
24158           "Bosnian",
24159           "bosanski",
24160           "bs"
24161       ],
24162       [
24163           "Buginese",
24164           "ᨅᨔ ᨕᨘᨁᨗ",
24165           "bug"
24166       ],
24167       [
24168           "буряад",
24169           "буряад",
24170           "bxr"
24171       ],
24172       [
24173           "Catalan",
24174           "català",
24175           "ca"
24176       ],
24177       [
24178           "Chavacano de Zamboanga",
24179           "Chavacano de Zamboanga",
24180           "cbk-zam"
24181       ],
24182       [
24183           "Min Dong Chinese",
24184           "Mìng-dĕ̤ng-ngṳ̄",
24185           "cdo"
24186       ],
24187       [
24188           "Chechen",
24189           "нохчийн",
24190           "ce"
24191       ],
24192       [
24193           "Cebuano",
24194           "Cebuano",
24195           "ceb"
24196       ],
24197       [
24198           "Chamorro",
24199           "Chamoru",
24200           "ch"
24201       ],
24202       [
24203           "Cherokee",
24204           "ᏣᎳᎩ",
24205           "chr"
24206       ],
24207       [
24208           "Cheyenne",
24209           "Tsetsêhestâhese",
24210           "chy"
24211       ],
24212       [
24213           "Central Kurdish",
24214           "کوردیی ناوەندی",
24215           "ckb"
24216       ],
24217       [
24218           "Corsican",
24219           "corsu",
24220           "co"
24221       ],
24222       [
24223           "Cree",
24224           "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
24225           "cr"
24226       ],
24227       [
24228           "Crimean Turkish",
24229           "qırımtatarca",
24230           "crh"
24231       ],
24232       [
24233           "Czech",
24234           "čeština",
24235           "cs"
24236       ],
24237       [
24238           "Kashubian",
24239           "kaszëbsczi",
24240           "csb"
24241       ],
24242       [
24243           "Church Slavic",
24244           "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
24245           "cu"
24246       ],
24247       [
24248           "Chuvash",
24249           "Чӑвашла",
24250           "cv"
24251       ],
24252       [
24253           "Welsh",
24254           "Cymraeg",
24255           "cy"
24256       ],
24257       [
24258           "Danish",
24259           "dansk",
24260           "da"
24261       ],
24262       [
24263           "German",
24264           "Deutsch",
24265           "de"
24266       ],
24267       [
24268           "Zazaki",
24269           "Zazaki",
24270           "diq"
24271       ],
24272       [
24273           "Lower Sorbian",
24274           "dolnoserbski",
24275           "dsb"
24276       ],
24277       [
24278           "Divehi",
24279           "ދިވެހިބަސް",
24280           "dv"
24281       ],
24282       [
24283           "Dzongkha",
24284           "ཇོང་ཁ",
24285           "dz"
24286       ],
24287       [
24288           "Ewe",
24289           "eʋegbe",
24290           "ee"
24291       ],
24292       [
24293           "Greek",
24294           "Ελληνικά",
24295           "el"
24296       ],
24297       [
24298           "Emiliano-Romagnolo",
24299           "emiliàn e rumagnòl",
24300           "eml"
24301       ],
24302       [
24303           "English",
24304           "English",
24305           "en"
24306       ],
24307       [
24308           "Esperanto",
24309           "Esperanto",
24310           "eo"
24311       ],
24312       [
24313           "Spanish",
24314           "español",
24315           "es"
24316       ],
24317       [
24318           "Estonian",
24319           "eesti",
24320           "et"
24321       ],
24322       [
24323           "Basque",
24324           "euskara",
24325           "eu"
24326       ],
24327       [
24328           "Extremaduran",
24329           "estremeñu",
24330           "ext"
24331       ],
24332       [
24333           "Persian",
24334           "فارسی",
24335           "fa"
24336       ],
24337       [
24338           "Fulah",
24339           "Fulfulde",
24340           "ff"
24341       ],
24342       [
24343           "Finnish",
24344           "suomi",
24345           "fi"
24346       ],
24347       [
24348           "Võro",
24349           "Võro",
24350           "fiu-vro"
24351       ],
24352       [
24353           "Fijian",
24354           "Na Vosa Vakaviti",
24355           "fj"
24356       ],
24357       [
24358           "Faroese",
24359           "føroyskt",
24360           "fo"
24361       ],
24362       [
24363           "French",
24364           "français",
24365           "fr"
24366       ],
24367       [
24368           "Arpitan",
24369           "arpetan",
24370           "frp"
24371       ],
24372       [
24373           "Northern Frisian",
24374           "Nordfriisk",
24375           "frr"
24376       ],
24377       [
24378           "Friulian",
24379           "furlan",
24380           "fur"
24381       ],
24382       [
24383           "Western Frisian",
24384           "Frysk",
24385           "fy"
24386       ],
24387       [
24388           "Irish",
24389           "Gaeilge",
24390           "ga"
24391       ],
24392       [
24393           "Gagauz",
24394           "Gagauz",
24395           "gag"
24396       ],
24397       [
24398           "Gan Chinese",
24399           "贛語",
24400           "gan"
24401       ],
24402       [
24403           "Scottish Gaelic",
24404           "Gàidhlig",
24405           "gd"
24406       ],
24407       [
24408           "Galician",
24409           "galego",
24410           "gl"
24411       ],
24412       [
24413           "Gilaki",
24414           "گیلکی",
24415           "glk"
24416       ],
24417       [
24418           "Guarani",
24419           "Avañe'ẽ",
24420           "gn"
24421       ],
24422       [
24423           "Goan Konkani",
24424           "गोंयची कोंकणी / Gõychi Konknni",
24425           "gom"
24426       ],
24427       [
24428           "Gothic",
24429           "𐌲𐌿𐍄𐌹𐍃𐌺",
24430           "got"
24431       ],
24432       [
24433           "Gujarati",
24434           "ગુજરાતી",
24435           "gu"
24436       ],
24437       [
24438           "Manx",
24439           "Gaelg",
24440           "gv"
24441       ],
24442       [
24443           "Hausa",
24444           "Hausa",
24445           "ha"
24446       ],
24447       [
24448           "Hakka Chinese",
24449           "客家語/Hak-kâ-ngî",
24450           "hak"
24451       ],
24452       [
24453           "Hawaiian",
24454           "Hawaiʻi",
24455           "haw"
24456       ],
24457       [
24458           "Hebrew",
24459           "עברית",
24460           "he"
24461       ],
24462       [
24463           "Hindi",
24464           "हिन्दी",
24465           "hi"
24466       ],
24467       [
24468           "Fiji Hindi",
24469           "Fiji Hindi",
24470           "hif"
24471       ],
24472       [
24473           "Croatian",
24474           "hrvatski",
24475           "hr"
24476       ],
24477       [
24478           "Upper Sorbian",
24479           "hornjoserbsce",
24480           "hsb"
24481       ],
24482       [
24483           "Haitian Creole",
24484           "Kreyòl ayisyen",
24485           "ht"
24486       ],
24487       [
24488           "Hungarian",
24489           "magyar",
24490           "hu"
24491       ],
24492       [
24493           "Armenian",
24494           "Հայերեն",
24495           "hy"
24496       ],
24497       [
24498           "Interlingua",
24499           "interlingua",
24500           "ia"
24501       ],
24502       [
24503           "Indonesian",
24504           "Bahasa Indonesia",
24505           "id"
24506       ],
24507       [
24508           "Interlingue",
24509           "Interlingue",
24510           "ie"
24511       ],
24512       [
24513           "Igbo",
24514           "Igbo",
24515           "ig"
24516       ],
24517       [
24518           "Inupiaq",
24519           "Iñupiak",
24520           "ik"
24521       ],
24522       [
24523           "Iloko",
24524           "Ilokano",
24525           "ilo"
24526       ],
24527       [
24528           "Ido",
24529           "Ido",
24530           "io"
24531       ],
24532       [
24533           "Icelandic",
24534           "íslenska",
24535           "is"
24536       ],
24537       [
24538           "Italian",
24539           "italiano",
24540           "it"
24541       ],
24542       [
24543           "Inuktitut",
24544           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
24545           "iu"
24546       ],
24547       [
24548           "Japanese",
24549           "日本語",
24550           "ja"
24551       ],
24552       [
24553           "Jamaican Creole English",
24554           "Patois",
24555           "jam"
24556       ],
24557       [
24558           "Lojban",
24559           "la .lojban.",
24560           "jbo"
24561       ],
24562       [
24563           "Javanese",
24564           "Basa Jawa",
24565           "jv"
24566       ],
24567       [
24568           "Georgian",
24569           "ქართული",
24570           "ka"
24571       ],
24572       [
24573           "Kara-Kalpak",
24574           "Qaraqalpaqsha",
24575           "kaa"
24576       ],
24577       [
24578           "Kabyle",
24579           "Taqbaylit",
24580           "kab"
24581       ],
24582       [
24583           "Kabardian",
24584           "Адыгэбзэ",
24585           "kbd"
24586       ],
24587       [
24588           "Kongo",
24589           "Kongo",
24590           "kg"
24591       ],
24592       [
24593           "Kikuyu",
24594           "Gĩkũyũ",
24595           "ki"
24596       ],
24597       [
24598           "Kazakh",
24599           "қазақша",
24600           "kk"
24601       ],
24602       [
24603           "Kalaallisut",
24604           "kalaallisut",
24605           "kl"
24606       ],
24607       [
24608           "Khmer",
24609           "ភាសាខ្មែរ",
24610           "km"
24611       ],
24612       [
24613           "Kannada",
24614           "ಕನ್ನಡ",
24615           "kn"
24616       ],
24617       [
24618           "Korean",
24619           "한국어",
24620           "ko"
24621       ],
24622       [
24623           "Komi-Permyak",
24624           "Перем Коми",
24625           "koi"
24626       ],
24627       [
24628           "Karachay-Balkar",
24629           "къарачай-малкъар",
24630           "krc"
24631       ],
24632       [
24633           "Kashmiri",
24634           "कॉशुर / کٲشُر",
24635           "ks"
24636       ],
24637       [
24638           "Colognian",
24639           "Ripoarisch",
24640           "ksh"
24641       ],
24642       [
24643           "Kurdish",
24644           "Kurdî",
24645           "ku"
24646       ],
24647       [
24648           "Komi",
24649           "коми",
24650           "kv"
24651       ],
24652       [
24653           "Cornish",
24654           "kernowek",
24655           "kw"
24656       ],
24657       [
24658           "Kyrgyz",
24659           "Кыргызча",
24660           "ky"
24661       ],
24662       [
24663           "Latin",
24664           "Latina",
24665           "la"
24666       ],
24667       [
24668           "Ladino",
24669           "Ladino",
24670           "lad"
24671       ],
24672       [
24673           "Luxembourgish",
24674           "Lëtzebuergesch",
24675           "lb"
24676       ],
24677       [
24678           "лакку",
24679           "лакку",
24680           "lbe"
24681       ],
24682       [
24683           "Lezghian",
24684           "лезги",
24685           "lez"
24686       ],
24687       [
24688           "Ganda",
24689           "Luganda",
24690           "lg"
24691       ],
24692       [
24693           "Limburgish",
24694           "Limburgs",
24695           "li"
24696       ],
24697       [
24698           "Ligurian",
24699           "Ligure",
24700           "lij"
24701       ],
24702       [
24703           "Lombard",
24704           "lumbaart",
24705           "lmo"
24706       ],
24707       [
24708           "Lingala",
24709           "lingála",
24710           "ln"
24711       ],
24712       [
24713           "Lao",
24714           "ລາວ",
24715           "lo"
24716       ],
24717       [
24718           "Northern Luri",
24719           "لۊری شومالی",
24720           "lrc"
24721       ],
24722       [
24723           "Lithuanian",
24724           "lietuvių",
24725           "lt"
24726       ],
24727       [
24728           "Latgalian",
24729           "latgaļu",
24730           "ltg"
24731       ],
24732       [
24733           "Latvian",
24734           "latviešu",
24735           "lv"
24736       ],
24737       [
24738           "Maithili",
24739           "मैथिली",
24740           "mai"
24741       ],
24742       [
24743           "Basa Banyumasan",
24744           "Basa Banyumasan",
24745           "map-bms"
24746       ],
24747       [
24748           "Moksha",
24749           "мокшень",
24750           "mdf"
24751       ],
24752       [
24753           "Malagasy",
24754           "Malagasy",
24755           "mg"
24756       ],
24757       [
24758           "Eastern Mari",
24759           "олык марий",
24760           "mhr"
24761       ],
24762       [
24763           "Maori",
24764           "Māori",
24765           "mi"
24766       ],
24767       [
24768           "Minangkabau",
24769           "Baso Minangkabau",
24770           "min"
24771       ],
24772       [
24773           "Macedonian",
24774           "македонски",
24775           "mk"
24776       ],
24777       [
24778           "Malayalam",
24779           "മലയാളം",
24780           "ml"
24781       ],
24782       [
24783           "Mongolian",
24784           "монгол",
24785           "mn"
24786       ],
24787       [
24788           "Marathi",
24789           "मराठी",
24790           "mr"
24791       ],
24792       [
24793           "Western Mari",
24794           "кырык мары",
24795           "mrj"
24796       ],
24797       [
24798           "Malay",
24799           "Bahasa Melayu",
24800           "ms"
24801       ],
24802       [
24803           "Maltese",
24804           "Malti",
24805           "mt"
24806       ],
24807       [
24808           "Mirandese",
24809           "Mirandés",
24810           "mwl"
24811       ],
24812       [
24813           "Burmese",
24814           "မြန်မာဘာသာ",
24815           "my"
24816       ],
24817       [
24818           "Erzya",
24819           "эрзянь",
24820           "myv"
24821       ],
24822       [
24823           "Mazanderani",
24824           "مازِرونی",
24825           "mzn"
24826       ],
24827       [
24828           "Nauru",
24829           "Dorerin Naoero",
24830           "na"
24831       ],
24832       [
24833           "Nāhuatl",
24834           "Nāhuatl",
24835           "nah"
24836       ],
24837       [
24838           "Neapolitan",
24839           "Napulitano",
24840           "nap"
24841       ],
24842       [
24843           "Low German",
24844           "Plattdüütsch",
24845           "nds"
24846       ],
24847       [
24848           "Low Saxon",
24849           "Nedersaksies",
24850           "nds-nl"
24851       ],
24852       [
24853           "Nepali",
24854           "नेपाली",
24855           "ne"
24856       ],
24857       [
24858           "Newari",
24859           "नेपाल भाषा",
24860           "new"
24861       ],
24862       [
24863           "Dutch",
24864           "Nederlands",
24865           "nl"
24866       ],
24867       [
24868           "Norwegian Nynorsk",
24869           "norsk nynorsk",
24870           "nn"
24871       ],
24872       [
24873           "Norwegian",
24874           "norsk bokmål",
24875           "no"
24876       ],
24877       [
24878           "Novial",
24879           "Novial",
24880           "nov"
24881       ],
24882       [
24883           "Nouormand",
24884           "Nouormand",
24885           "nrm"
24886       ],
24887       [
24888           "Northern Sotho",
24889           "Sesotho sa Leboa",
24890           "nso"
24891       ],
24892       [
24893           "Navajo",
24894           "Diné bizaad",
24895           "nv"
24896       ],
24897       [
24898           "Nyanja",
24899           "Chi-Chewa",
24900           "ny"
24901       ],
24902       [
24903           "Occitan",
24904           "occitan",
24905           "oc"
24906       ],
24907       [
24908           "Livvi-Karelian",
24909           "Livvinkarjala",
24910           "olo"
24911       ],
24912       [
24913           "Oromo",
24914           "Oromoo",
24915           "om"
24916       ],
24917       [
24918           "Odia",
24919           "ଓଡ଼ିଆ",
24920           "or"
24921       ],
24922       [
24923           "Ossetic",
24924           "Ирон",
24925           "os"
24926       ],
24927       [
24928           "Punjabi",
24929           "ਪੰਜਾਬੀ",
24930           "pa"
24931       ],
24932       [
24933           "Pangasinan",
24934           "Pangasinan",
24935           "pag"
24936       ],
24937       [
24938           "Pampanga",
24939           "Kapampangan",
24940           "pam"
24941       ],
24942       [
24943           "Papiamento",
24944           "Papiamentu",
24945           "pap"
24946       ],
24947       [
24948           "Picard",
24949           "Picard",
24950           "pcd"
24951       ],
24952       [
24953           "Pennsylvania German",
24954           "Deitsch",
24955           "pdc"
24956       ],
24957       [
24958           "Palatine German",
24959           "Pälzisch",
24960           "pfl"
24961       ],
24962       [
24963           "Pali",
24964           "पालि",
24965           "pi"
24966       ],
24967       [
24968           "Norfuk / Pitkern",
24969           "Norfuk / Pitkern",
24970           "pih"
24971       ],
24972       [
24973           "Polish",
24974           "polski",
24975           "pl"
24976       ],
24977       [
24978           "Piedmontese",
24979           "Piemontèis",
24980           "pms"
24981       ],
24982       [
24983           "Western Punjabi",
24984           "پنجابی",
24985           "pnb"
24986       ],
24987       [
24988           "Pontic",
24989           "Ποντιακά",
24990           "pnt"
24991       ],
24992       [
24993           "Pashto",
24994           "پښتو",
24995           "ps"
24996       ],
24997       [
24998           "Portuguese",
24999           "português",
25000           "pt"
25001       ],
25002       [
25003           "Quechua",
25004           "Runa Simi",
25005           "qu"
25006       ],
25007       [
25008           "Romansh",
25009           "rumantsch",
25010           "rm"
25011       ],
25012       [
25013           "Romani",
25014           "Romani",
25015           "rmy"
25016       ],
25017       [
25018           "Rundi",
25019           "Kirundi",
25020           "rn"
25021       ],
25022       [
25023           "Romanian",
25024           "română",
25025           "ro"
25026       ],
25027       [
25028           "Aromanian",
25029           "armãneashti",
25030           "roa-rup"
25031       ],
25032       [
25033           "tarandíne",
25034           "tarandíne",
25035           "roa-tara"
25036       ],
25037       [
25038           "Russian",
25039           "русский",
25040           "ru"
25041       ],
25042       [
25043           "Rusyn",
25044           "русиньскый",
25045           "rue"
25046       ],
25047       [
25048           "Kinyarwanda",
25049           "Kinyarwanda",
25050           "rw"
25051       ],
25052       [
25053           "Sanskrit",
25054           "संस्कृतम्",
25055           "sa"
25056       ],
25057       [
25058           "Sakha",
25059           "саха тыла",
25060           "sah"
25061       ],
25062       [
25063           "Sardinian",
25064           "sardu",
25065           "sc"
25066       ],
25067       [
25068           "Sicilian",
25069           "sicilianu",
25070           "scn"
25071       ],
25072       [
25073           "Scots",
25074           "Scots",
25075           "sco"
25076       ],
25077       [
25078           "Sindhi",
25079           "سنڌي",
25080           "sd"
25081       ],
25082       [
25083           "Northern Sami",
25084           "sámegiella",
25085           "se"
25086       ],
25087       [
25088           "Sango",
25089           "Sängö",
25090           "sg"
25091       ],
25092       [
25093           "Serbo-Croatian",
25094           "srpskohrvatski / српскохрватски",
25095           "sh"
25096       ],
25097       [
25098           "Sinhala",
25099           "සිංහල",
25100           "si"
25101       ],
25102       [
25103           "Simple English",
25104           "Simple English",
25105           "simple"
25106       ],
25107       [
25108           "Slovak",
25109           "slovenčina",
25110           "sk"
25111       ],
25112       [
25113           "Slovenian",
25114           "slovenščina",
25115           "sl"
25116       ],
25117       [
25118           "Samoan",
25119           "Gagana Samoa",
25120           "sm"
25121       ],
25122       [
25123           "Shona",
25124           "chiShona",
25125           "sn"
25126       ],
25127       [
25128           "Somali",
25129           "Soomaaliga",
25130           "so"
25131       ],
25132       [
25133           "Albanian",
25134           "shqip",
25135           "sq"
25136       ],
25137       [
25138           "Serbian",
25139           "српски / srpski",
25140           "sr"
25141       ],
25142       [
25143           "Sranan Tongo",
25144           "Sranantongo",
25145           "srn"
25146       ],
25147       [
25148           "Swati",
25149           "SiSwati",
25150           "ss"
25151       ],
25152       [
25153           "Southern Sotho",
25154           "Sesotho",
25155           "st"
25156       ],
25157       [
25158           "Saterland Frisian",
25159           "Seeltersk",
25160           "stq"
25161       ],
25162       [
25163           "Sundanese",
25164           "Basa Sunda",
25165           "su"
25166       ],
25167       [
25168           "Swedish",
25169           "svenska",
25170           "sv"
25171       ],
25172       [
25173           "Swahili",
25174           "Kiswahili",
25175           "sw"
25176       ],
25177       [
25178           "Silesian",
25179           "ślůnski",
25180           "szl"
25181       ],
25182       [
25183           "Tamil",
25184           "தமிழ்",
25185           "ta"
25186       ],
25187       [
25188           "Tulu",
25189           "ತುಳು",
25190           "tcy"
25191       ],
25192       [
25193           "Telugu",
25194           "తెలుగు",
25195           "te"
25196       ],
25197       [
25198           "Tetum",
25199           "tetun",
25200           "tet"
25201       ],
25202       [
25203           "Tajik",
25204           "тоҷикӣ",
25205           "tg"
25206       ],
25207       [
25208           "Thai",
25209           "ไทย",
25210           "th"
25211       ],
25212       [
25213           "Tigrinya",
25214           "ትግርኛ",
25215           "ti"
25216       ],
25217       [
25218           "Turkmen",
25219           "Türkmençe",
25220           "tk"
25221       ],
25222       [
25223           "Tagalog",
25224           "Tagalog",
25225           "tl"
25226       ],
25227       [
25228           "Tswana",
25229           "Setswana",
25230           "tn"
25231       ],
25232       [
25233           "Tongan",
25234           "lea faka-Tonga",
25235           "to"
25236       ],
25237       [
25238           "Tok Pisin",
25239           "Tok Pisin",
25240           "tpi"
25241       ],
25242       [
25243           "Turkish",
25244           "Türkçe",
25245           "tr"
25246       ],
25247       [
25248           "Tsonga",
25249           "Xitsonga",
25250           "ts"
25251       ],
25252       [
25253           "Tatar",
25254           "татарча/tatarça",
25255           "tt"
25256       ],
25257       [
25258           "Tumbuka",
25259           "chiTumbuka",
25260           "tum"
25261       ],
25262       [
25263           "Twi",
25264           "Twi",
25265           "tw"
25266       ],
25267       [
25268           "Tahitian",
25269           "reo tahiti",
25270           "ty"
25271       ],
25272       [
25273           "Tuvinian",
25274           "тыва дыл",
25275           "tyv"
25276       ],
25277       [
25278           "Udmurt",
25279           "удмурт",
25280           "udm"
25281       ],
25282       [
25283           "Uyghur",
25284           "ئۇيغۇرچە / Uyghurche",
25285           "ug"
25286       ],
25287       [
25288           "Ukrainian",
25289           "українська",
25290           "uk"
25291       ],
25292       [
25293           "Urdu",
25294           "اردو",
25295           "ur"
25296       ],
25297       [
25298           "Uzbek",
25299           "oʻzbekcha/ўзбекча",
25300           "uz"
25301       ],
25302       [
25303           "Venda",
25304           "Tshivenda",
25305           "ve"
25306       ],
25307       [
25308           "Venetian",
25309           "vèneto",
25310           "vec"
25311       ],
25312       [
25313           "Veps",
25314           "vepsän kel’",
25315           "vep"
25316       ],
25317       [
25318           "Vietnamese",
25319           "Tiếng Việt",
25320           "vi"
25321       ],
25322       [
25323           "West Flemish",
25324           "West-Vlams",
25325           "vls"
25326       ],
25327       [
25328           "Volapük",
25329           "Volapük",
25330           "vo"
25331       ],
25332       [
25333           "Walloon",
25334           "walon",
25335           "wa"
25336       ],
25337       [
25338           "Waray",
25339           "Winaray",
25340           "war"
25341       ],
25342       [
25343           "Wolof",
25344           "Wolof",
25345           "wo"
25346       ],
25347       [
25348           "Wu Chinese",
25349           "吴语",
25350           "wuu"
25351       ],
25352       [
25353           "Kalmyk",
25354           "хальмг",
25355           "xal"
25356       ],
25357       [
25358           "Xhosa",
25359           "isiXhosa",
25360           "xh"
25361       ],
25362       [
25363           "Mingrelian",
25364           "მარგალური",
25365           "xmf"
25366       ],
25367       [
25368           "Yiddish",
25369           "ייִדיש",
25370           "yi"
25371       ],
25372       [
25373           "Yoruba",
25374           "Yorùbá",
25375           "yo"
25376       ],
25377       [
25378           "Zhuang",
25379           "Vahcuengh",
25380           "za"
25381       ],
25382       [
25383           "Zeelandic",
25384           "Zeêuws",
25385           "zea"
25386       ],
25387       [
25388           "Chinese",
25389           "中文",
25390           "zh"
25391       ],
25392       [
25393           "Classical Chinese",
25394           "文言",
25395           "zh-classical"
25396       ],
25397       [
25398           "Chinese (Min Nan)",
25399           "Bân-lâm-gú",
25400           "zh-min-nan"
25401       ],
25402       [
25403           "Cantonese",
25404           "粵語",
25405           "zh-yue"
25406       ],
25407       [
25408           "Zulu",
25409           "isiZulu",
25410           "zu"
25411       ]
25412   ];
25413
25414   var wikipedia$1 = /*#__PURE__*/Object.freeze({
25415     default: wikipedia
25416   });
25417
25418   var wikisource = [
25419       [
25420           "Arabic",
25421           "العربية",
25422           "ar"
25423       ],
25424       [
25425           "Assamese",
25426           "অসমীয়া",
25427           "as"
25428       ],
25429       [
25430           "Azerbaijani",
25431           "azərbaycanca",
25432           "az"
25433       ],
25434       [
25435           "Belarusian",
25436           "беларуская",
25437           "be"
25438       ],
25439       [
25440           "Bulgarian",
25441           "български",
25442           "bg"
25443       ],
25444       [
25445           "Bangla",
25446           "বাংলা",
25447           "bn"
25448       ],
25449       [
25450           "Breton",
25451           "brezhoneg",
25452           "br"
25453       ],
25454       [
25455           "Bosnian",
25456           "bosanski",
25457           "bs"
25458       ],
25459       [
25460           "Catalan",
25461           "català",
25462           "ca"
25463       ],
25464       [
25465           "Czech",
25466           "čeština",
25467           "cs"
25468       ],
25469       [
25470           "Welsh",
25471           "Cymraeg",
25472           "cy"
25473       ],
25474       [
25475           "Danish",
25476           "dansk",
25477           "da"
25478       ],
25479       [
25480           "German",
25481           "Deutsch",
25482           "de"
25483       ],
25484       [
25485           "Greek",
25486           "Ελληνικά",
25487           "el"
25488       ],
25489       [
25490           "English",
25491           "English",
25492           "en"
25493       ],
25494       [
25495           "Esperanto",
25496           "Esperanto",
25497           "eo"
25498       ],
25499       [
25500           "Spanish",
25501           "español",
25502           "es"
25503       ],
25504       [
25505           "Estonian",
25506           "eesti",
25507           "et"
25508       ],
25509       [
25510           "Persian",
25511           "فارسی",
25512           "fa"
25513       ],
25514       [
25515           "Finnish",
25516           "suomi",
25517           "fi"
25518       ],
25519       [
25520           "Faroese",
25521           "føroyskt",
25522           "fo"
25523       ],
25524       [
25525           "French",
25526           "français",
25527           "fr"
25528       ],
25529       [
25530           "Galician",
25531           "galego",
25532           "gl"
25533       ],
25534       [
25535           "Gujarati",
25536           "ગુજરાતી",
25537           "gu"
25538       ],
25539       [
25540           "Hebrew",
25541           "עברית",
25542           "he"
25543       ],
25544       [
25545           "Croatian",
25546           "hrvatski",
25547           "hr"
25548       ],
25549       [
25550           "Hungarian",
25551           "magyar",
25552           "hu"
25553       ],
25554       [
25555           "Armenian",
25556           "Հայերեն",
25557           "hy"
25558       ],
25559       [
25560           "Indonesian",
25561           "Bahasa Indonesia",
25562           "id"
25563       ],
25564       [
25565           "Icelandic",
25566           "íslenska",
25567           "is"
25568       ],
25569       [
25570           "Italian",
25571           "italiano",
25572           "it"
25573       ],
25574       [
25575           "Japanese",
25576           "日本語",
25577           "ja"
25578       ],
25579       [
25580           "Kannada",
25581           "ಕನ್ನಡ",
25582           "kn"
25583       ],
25584       [
25585           "Korean",
25586           "한국어",
25587           "ko"
25588       ],
25589       [
25590           "Latin",
25591           "Latina",
25592           "la"
25593       ],
25594       [
25595           "Limburgish",
25596           "Limburgs",
25597           "li"
25598       ],
25599       [
25600           "Lithuanian",
25601           "lietuvių",
25602           "lt"
25603       ],
25604       [
25605           "Macedonian",
25606           "македонски",
25607           "mk"
25608       ],
25609       [
25610           "Malayalam",
25611           "മലയാളം",
25612           "ml"
25613       ],
25614       [
25615           "Marathi",
25616           "मराठी",
25617           "mr"
25618       ],
25619       [
25620           "Dutch",
25621           "Nederlands",
25622           "nl"
25623       ],
25624       [
25625           "Norwegian",
25626           "norsk bokmål",
25627           "no"
25628       ],
25629       [
25630           "Odia",
25631           "ଓଡ଼ିଆ",
25632           "or"
25633       ],
25634       [
25635           "Punjabi",
25636           "ਪੰਜਾਬੀ",
25637           "pa"
25638       ],
25639       [
25640           "Polish",
25641           "polski",
25642           "pl"
25643       ],
25644       [
25645           "Portuguese",
25646           "português",
25647           "pt"
25648       ],
25649       [
25650           "Romanian",
25651           "română",
25652           "ro"
25653       ],
25654       [
25655           "Russian",
25656           "русский",
25657           "ru"
25658       ],
25659       [
25660           "Sanskrit",
25661           "संस्कृतम्",
25662           "sa"
25663       ],
25664       [
25665           "Sakha",
25666           "саха тыла",
25667           "sah"
25668       ],
25669       [
25670           "Slovak",
25671           "slovenčina",
25672           "sk"
25673       ],
25674       [
25675           "Slovenian",
25676           "slovenščina",
25677           "sl"
25678       ],
25679       [
25680           "Serbian",
25681           "српски / srpski",
25682           "sr"
25683       ],
25684       [
25685           "Swedish",
25686           "svenska",
25687           "sv"
25688       ],
25689       [
25690           "Tamil",
25691           "தமிழ்",
25692           "ta"
25693       ],
25694       [
25695           "Telugu",
25696           "తెలుగు",
25697           "te"
25698       ],
25699       [
25700           "Thai",
25701           "ไทย",
25702           "th"
25703       ],
25704       [
25705           "Turkish",
25706           "Türkçe",
25707           "tr"
25708       ],
25709       [
25710           "Ukrainian",
25711           "українська",
25712           "uk"
25713       ],
25714       [
25715           "Venetian",
25716           "vèneto",
25717           "vec"
25718       ],
25719       [
25720           "Vietnamese",
25721           "Tiếng Việt",
25722           "vi"
25723       ],
25724       [
25725           "Yiddish",
25726           "ייִדיש",
25727           "yi"
25728       ],
25729       [
25730           "Chinese",
25731           "中文",
25732           "zh"
25733       ],
25734       [
25735           "Chinese (Min Nan)",
25736           "Bân-lâm-gú",
25737           "zh-min-nan"
25738       ]
25739   ];
25740
25741   var wikisource$1 = /*#__PURE__*/Object.freeze({
25742     default: wikisource
25743   });
25744
25745   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
25746
25747   function unwrapExports (x) {
25748         return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x.default : x;
25749   }
25750
25751   function createCommonjsModule(fn, module) {
25752         return module = { exports: {} }, fn(module, module.exports), module.exports;
25753   }
25754
25755   function getCjsExportFromNamespace (n) {
25756         return n && n.default || n;
25757   }
25758
25759   getCjsExportFromNamespace(wikibooks$1);
25760
25761   getCjsExportFromNamespace(wikinews$1);
25762
25763   getCjsExportFromNamespace(wikiquote$1);
25764
25765   getCjsExportFromNamespace(wikiversity$1);
25766
25767   getCjsExportFromNamespace(wikivoyage$1);
25768
25769   getCjsExportFromNamespace(wiktionary$1);
25770
25771   var require$$6 = getCjsExportFromNamespace(wikipedia$1);
25772
25773   getCjsExportFromNamespace(wikisource$1);
25774
25775   var wikipedia$2 = require$$6;
25776
25777   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"]]}];
25778
25779   var dataDeprecated = [{old:{amenity:"advertising"},replace:{advertising:"*"}},{old:{amenity:"artwork"},replace:{tourism:"artwork"}},{old:{amenity:"car_repair"},replace:{shop:"car_repair"}},{old:{amenity:"citymap_post"},replace:{tourism:"information"}},{old:{amenity:"community_center"},replace:{amenity:"community_centre"}},{old:{amenity:"ev_charging"},replace:{amenity:"charging_station"}},{old:{amenity:"firepit"},replace:{leisure:"firepit"}},{old:{amenity:"garage"},replace:{landuse:"garages"}},{old:{amenity:"garages"},replace:{landuse:"garages"}},{old:{amenity:"public_building"},replace:{building:"public"}},{old:{amenity:"real_estate"},replace:{office:"estate_agent"}},{old:{amenity:"register_office"},replace:{office:"government",government:"register_office"}},{old:{amenity:"sauna"},replace:{leisure:"sauna"}},{old:{amenity:"scrapyard"},replace:{landuse:"industrial",industrial:"scrap_yard"}},{old:{amenity:"shop"},replace:{shop:"*"}},{old:{amenity:"swimming_pool"},replace:{leisure:"swimming_pool"}},{old:{amenity:"toilet"},replace:{amenity:"toilets"}},{old:{amenity:"vending_machine",vending:"news_papers"},replace:{amenity:"vending_machine",vending:"newspapers"}},{old:{amenity:"youth_center"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{amenity:"youth_centre"},replace:{amenity:"community_centre","community_centre:for":"juvenile"}},{old:{barrier:"wire_fence"},replace:{barrier:"fence",fence_type:"chain"}},{old:{barrier:"wood_fence"},replace:{barrier:"fence",fence_type:"wood"}},{old:{building:"entrance"},replace:{entrance:"*"}},{old:{"building:color":"*"},replace:{"building:colour":"$1"}},{old:{"building:roof:colour":"*"},replace:{"roof:colour":"$1"}},{old:{"building:type":"*"},replace:{building:"$1"}},{old:{color:"*"},replace:{colour:"$1"}},{old:{craft:"jeweler"},replace:{shop:"jewelery"}},{old:{craft:"optician"},replace:{shop:"optician"}},{old:{drinkable:"*"},replace:{drinking_water:"$1"}},{old:{escalator:"*"},replace:{highway:"steps",conveying:"$1"}},{old:{fenced:"yes"},replace:{barrier:"fence"}},{old:{footway:"both"},replace:{sidewalk:"both"}},{old:{footway:"left"},replace:{sidewalk:"left"}},{old:{footway:"no"},replace:{sidewalk:"no"}},{old:{footway:"none"},replace:{sidewalk:"no"}},{old:{footway:"right"},replace:{sidewalk:"right"}},{old:{footway:"separate"},replace:{sidewalk:"separate"}},{old:{highway:"abandoned"},replace:{"abandoned:highway":"*"}},{old:{highway:"ford"},replace:{ford:"*"}},{old:{highway:"no"}},{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:"conservation"},replace:{boundary:"protected_area"}},{old:{landuse:"farm"},replace:{landuse:"farmland"}},{old:{landuse:"field"},replace:{landuse:"farmland"}},{old:{landuse:"pond"},replace:{natural:"water",water:"pond"}},{old:{landuse:"wood"},replace:{natural:"wood"}},{old:{leisure:"beach"},replace:{natural:"beach"}},{old:{leisure:"club"},replace:{club:"*"}},{old:{man_made:"jetty"},replace:{man_made:"pier"}},{old:{man_made:"mdf"},replace:{telecom:"exchange"}},{old:{man_made:"MDF"},replace:{telecom:"exchange"}},{old:{man_made:"water_tank"},replace:{man_made:"storage_tank",content:"water"}},{old:{man_made:"well"},replace:{man_made:"water_well"}},{old:{natural:"marsh"},replace:{natural:"wetland",wetland:"marsh"}},{old:{natural:"waterfall"},replace:{waterway:"waterfall"}},{old:{office:"administrative"},replace:{office:"government"}},{old:{office:"real_estate"},replace:{office:"estate_agent"}},{old:{place_name:"*"},replace:{name:"$1"}},{old:{pole:"transition"},replace:{"location:transition":"yes"}},{old:{postcode:"*"},replace:{"addr:postcode":"$1"}},{old:{power:"sub_station"},replace:{power:"substation"}},{old:{power_source:"*"},replace:{"generator:source":"$1"}},{old:{power_rating:"*"},replace:{"generator:output":"$1"}},{old:{"roof:color":"*"},replace:{"roof:colour":"$1"}},{old:{route:"ncn"},replace:{route:"bicycle",network:"ncn"}},{old:{shop:"betting"},replace:{shop:"bookmaker"}},{old:{shop:"organic"},replace:{shop:"supermarket",organic:"only"}},{old:{shop:"fish"},replace:{shop:"seafood"}},{old:{shop:"fishmonger"},replace:{shop:"seafood"}},{old:{shop:"furnace"},replace:{shop:"fireplace"}},{old:{shop:"gallery"},replace:{shop:"art"}},{old:{shop:"perfume"},replace:{shop:"perfumery"}},{old:{shop:"real_estate"},replace:{office:"estate_agent"}},{old:{tourism:"bed_and_breakfast"},replace:{tourism:"guest_house"}},{old:{type:"broad_leaved"},replace:{leaf_type:"broadleaved"}},{old:{type:"conifer"},replace:{leaf_type:"needleleaved"}},{old:{type:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{water:"intermittent"},replace:{natural:"water",intermittent:"yes"}},{old:{water:"riverbank"},replace:{natural:"water",water:"river"}},{old:{water:"salt"},replace:{natural:"water",salt:"yes"}},{old:{water:"tidal"},replace:{natural:"water",tidal:"yes"}},{old:{waterway:"aqueduct"},replace:{waterway:"canal",bridge:"aqueduct"}},{old:{wood:"coniferous"},replace:{leaf_type:"needleleaved"}},{old:{wood:"deciduous"},replace:{leaf_cycle:"deciduous"}},{old:{wood:"evergreen"},replace:{leaf_cycle:"evergreen"}},{old:{wood:"mixed"},replace:{leaf_cycle:"mixed",leaf_type:"mixed"}}];
25780
25781   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};
25782
25783   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}};
25784
25785   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"};
25786
25787   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:["sidebar.key","`","²"],text:"shortcuts.browsing.display_options.sidebar"},{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:["inspector.zoom_to.key"],text:"shortcuts.browsing.with_selected.zoom_to"},{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"}]}]}];
25788
25789   var type$2 = "FeatureCollection";
25790   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]]]}}];
25791   var dataImperial = {
25792   type: type$2,
25793   features: features
25794   };
25795
25796   var type$3 = "FeatureCollection";
25797   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]]]}}];
25798   var dataDriveLeft = {
25799   type: type$3,
25800   features: features$1
25801   };
25802
25803   var en = {icons:{download:"download",information:"info",remove:"remove",undo:"undo",zoom_to:"zoom to",copy:"copy",open_wikidata:"open on wikidata.org"},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:{from_vertex:{to_point:"Connected a way to a point.",to_vertex:"Connected a way to another.",to_line:"Connected a way to a line.",to_area:"Connected a way to an area.",to_adjacent_vertex:"Merged adjacent points in a way.",to_sibling_vertex:"Connected a way to itself."},from_point:{to_point:"Merged a point with another.",to_vertex:"Merged a point with a point in a way.",to_line:"Moved a point to a line.",to_area:"Moved a point 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.",paths_intersect:"These features can't be merged because the resulting path would intersect itself."},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",sidebar:{key:"`",tooltip:"Toggle the sidebar."},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",errors:"Errors",warnings:"Warnings",modified:"Modified",deleted:"Deleted",created:"Created",outstanding_errors_message:"Please resolve all errors first. {count} remaining.",comment_needed_message:"Please add a changeset comment first.",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:{zoom_to:{key:"Z",title:"Zoom to this",tooltip_feature:"Center and zoom the map to focus on this feature.",tooltip_note:"Center and zoom the map to focus on this note.",tooltip_data:"Center and zoom the map to focus on this data.",tooltip_issue:"Center and zoom the map to focus on this issue."},show_more:"Show More",view_on_osm:"View on openstreetmap.org",view_on_keepRight:"View on keepright.at",all_fields:"All fields",all_tags:"All tags",all_members:"All members",all_relations:"All relations",new_relation:"New relation...",choose_relation:"Choose a parent relation",role:"Role",choose:"Select feature type",results:"{n} results for {search}",no_documentation_key:"There is no documentation available.",edit_reference:"edit/translate",wiki_reference:"View documentation",wiki_en_reference:"View documentation in English",hidden_preset:{manual:"{features} are hidden. Enable them in the Map Data pane.",zoom:"{features} are hidden. Zoom in to enable them."},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:",lock:{suggestion:"The \"{label}\" field is locked because there is a Wikidata tag. You can delete it or edit the tags in the \"All tags\" section."}},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"},keepRight:{tooltip:"Automatically detected map issues from keepright.at",title:"KeepRight Issues"},improveOSM:{tooltip:"Missing data automatically detected by improveosm.org",title:"ImproveOSM Issues"},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 Features",tooltip:"Proposed, Construction, Abandoned, Demolished, etc."},others:{description:"Other Features",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}"},zoom:{"in":"Zoom in",out:"Zoom out"},cannot_zoom:"Cannot zoom out further in current mode.",full_screen:"Toggle Full Screen",QA:{improveOSM:{title:"ImproveOSM Detection",geometry_types:{path:"paths",parking:"parking",road:"roads",both:"roads and parking"},directions:{east:"east",north:"north",northeast:"northeast",northwest:"northwest",south:"south",southeast:"southeast",southwest:"southwest",west:"west"},error_types:{ow:{title:"Missing One-way",description:"Along this section of {highway}, {percentage}% of {num_trips} recorded trips travel from {from_node} to {to_node}. There may be missing a \"oneway\" tag."},mr:{title:"Missing Geometry",description:"{num_trips} recorded trips in this area suggest there may be unmapped {geometry_type} here.",description_alt:"Data from a 3rd party suggests there may be unmapped {geometry_type} here."},tr:{title:"Missing Turn Restriction",description:"{num_passed} of {num_trips} recorded trips (travelling {travel_direction}) make a turn from {from_way} to {to_way} at {junction}. There may be a missing \"{turn_restriction}\" restriction."}}},keepRight:{title:"KeepRight Error",detail_title:"Error",detail_description:"Description",comment:"Comment",comment_placeholder:"Enter a comment to share with other users.",close:"Close (Error Fixed)",ignore:"Ignore (Not an Error)",save_comment:"Save Comment",close_comment:"Close and Comment",ignore_comment:"Ignore and Comment",error_parts:{this_node:"this node",this_way:"this way",this_relation:"this relation",this_oneway:"this oneway",this_highway:"this highway",this_railway:"this railway",this_waterway:"this waterway",this_cycleway:"this cycleway",this_cycleway_footpath:"this cycleway/footpath",this_riverbank:"this riverbank",this_crossing:"this crossing",this_railway_crossing:"this railway crossing",this_bridge:"this bridge",this_tunnel:"this tunnel",this_boundary:"this boundary",this_turn_restriction:"this turn restriction",this_roundabout:"this roundabout",this_mini_roundabout:"this mini-roundabout",this_track:"this track",this_feature:"this feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place of worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast food",fuel:"fuel",from:"from",to:"to",left_hand:"left-hand",right_hand:"right-hand"},errorTypes:{"20":{title:"Multiple nodes on the same spot",description:"There is more than one node in this spot. Node IDs: {var1}."},"30":{title:"Non-closed area",description:"{var1} is tagged with \"{var2}\" and should be a closed loop."},"40":{title:"Impossible oneway",description:"The first node {var1} of {var2} is not connected to any other way."},"41":{description:"The last node {var1} of {var2} is not connected to any other way."},"42":{description:"You cannot reach {var1} because all ways leading from it are oneway."},"43":{description:"You cannot escape from {var1} because all ways leading to it are oneway."},"50":{title:"Almost junction",description:"{var1} is very close but not connected to way {var2}."},"60":{title:"Deprecated tag",description:"{var1} uses deprecated tag \"{var2}\". Please use \"{var3}\" instead."},"70":{title:"Missing tag",description:"{var1} has an empty tag: \"{var2}\"."},"71":{description:"{var1} has no tags."},"72":{description:"{var1} is not member of any way and doesn't have any tags."},"73":{description:"{var1} has a \"{var2}\" tag but no \"highway\" tag."},"74":{description:"{var1} has an empty tag: \"{var2}\"."},"75":{description:"{var1} has a name \"{var2}\" but no other tags."},"90":{title:"Motorway without ref tag",description:"{var1} is tagged as a motorway and therefore needs a \"ref\", \"nat_ref\", or \"int_ref\" tag."},"100":{title:"Place of worship without religion",description:"{var1} is tagged as a place of worship and therefore needs a religion tag."},"110":{title:"Point of interest without name",description:"{var1} is tagged as a \"{var2}\" and therefore needs a name tag."},"120":{title:"Way without nodes",description:"{var1} has just one single node."},"130":{title:"Disconnected way",description:"{var1} is not connected to the rest of the map."},"150":{title:"Railway crossing without tag",description:"{var1} of a highway and a railway needs to be tagged as \"railway=crossing\" or \"railway=level_crossing\"."},"160":{title:"Railway layer conflict",description:"There are ways in different layers (e.g. tunnel or bridge) meeting at {var1}."},"170":{title:"FIXME tagged item",description:"{var1} has a FIXME tag: {var2}"},"180":{title:"Relation without type",description:"{var1} is missing a \"type\" tag."},"190":{title:"Intersection without junction",description:"{var1} intersects the {var2} {var3} but there is no junction node, bridge, or tunnel."},"200":{title:"Overlapping ways",description:"{var1} overlaps the {var2} {var3}."},"210":{title:"Self-intersecting way",description:"There is an unspecified issue with self intersecting ways."},"211":{description:"{var1} contains more than one node multiple times. Nodes are {var2}. This may or may not be an error."},"212":{description:"{var1} has only two different nodes and contains one of them more than once."},"220":{title:"Misspelled tag",description:"{var1} is tagged \"{var2}\" where \"{var3}\" looks like \"{var4}\"."},"221":{description:"{var1} has a suspicious tag \"{var2}\"."},"230":{title:"Layer conflict",description:"{var1} is a junction of ways on different layers."},"231":{description:"{var1} is a junction of ways on different layers: {var2}.",layer:"(layer: {layer})"},"232":{description:"{var1} is tagged with \"layer={var2}\". This need not be an error but it looks strange."},"270":{title:"Unusual motorway connection",description:"{var1} is a junction of a motorway and a highway other than \"motorway\", \"motorway_link\", \"trunk\", \"rest_area\", or \"construction\". Connection to \"service\" or \"unclassified\" is only valid if it has \"access=no/private\", or it leads to a motorway service area, or if it is a \"service=parking_aisle\"."},"280":{title:"Boundary issue",description:"There is an unspecified issue with this boundary."},"281":{title:"Boundary missing name",description:"{var1} has no name."},"282":{title:"Boundary missing admin level",description:"The boundary of {var1} has no valid numeric admin_level. Please do not mix admin levels (e.g. \"6;7\"). Always tag the lowest admin_level of all boundaries."},"283":{title:"Boundary not a closed loop",description:"The boundary of {var1} is not a closed loop."},"284":{title:"Boundary is split",description:"The boundary of {var1} splits here."},"285":{title:"Boundary admin_level too high",description:"{var1} has \"admin_level={var2}\" but belongs to a relation with lower \"admin_level\" (e.g. higher priority); it should have the lowest \"admin_level\" of all relations."},"290":{title:"Restriction issue",description:"There is an unspecified issue with this restriction."},"291":{title:"Restriction missing type",description:"{var1} has an unrecognized restriction type."},"292":{title:"Restriction missing \"from\" way",description:"{var1} has {var2} \"from\" members, but it should have 1."},"293":{title:"Restriction missing \"to\" way",description:"{var1} has {var2} \"to\" members, but it should have 1."},"294":{title:"Restriction \"from\" or \"to\" is not a way",description:"{var1} has \"from\" or \"to\" members which should be ways. {var2}."},"295":{title:"Restriction \"via\" is not an endpoint",description:"{var1} has a \"via\" (node {var2}) which is not the first or the last member of \"{var3}\" (way {var4})."},"296":{title:"Unusual restriction angle",description:"{var1} has a restriction type \"{var2}\" but the angle is {var3} degrees. Maybe the restriction type is not appropriate?"},"297":{title:"Wrong direction of \"to\" way",description:"{var1} does not match the direction of \"to\" way {var2}."},"298":{title:"Redundant restriction - oneway",description:"{var1} may be redundant. Entry already prohibited by \"oneway\" tag on {var2}."},"300":{title:"Missing maxspeed",description:"{var1} is missing a \"maxspeed\" tag and is tagged as motorway, trunk, primary, or secondary."},"310":{title:"Roundabout issue",description:"There is an unspecified issue with this roundabout."},"311":{title:"Roundabout not closed loop",description:"{var1} is part of a roundabout but is not closed-loop. (Split carriageways approaching a roundabout should not be tagged as roundabout)."},"312":{title:"Roundabout wrong direction",description:"If {var1} is in a country with {var2} traffic then its orientation goes the wrong way around."},"313":{title:"Roundabout weakly connected",description:"{var1} has only {var2} other road(s) connected. Roundabouts typically have 3 or more."},"320":{title:"Improper link connection",description:"{var1} is tagged as \"{var2}\" but doesn't have a connection to any other \"{var3}\" or \"{var4}\"."},"350":{title:"Improper bridge tag",description:"{var1} doesn't have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: {var2}."},"360":{title:"Missing local name tag",description:"It would be nice if {var1} had a local name tag \"name:XX={var2}\" where XX shows the language of its common name \"{var2}\"."},"370":{title:"Doubled places",description:"{var1} has tags in common with the surrounding way {var2} {var3} and seems to be redundant.",including_the_name:"(including the name {name})"},"380":{title:"Non-physical use of sport tag",description:"{var1} is tagged \"{var2}\" but has no physical tag (e.g. \"leisure\", \"building\", \"amenity\", or \"highway\")."},"390":{title:"Missing tracktype",description:"{var1} doesn't have a \"tracktype\" tag."},"400":{title:"Geometry issue",description:"There is an unspecified issue with the geometry here."},"401":{title:"Missing turn restriction",description:"Ways {var1} and {var2} join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning."},"402":{title:"Impossible angle",description:"{var1} bends in a very sharp angle here."},"410":{title:"Website issue",description:"There is an unspecified issue with a contact website or URL."},"411":{description:"{var1} may have an outdated URL: {var2} returned HTTP status code {var3}."},"412":{description:"{var1} may have an outdated URL: {var2} contained suspicious text \"{var3}\"."},"413":{description:"{var1} may have an outdated URL: {var2} did not contain keywords \"{var3}\"."}}}},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 {leftclick} 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."},qa:{title:"Quality Assurance",intro:"*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, click the {data} **Map data** panel to enable a specific Q/A layer.",tools_h:"Tools",tools:"The following tools are currently supported: [KeepRight](https://www.keepright.at/) and [ImproveOSM](https://improveosm.org/en/). Expect iD to support [Osmose](https://osmose.openstreetmap.fr/) and more Q/A tools in the future.",issues_h:"Handling Issues",issues:"Handling Q/A issues is similar to handling notes. Click on a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue."},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."}}}},issues:{title:"Issues",key:"I",list_title:"Issues ({count})",errors:{list_title:"Errors ({count})"},warnings:{list_title:"Warnings ({count})"},rules:{title:"Rules"},no_issues:{message:"Everything looks fine",info:"Any issues will show up here as you edit"},almost_junction:{title:"Almost Junctions",message:"{feature} is very close but not connected to {feature2}","highway-highway":{tip:"Intersecting highways should share a junction vertex."}},crossing_ways:{title:"Crossings Ways",message:"{feature} crosses {feature2}",tip:"Highways, railways, waterways, and buildings should not cross ambiguously.","building-building":{tip:"Buildings should not intersect except on different layers."},"building-highway":{tip:"Highways crossing buildings should use bridges, tunnels, coverings, or entrances."},"building-railway":{tip:"Railways crossing buildings should use bridges or tunnels."},"building-waterway":{tip:"Waterways crossing buildings should use tunnels or different layers."},"highway-highway":{tip:"Crossing highways should use bridges, tunnels, or intersections."},"highway-railway":{tip:"Highways crossing railways should use bridges, tunnels, or level crossings."},"highway-waterway":{tip:"Highways crossing waterways should use bridges, tunnels, or fords."},"railway-railway":{tip:"Crossing railways should be connected or use bridges or tunnels."},"railway-waterway":{tip:"Railways crossing waterways should use bridges or tunnels."},"waterway-waterway":{tip:"Crossing waterways should be connected or use tunnels."},"tunnel-tunnel":{tip:"Crossing tunnels should use different layers."},"tunnel-tunnel_connectable":{tip:"Crossing tunnels should be connected or use different layers."},"bridge-bridge":{tip:"Crossing bridges should use different layers."},"bridge-bridge_connectable":{tip:"Crossing bridges should be connected or use different layers."},"indoor-indoor":{tip:"Crossing indoor features should use different levels."},"indoor-indoor_connectable":{tip:"Crossing indoor features should be connected or use different levels."}},deprecated_tag:{title:"Deprecated Tags",single:{message:"{feature} has the outdated tag \"{tag}\""},combination:{message:"{feature} has an outdated tag combination: {tags}"},tip:"Some tags become deprecated over time and should be replaced."},disconnected_way:{title:"Disconnected Ways",highway:{message:"{highway} is disconnected from other roads and paths",tip:"Highways should connect to other highways or building entrances."}},generic_name:{title:"Generic Names",message:"{feature} has the generic name \"{name}\"",tip:"Names should be the actual, on-the-ground names of features."},many_deletions:{title:"Many Deletions","points-lines-areas":{message:"Deleting {n} features: {p} points, {l} lines, and {a} areas"},"points-lines-areas-relations":{message:"Deleting {n} features: {p} points, {l} lines, {a} areas, and {r} relations"},tip:"Only redundant or nonexistent features should be deleted."},missing_role:{title:"Missing Roles",message:"{member} has no role within {relation}",multipolygon:{tip:"Multipolygon members must have an inner or outer role."}},missing_tag:{title:"Missing Tags",any:{message:"{feature} has no tags"},descriptive:{message:"{feature} has no descriptive tags"},specific:{message:"{feature} has no \"{tag}\" tag"},tip:"Features must have tags that define what they are."},old_multipolygon:{title:"Misplaced Multipolygon Tags",message:"{multipolygon} has misplaced tags",tip:"Multipolygons should be tagged on their relation, not their outer way."},tag_suggests_area:{title:"Lines Tagged as Areas",message:"{feature} should be a closed area based on the tag \"{tag}\"",tip:"Areas must have connected endpoints."},fix:{connect_almost_junction:{annotation:"Connected very close features."},connect_crossing_features:{annotation:"Connected crossing features."},connect_endpoints:{title:"Connect the ends",annotation:"Connected the endpoints of a way."},connect_features:{title:"Connect the features"},continue_from_start:{title:"Continue drawing from start"},continue_from_end:{title:"Continue drawing from end"},delete_feature:{title:"Delete this feature"},move_tags:{title:"Move the tags",annotation:"Moved tags."},remove_deprecated_tag:{annotation:"Removed an old tag."},remove_deprecated_tag_combo:{annotation:"Removed an old tag combination."},remove_from_relation:{title:"Remove from relation"},remove_generic_name:{title:"Remove the name",annotation:"Removed a generic name."},remove_tag:{title:"Remove the tag",annotation:"Removed tag."},remove_tags:{title:"Remove the tags"},reposition_features:{title:"Reposition the features"},select_preset:{title:"Select a feature type"},set_as_inner:{title:"Set as inner"},set_as_outer:{title:"Set as outer"},tag_as_disconnected:{title:"Tag as disconnected",annotation:"Tagged very close features as disconnected."},upgrade_tag:{title:"Upgrade the tag",annotation:"Upgraded an old tag."},upgrade_tag_combo:{title:"Upgrade the tags",annotation:"Upgraded an old tag combination."},use_bridge_or_tunnel:{title:"Use a bridge or tunnel"},use_different_layers:{title:"Use different layers"},use_different_levels:{title:"Use different levels"},use_tunnel:{title:"Use a tunnel"}}},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",sidebar:"Toggle sidebar",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",zoom_to:"Zoom to selected feature"},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}"},wikidata:{identifier:"Identifier",label:"Label",description:"Description"},presets:{categories:{"category-barrier":{name:"Barrier Features"},"category-building":{name:"Building Features"},"category-golf-area":{name:"Golf Features"},"category-golf-line":{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-utility":{name:"Utility 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"},architect:{label:"Architect"},"area/highway":{label:"Type"},artist:{label:"Artist"},artwork_type:{label:"Type"},atm:{label:"ATM"},attraction:{label:"Type"},backrest:{label:"Backrest"},bar:{label:"Bar"},barrier:{label:"Type"},basin:{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:"Beauty Specialty"},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"},"bridge/support":{label:"Type"},building_area:{label:"Building"},building:{label:"Building"},"building/material":{label:"Material"},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"},check_date:{label:"Last Checked Date"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},colour:{label:"Color"},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"},conveying:{label:"Movement Direction",options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}},country:{label:"Country"},couplings:{label:"Couplings",placeholder:"1, 2, 3..."},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"},departures_board:{label:"Departures Board",options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}},description:{label:"Description"},design:{label:"Design"},destination_oneway:{label:"Destinations"},"destination/ref_oneway":{label:"Destination Road Numbers"},"destination/symbol_oneway":{label:"Destination Symbols"},devices:{label:"Devices",placeholder:"1, 2, 3..."},diaper:{label:"Diaper Changing Available"},diet_multi:{label:"Diet Types"},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:"Distance"},dock:{label:"Type"},dog:{label:"Dogs",options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}},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"},enforcement:{label:"Type"},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/diameter":{label:"Diameter (mm, in, or letters)"},"fire_hydrant/pressure":{label:"Pressure (bar)"},"fire_hydrant/type":{label:"Shape",options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}},fireplace:{label:"Fireplace"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},ford:{label:"Type",placeholder:"Default"},frequency_electrified:{label:"Operating Frequency"},frequency:{label:"Operating Frequency"},from:{label:"From"},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"},"historic/wreck/date_sunk":{label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{label:"Visible At Low Tide"},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_yes:{label:"Intermittent"},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)"},junction_line:{label:"Junction",options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}},"junction/ref_oneway":{label:"Junction Number"},kerb:{label:"Curb"},label:{label:"Label"},lamp_type:{label:"Type"},landuse:{label:"Type"},lanes:{label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{label:"Languages"},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_pool:{label:"Location",options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}},location:{label:"Location"},man_made:{label:"Type"},manhole:{label:"Type"},map_size:{label:"Coverage"},map_type:{label:"Type"},material:{label:"Material"},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"},minspeed:{label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}},"oneway/bicycle":{label:"One Way (Bicycles)"},opening_date:{label:"Expected Opening Date"},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"}},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}},"piste/difficulty_skitour":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}},"piste/grooming_downhill":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}},"piste/grooming_hike":{label:"Grooming",options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}},"piste/grooming_nordic":{label:"Grooming",options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"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",connection:"Connection"}},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"},recycling_type:{label:"Type",placeholder:"Container, Center",options:{container:"Container",centre:"Center"}},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"},"roof/colour":{label:"Roof Color"},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"}},salt:{label:"Salt"},sanitary_dump_station:{label:"Toilet Disposal"},scuba_diving:{label:"Services"},"seamark/beacon_isolated_danger/shape":{label:"Shape"},"seamark/beacon_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}},"seamark/beacon_lateral/colour":{label:"Color",options:{red:"Red",green:"Green",grey:"Grey"}},"seamark/beacon_lateral/shape":{label:"Shape"},"seamark/beacon_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/buoy_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}},"seamark/buoy_lateral/colour":{label:"Color",options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}},"seamark/buoy_lateral/shape":{label:"Shape"},"seamark/buoy_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/mooring/category":{label:"Category"},"seamark/type":{label:"Seamark"},"seamark/wreck/category":{label:"Category"},seasonal:{label:"Seasonal"},seats:{label:"Seats",placeholder:"2, 4, 6..."},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"},"survey/date":{label:"Last Survey Date"},swimming_pool:{label:"Type"},"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"}},tidal:{label:"Tidal"},to:{label:"To"},"toilets/disposal":{label:"Disposal",options:{flush:"Flush",pitlatrine:"Pit/Latrine",chemical:"Chemical",bucket:"Bucket"}},toll:{label:"Toll"},tomb:{label:"Type"},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_sign:{label:"Traffic Sign"},"traffic_sign/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},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_electrified:{label:"Voltage"},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_source:{label:"Water Source"},water_volume:{label:"Water Reserve Volume (m³)"},water:{label:"Type"},waterway:{label:"Type"},website:{label:"Website",placeholder:"https://example.com"},wetland:{label:"Type"},wheelchair:{label:"Wheelchair Access"},wholesale:{label:"Wholesale"},width:{label:"Width (Meters)"},wikidata:{label:"Wikidata"},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:""},aeroway:{name:"Aeroway",terms:""},amenity:{name:"Amenity",terms:""},attraction:{name:"Attraction",terms:""},boundary:{name:"Boundary",terms:""},circular:{name:"Traffic Circle",terms:""},embankment:{name:"Embankment",terms:""},highway:{name:"Highway",terms:""},landuse:{name:"Land Use",terms:""},leisure:{name:"Leisure",terms:""},man_made:{name:"Man Made",terms:""},natural:{name:"Natural",terms:""},place:{name:"Place",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},roundabout:{name:"Roundabout",terms:""},seamark:{name:"Seamark",terms:""},tourism:{name:"Tourism",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/recycling":{name:"Recycling",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"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/clock/sundial":{name:"Sundial",terms:"gnomon,shadow"},"amenity/college":{name:"College Grounds",terms:"university,undergraduate school"},"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/dive_centre":{name:"Dive Center",terms:"diving,scuba"},"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:"potable water source,water fountain,drinking fountain,bubbler,water tap"},"amenity/driving_school":{name:"Driving School",terms:""},"amenity/embassy":{name:"Embassy",terms:""},"amenity/fast_food":{name:"Fast Food",terms:"restaurant,takeaway"},"amenity/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/mexican":{name:"Mexican Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"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/language_school":{name:"Language School",terms:"esl"},"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/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"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:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy Counter",terms:"apothecary,drug store,drugstore,med*,prescription"},"amenity/photo_booth":{name:"Photo Booth",terms:"photobooth,photo,booth,kiosk,camera"},"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:"Christian 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:"Jewish Synagogue",terms:"jewish"},"amenity/place_of_worship/muslim":{name:"Muslim 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_container":{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/restaurant/american":{name:"American Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/asian":{name:"Asian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/chinese":{name:"Chinese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/french":{name:"French Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/german":{name:"German Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/greek":{name:"Greek Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,gyros,pitas,olives"},"amenity/restaurant/indian":{name:"Indian Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,curry"},"amenity/restaurant/italian":{name:"Italian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,pasta,pizza"},"amenity/restaurant/japanese":{name:"Japanese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/mexican":{name:"Mexican Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/restaurant/noodle":{name:"Noodle Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,ramen noodles,soup,soba noodles,cellophane noodles,rice noodles"},"amenity/restaurant/pizza":{name:"Pizza Restaurant",terms:"bar,dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/restaurant/seafood":{name:"Seafood Restaurant",terms:"bar,breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,fish,shellfish,molluscs,crustaceans,clams,oysters,lobsters,crab,shrimp,squid,octopus"},"amenity/restaurant/steakhouse":{name:"Steakhouse",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,steak house,chop house,beef"},"amenity/restaurant/sushi":{name:"Sushi Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/thai":{name:"Thai Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/turkish":{name:"Turkish Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/vietnamese":{name:"Vietnamese Restaurant",terms:"bar,breakfast,cafe,café,canteen,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/shelter/gazebo":{name:"Gazebo",terms:""},"amenity/shelter/lean_to":{name:"Lean-To",terms:""},"amenity/shelter/picnic_shelter":{name:"Picnic Shelter",terms:"pavilion"},"amenity/shelter/public_transport":{name:"Transit Shelter",terms:"bus stop,metro stop,waiting"},"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/theatre/type/amphi":{name:"Amphitheatre",terms:"open air,outdoor,greek,ampi"},"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,graduate school,PhD program,master's degree program"},"amenity/vehicle_inspection":{name:"Vehicle Inspection",terms:"car inspection"},"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 Dispenser",terms:"excrement bags,poop,waste,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 Locker",terms:"mail,parcel,pickup"},"amenity/vending_machine/parcel_pickup":{name:"Parcel Pickup Locker",terms:"amazon,locker,mail,parcel,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/summer_toboggan":{name:"Summer Toboggan",terms:"alpine slide,mountain coaster"},"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/fence/railing":{name:"Railing",terms:"railing,handrail,guard rail"},"barrier/gate":{name:"Gate",terms:""},"barrier/guard_rail":{name:"Guard Rail",terms:"guardrail,traffic barrier,crash barrier,median barrier,roadside barrier,Armco barrier"},"barrier/hedge":{name:"Hedge",terms:""},"barrier/kerb":{name:"Curb",terms:""},"barrier/kerb/flush":{name:"Flush Curb",terms:"even curb,level curb,tactile curb"},"barrier/kerb/lowered":{name:"Lowered Curb",terms:"curb cut,curb ramp,kerb ramp,dropped kerb,pram ramp"},"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:""},"bridge/support":{name:"Bridge Support",terms:""},"bridge/support/pier":{name:"Bridge Pier",terms:""},building:{name:"Building",terms:""},"building/bunker":{name:"Bunker",terms:""},"building/entrance":{name:"Entrance/Exit",terms:""},"building/train_station":{name:"Train Station Building",terms:""},"building/apartments":{name:"Apartment Building",terms:""},"building/barn":{name:"Barn",terms:""},"building/boathouse":{name:"Boathouse",terms:""},"building/bungalow":{name:"Bungalow",terms:"home,detached"},"building/cabin":{name:"Cabin",terms:""},"building/carport":{name:"Carport",terms:"covered parking space,garage,car,porch"},"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/pavilion":{name:"Pavilion Building",terms:"sports"},"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"},"club/sport":{name:"Sports Club",terms:"athletics club,sporting club,sports association,sports society"},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:""},"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,fire water well,hydrant"},"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"},ford:{name:"Ford",terms:""},"golf/bunker":{name:"Sand Trap",terms:"hazard,bunker"},"golf/cartpath_service":{name:"Golf Cartpath / Service Road",terms:""},"golf/cartpath":{name:"Golf Cartpath",terms:""},"golf/driving_range":{name:"Driving Range",terms:""},"golf/fairway":{name:"Fairway",terms:""},"golf/green":{name:"Putting Green",terms:""},"golf/hole":{name:"Golf Hole",terms:""},"golf/lateral_water_hazard":{name:"Lateral Water Hazard",terms:""},"golf/path":{name:"Golf Walking Path",terms:""},"golf/rough":{name:"Rough",terms:""},"golf/tee":{name:"Tee Box",terms:"teeing ground"},"golf/water_hazard":{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/construction":{name:"Road Closed",terms:"closed,closure,construction"},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/crossing/unmarked":{name:"Unmarked Crossing",terms:""},"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/footway/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/conveying":{name:"Moving Walkway",terms:"moving sidewalk,autwalk,skywalk,travolator,travelator,travellator,conveyor"},"highway/footway/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/sidewalk":{name:"Sidewalk",terms:"pavement,sidepath"},"highway/footway/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/footway/unmarked":{name:"Unmarked Crossing",terms:""},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/milestone":{name:"Highway Milestone",terms:"milestone,marker"},"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/steps/conveying":{name:"Escalator",terms:"moving staircase,moving stairway,people mover"},"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:""},"historic/wreck":{name:"Shipwreck",terms:"hull,mast,maritime,remains,ship,boat"},"internet_access/wlan":{name:"Wi-Fi Hotspot",terms:"wi-fi,wifi,hotspot"},junction:{name:"Junction",terms:""},"landuse/basin":{name:"Basin",terms:""},"landuse/farm":{name:"Farmland",terms:""},"landuse/pond":{name:"Pond",terms:""},"landuse/reservoir":{name:"Reservoir",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/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:"Managed Forest",terms:"cut,forest,forestry,lumber,silviculture,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/residential/apartments":{name:"Apartment Complex",terms:"flat,residence,tenement"},"landuse/retail":{name:"Retail Area",terms:""},"landuse/vineyard":{name:"Vineyard",terms:"grape,wine"},"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/bandstand":{name:"Bandstand",terms:""},"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/fishing":{name:"Fishing Spot",terms:"angler"},"leisure/fitness_centre":{name:"Gym / Fitness Center",terms:"health,gym,leisure,studio"},"leisure/fitness_centre/yoga":{name:"Yoga Studio",terms:"studio,asanas,modern yoga,meditation"},"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/picnic_table/chess":{name:"Chess Table",terms:"bench,chess board,checkerboard,checkers,chequerboard,game table"},"leisure/pitch":{name:"Sport Pitch",terms:"field"},"leisure/pitch/american_football":{name:"American Football Field",terms:"football,gridiron"},"leisure/pitch/australian_football":{name:"Australian Football Field",terms:"Aussie,AFL,football"},"leisure/pitch/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Field",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/netball":{name:"Netball Court",terms:""},"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/softball":{name:"Softball Field",terms:"softball,diamond"},"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/sauna":{name:"Sauna",terms:""},"leisure/slipway":{name:"Slipway",terms:"boat launch,boat ramp,boat landing"},"leisure/sports_centre":{name:"Sports Center / Complex",terms:""},"leisure/sports_centre/climbing":{name:"Climbing Gym",terms:"abseiling,artificial climbing wall,belaying,bouldering,rock climbing facility,indoor rock wall,rappeling,rock gym,ropes"},"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,aquatics"},"leisure/track":{name:"Racetrack (Non-Motorsport)",terms:"cycle,dog,greyhound,horse,race*,track"},"leisure/track/horse_racing":{name:"Racetrack (Horse Racing)",terms:"race*,horse,track"},"leisure/track/running":{name:"Racetrack (Running)",terms:"race*,running,sprint,track"},"leisure/water_park":{name:"Water Park",terms:"swim,pool,dive"},line:{name:"Line",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/embankment":{name:"Embankment",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/mast/communication":{name:"Communication 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/mast/communication/mobile_phone":{name:"Mobile Phone Mast",terms:"antenna,cell mast,cell phone mast,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,transmission mast,transmission tower"},"man_made/mast/communication/radio":{name:"Radio Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,radio mast,radio tower,transmission mast,transmission tower"},"man_made/mast/communication/television":{name:"Television Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,television mast,television tower,transmission mast,transmission tower,tv mast,tv tower"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"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:"oil,natural gas,water,sewer,sewage"},"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":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"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/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{name:"Tower",terms:""},"man_made/tower/bell_tower":{name:"Bell Tower",terms:"belfry,bell gable,campanile,church tower,klockstapel"},"man_made/tower/communication":{name:"Communication Tower",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/tower/minaret":{name:"Minaret",terms:"Islam,mosque,Muezzin,Muslim"},"man_made/tower/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"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/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/basin":{name:"Basin",terms:"detention,drain,overflow,rain,retention"},"natural/water/canal":{name:"Canal",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/water/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,riverbank,rivulet,run,runnel,stream,tributary,watercourse"},"natural/water/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"},"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:"real estate"},"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/religion":{name:"Religious Office",terms:""},"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/downhill":{name:"Downhill Piste/Ski Run",terms:"ski,alpine,snowboard,downhill,piste"},"piste/downhill/halfpipe":{name:"Halfpipe",terms:"ski,alpine,halfpipe,half pipe,snowboard,downhill,piste"},"piste/hike":{name:"Snowshoeing or Winter Hiking Trail",terms:"hike,winter hiking,snowshoe,snowshoeing,piste,ski"},"piste/ice_skate":{name:"Ice Skating Piste",terms:"ice,skating,ski,piste"},"piste/nordic":{name:"Nordic or Crosscountry Piste/Ski Trail",terms:"ski,nordic,crosscountry,skating,piste"},"piste/piste":{name:"Winter Sport Trails",terms:"ski,nordic,crosscountry,downhill,alpine,snowboard,skitour,ski touring,sled,luge,sleigh,sledge,ski-joring,husky,horse,winter hiking,snowshoe,snowshoeing,ice,skating"},"piste/skitour":{name:"Ski Touring Trail",terms:"ski,skitour,crosscountry,ski touring,piste"},"piste/sled":{name:"Sled Piste",terms:"ski,sled,luge,sleigh,sledge,piste"},"piste/sleigh":{name:"Sleigh Piste",terms:"ski,piste,sled,luge,sleigh,sledge,ski-joring,husky,horse"},"place/farm":{name:"Farm",terms:""},"place/city_block":{name:"City Block",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/cable/underground":{name:"Underground Power Cable",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/method/photovoltaic":{name:"Solar Panel",terms:"photovoltaic module,PV module,sunlight"},"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"},"power/transformer":{name:"Transformer",terms:""},"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:""},"seamark/beacon_isolated_danger":{name:"Danger Beacon",terms:"beacon isolated danger,isolated danger beacon,iala"},"seamark/beacon_lateral":{name:"Channel Beacon",terms:"lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral":{name:"Channel Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/green":{name:"Green Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/red":{name:"Red Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/mooring":{name:"Mooring",terms:"dolphin,pile,bollard,buoy,post"},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:"bread,cakes,rolls"},"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:"drinks"},"shop/bicycle":{name:"Bicycle Shop",terms:"bike,repair,tricycle,unicycle"},"shop/bookmaker":{name:"Bookmaker",terms:"betting,bookie"},"shop/books":{name:"Book Store",terms:""},"shop/boutique":{name:"Boutique",terms:""},"shop/butcher":{name:"Butcher",terms:"chicken,beef,lamb,meat,pork"},"shop/candles":{name:"Candle Shop",terms:"wax"},"shop/car_parts":{name:"Car Parts Store",terms:"automobile,automotive"},"shop/car_repair":{name:"Car Repair Shop",terms:"automobile,automotive,garage,service"},"shop/car":{name:"Car Dealership",terms:"automobile,automotive"},"shop/caravan":{name:"RV Dealership",terms:"auto,camper,recreational vehicle"},"shop/carpet":{name:"Carpet Store",terms:"rug"},"shop/catalogue":{name:"Catalog Shop",terms:""},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,beauty,drug store,drugstore,gift,hair,med*,pharmacy,prescription,tooth"},"shop/chocolate":{name:"Chocolate Store",terms:"cocoa"},"shop/clothes":{name:"Clothing Store",terms:""},"shop/coffee":{name:"Coffee Store",terms:""},"shop/computer":{name:"Computer Store",terms:"desktop,laptop,hardware,operating system,software"},"shop/confectionery":{name:"Candy Store",terms:"sweet"},"shop/convenience":{name:"Convenience Store",terms:""},"shop/copyshop":{name:"Copy Store",terms:"print,scan"},"shop/cosmetics":{name:"Cosmetics Store",terms:"make-up,makeup"},"shop/country_store":{name:"Country 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,vape,vaping,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/fireplace":{name:"Fireplace Store",terms:"fireplace,stove,masonry heater"},"shop/fishing":{name:"Fishing Shop",terms:"bait,fishing line,flies,fly,lure,reel,rod,tackle"},"shop/florist":{name:"Florist",terms:"flower"},"shop/frame":{name:"Framing Shop",terms:"art*,paint*,photo*,frame"},"shop/frozen_food":{name:"Frozen Food",terms:""},"shop/fuel":{name:"Fuel Shop",terms:""},"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,produce,vegetable"},"shop/hairdresser_supply":{name:"Hairdresser Supply Store",terms:"barber,shampoo,conditioner"},"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:"audio,hi-fi,high fidelity,stereo,video"},"shop/houseware":{name:"Houseware Store",terms:"home,household"},"shop/hunting":{name:"Hunting Shop",terms:"arrows,bows,bullets,crossbows,rifles,traps"},"shop/interior_decoration":{name:"Interior Decoration Store",terms:""},"shop/jewelry":{name:"Jewelry Store",terms:"bracelet,diamond,earrings,gem,gold,jeweler,jewellery,jeweller,necklace,pins,ring,silver"},"shop/kiosk":{name:"Kiosk",terms:""},"shop/kitchen":{name:"Kitchen Design Store",terms:"cabinets,countertops,sinks"},"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:"tape casettes,CDs,compact discs,vinyl records"},"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,outfitter,outdoor equipment,outdoor supplies"},"shop/paint":{name:"Paint Store",terms:""},"shop/party":{name:"Party Supply Store",terms:"balloons,costumes,decorations,invitations"},"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:"cat,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:"antenna,transistor"},"shop/religion":{name:"Religious Store",terms:""},"shop/scuba_diving":{name:"Scuba Diving Shop",terms:"diving,scuba"},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/sewing":{name:"Sewing Supply Shop",terms:"haberdashery"},"shop/shoes":{name:"Shoe Store",terms:"boots,cleats,clogs,heels,loafers,oxfords,sneakers"},"shop/sports":{name:"Sporting Goods Store",terms:"athletics"},"shop/stationery":{name:"Stationery Store",terms:"card,paper"},"shop/storage_rental":{name:"Storage Rental",terms:"garages"},"shop/supermarket":{name:"Supermarket",terms:"grocery,store,shop"},"shop/tailor":{name:"Tailor",terms:"clothes,suit"},"shop/tattoo":{name:"Tattoo Parlor",terms:"ink"},"shop/tea":{name:"Tea Store",terms:""},"shop/ticket":{name:"Ticket Seller",terms:"box office"},"shop/tiles":{name:"Tile Shop",terms:""},"shop/tobacco":{name:"Tobacco Shop",terms:"cigarettes,cigars"},"shop/toys":{name:"Toy Store",terms:"games"},"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,VHS,video casette"},"shop/watches":{name:"Watches Shop",terms:""},"shop/water_sports":{name:"Watersport/Swim Shop",terms:""},"shop/water":{name:"Drinking Water 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/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/artwork/mural":{name:"Mural",terms:"fresco,wall painting"},"tourism/artwork/sculpture":{name:"Sculpture",terms:"statue,figure,carving"},"tourism/artwork/statue":{name:"Statue",terms:"sculpture,figure,carving"},"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"},traffic_sign_vertex:{name:"Traffic Sign",terms:"road,highway"},traffic_sign:{name:"Traffic Sign",terms:"road,highway"},"traffic_sign/city_limit_vertex":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/city_limit":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/maxspeed_vertex":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"traffic_sign/maxspeed":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"type/multipolygon":{name:"Multipolygon",terms:""},"type/boundary":{name:"Boundary",terms:""},"type/boundary/administrative":{name:"Administrative Boundary",terms:""},"type/enforcement":{name:"Enforcement",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/riverbank":{name:"Riverbank",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/milestone":{name:"Waterway Milestone",terms:"milestone,marker"},"waterway/river":{name:"River",terms:"beck,branch,brook,course,creek,estuary,rill,rivulet,run,runnel,stream,tributary,watercourse"},"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-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-TIGER-Roads-2018":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2018"},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"},UrbISOrtho2018:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2018"},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"},"eufar-balaton":{attribution:{text:"EUFAR Balaton ortofotó 2010"},description:"1940 geo-tagged photography from Balaton Limnological Institute.",name:"EUFAR Balaton orthophotos"},"finds.jp_KBN_2500":{attribution:{text:"GSI KIBAN 2500"},description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older.",name:"Japan GSI KIBAN 2500"},"gsi.go.jp":{attribution:{text:"GSI Japan"},description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older.",name:"Japan GSI ortho Imagery"},"gsi.go.jp_airphoto":{attribution:{text:"GSI Japan"},description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery.",name:"Japan GSI airphoto Imagery"},"gsi.go.jp_seamlessphoto":{attribution:{text:"GSI Japan seamless photo"},description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others.",name:"Japan GSI seamlessphoto Imagery"},"gsi.go.jp_std_map":{attribution:{text:"GSI Japan"},description:"Japan GSI Standard Map. Widely covered.",name:"Japan GSI Standard Map"},"helsingborg-orto":{attribution:{text:"© Helsingborg municipality"},description:"Orthophotos from the municipality of Helsingborg 2016, public domain",name:"Helsingborg Orthophoto"},"kalmar-orto-2014":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the north coast of the municipality of Kalmar 2014",name:"Kalmar North Orthophoto 2014"},"kalmar-orto-2016":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the south coast of the municipality of Kalmar 2016",name:"Kalmar South Orthophoto 2016"},"kalmar-orto-2018":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for urban areas of the municipality of Kalmar 2018",name:"Kalmar Urban Orthophoto 2018"},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"},"lantmateriet-topowebb":{attribution:{text:"© Lantmäteriet, CC0"},description:"Topographic map of Sweden 1:50 000",name:"Lantmäteriet Topographic Map"},"linkoping-orto":{attribution:{text:"© Linköping municipality"},description:"Orthophotos from the municipality of Linköping 2010, open data",name:"Linköping Orthophoto"},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"},"stockholm-orto":{attribution:{text:"© Stockholm municipality, CC0"},description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",name:"Stockholm Orthophoto"},"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-forum":{name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum"},"osm-india-github":{name:"OpenStreetMap India GitHub",description:"Code with us: {url}"},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"osm-india-telegram":{name:"OpenStreetMap India Telegram",description:"Join our family: {url}"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"osm-india-website":{name:"OpenStreetMap India",description:"Mappers and OpenStreetMap users in India"},"osm-india-wiki":{name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}"},"osm-india-youtube":{name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {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-Puducherry-Mailing-List":{name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap."},"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-iran-aparat":{name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian."},"osm-iran-forum":{name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!"},"osm-iran-telegram":{name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel."},"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-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-Asia-mailinglist":{name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community"},"osm-asia-telegram":{name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}"},"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-south-korea-telegram":{name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South Korea to share and discuss."},"OSM-sri-lanka-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-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"},"kosovo-telegram":{name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language."},"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"},"no-telegram":{name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat"},"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."},"MaptimeHRVA-twitter":{name:"MaptimeHRVA Twitter",description:"Follow us on Twitter at {url}"},"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-Discord":{name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord"},"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-IRC":{name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)"},"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"}}}}};
25804
25805   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]]]}},asia_full:{type:"Feature",id:"asia_full",properties:{},geometry:{type:"Polygon",coordinates:[[[51,13.5],[43.5,12.3],[34.25,27.3],[34.9,29.45],[34,31.9],[27,34.7],[25.1,39],[25.6,40.2],[26.33,40.98],[26.33,41.23],[26.63,41.36],[26.58,41.6],[26.32,41.76],[27.2,42.1],[27.55,41.93],[35,43],[38.3,47.6],[38.7,47.7],[38.86,47.86],[39.74,47.82],[40.1,49.6],[38,50],[37.4,50.4],[36.65,50.25],[35.66,50.35],[35.2,51.1],[34.28,51.27],[34.1,51.7],[34.4,51.73],[33.9,52.35],[31.8,52.05],[31.3,53.1],[32.8,53.3],[30.77,54.78],[30.95,55.61],[28.19,56.13],[27.83,57.29],[27.33,57.53],[27.7,57.9],[27.3,58.7],[28.2,59.37],[27.2,60.2],[31.5,62.6],[29,67],[30,67.66],[28.27,68.6],[31,70],[31,90],[180,90],[180,60],[130,7],[130,-0.5],[131.8,-3.5],[132.3,-8],[128,-11.3],[65,-11.3],[51,13.5]]]}},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_andhrapradesh:{type:"Feature",id:"india_andhrapradesh",properties:{},geometry:{type:"Polygon",coordinates:[[[76.76365,14.98503],[76.78952,15.01589],[76.77614,15.05336],[76.80034,15.09466],[76.86072,15.05669],[76.87678,15.02859],[76.94279,15.02725],[76.98159,15.0103],[77.00077,15.02948],[77.04671,15.02904],[77.07882,15.00004],[77.1096,15.02859],[77.12744,15.09371],[77.14751,15.10753],[77.16873,15.17462],[77.14554,15.22413],[77.15223,15.29148],[77.12118,15.29418],[77.11387,15.3334],[77.07705,15.32577],[77.0421,15.36103],[77.027,15.44075],[76.97414,15.50807],[77.02697,15.5037],[77.03509,15.63815],[77.08728,15.65733],[77.08192,15.69524],[77.05293,15.72914],[77.05561,15.82458],[77.03333,15.85326],[77.07659,15.90991],[77.14448,15.94265],[77.2479,15.96378],[77.3564,15.95008],[77.42745,15.94836],[77.46652,15.93453],[77.61152,15.91691],[77.6536,15.88393],[77.72205,15.89199],[77.80554,15.87083],[77.8616,15.88138],[77.89376,15.90154],[78.00803,15.86506],[78.03641,15.90188],[78.06997,15.85048],[78.10755,15.83401],[78.17153,15.85511],[78.17371,15.89569],[78.20995,15.9197],[78.2507,15.96993],[78.2682,16.02857],[78.29785,16.01169],[78.40727,16.0756],[78.45394,16.07503],[78.55814,16.04517],[78.59917,16.08361],[78.64311,16.08312],[78.68277,16.03346],[78.73718,16.0097],[78.78267,16.02125],[78.8419,16.08707],[78.83228,16.13919],[78.87606,16.13902],[78.88876,16.0879],[78.92138,16.10307],[78.9049,16.17711],[78.92807,16.19871],[78.98352,16.21074],[79.01236,16.24173],[79.09802,16.2236],[79.12305,16.23187],[79.1593,16.20893],[79.22111,16.23251],[79.23438,16.32518],[79.21143,16.35493],[79.21112,16.44396],[79.22091,16.51631],[79.25265,16.57381],[79.37802,16.58412],[79.41773,16.57986],[79.44409,16.61796],[79.49421,16.63408],[79.53884,16.63046],[79.60613,16.67239],[79.63566,16.6594],[79.68544,16.69755],[79.72286,16.68966],[79.74673,16.72106],[79.79256,16.72485],[79.81796,16.69098],[79.84286,16.70561],[79.88555,16.68642],[79.90723,16.63408],[79.95306,16.63621],[80.00576,16.70857],[80.05536,16.74833],[80.07093,16.81323],[80.0332,16.85233],[79.99173,16.86303],[80.04569,16.96517],[80.08405,16.96339],[80.134,16.98524],[80.18217,17.04501],[80.19555,17.01825],[80.26201,17.01066],[80.28877,16.97677],[80.31553,16.91254],[80.3191,16.87106],[80.35879,16.85501],[80.37306,16.8113],[80.41856,16.84252],[80.45647,16.78989],[80.56262,16.76268],[80.6041,16.78766],[80.55593,16.81843],[80.56485,16.86883],[80.59027,16.91165],[80.53184,16.95001],[80.44264,16.9451],[80.35835,16.97052],[80.38778,17.0071],[80.36682,17.0566],[80.39001,17.07623],[80.42034,17.02494],[80.48234,17.05036],[80.49616,17.10789],[80.56039,17.13822],[80.68393,17.06865],[80.82309,17.03787],[80.85877,17.05081],[80.87714,17.10478],[80.88011,17.1644],[80.91689,17.15439],[80.91892,17.22003],[80.99838,17.19012],[81.03576,17.19196],[81.05653,17.22041],[81.16295,17.23278],[81.18035,17.25463],[81.17053,17.29656],[81.19016,17.32733],[81.26732,17.3202],[81.31385,17.37576],[81.24132,17.40667],[81.22725,17.43762],[81.17746,17.45203],[81.15755,17.47938],[81.11343,17.49477],[81.08374,17.45957],[81.01198,17.49248],[80.99962,17.53013],[80.95671,17.58749],[80.85431,17.59347],[80.86444,17.62914],[80.90266,17.63912],[80.90684,17.67993],[80.89153,17.74125],[80.94636,17.76025],[81.03556,17.74495],[81.07481,17.76038],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.61119,17.81527],[81.66293,17.87682],[81.70307,17.86121],[81.78246,17.90982],[81.80119,17.93614],[81.89932,17.9687],[82.0019,18.02356],[82.03316,18.06597],[82.08072,18.07378],[82.14091,18.0439],[82.17228,18.04993],[82.25028,17.9883],[82.27583,17.995],[82.2667,18.04332],[82.29628,18.06899],[82.34354,18.07485],[82.33329,18.1422],[82.30608,18.19572],[82.33284,18.21579],[82.33685,18.26619],[82.37209,18.27421],[82.39305,18.30633],[82.33462,18.31703],[82.38458,18.36922],[82.36138,18.4098],[82.43513,18.48477],[82.48969,18.52285],[82.53139,18.51177],[82.54422,18.41638],[82.60918,18.37427],[82.59758,18.26516],[82.64005,18.23708],[82.67329,18.29908],[82.70644,18.30476],[82.77538,18.33958],[82.79251,18.36262],[82.78448,18.42803],[82.80742,18.44772],[82.89919,18.40074],[82.91103,18.36453],[82.98471,18.36362],[83.0002,18.38368],[83.04775,18.37883],[83.07472,18.401],[83.04552,18.44345],[83.05997,18.48603],[83.09665,18.54123],[83.05931,18.54334],[83.0336,18.57266],[83.05776,18.62215],[83.09414,18.63021],[83.15495,18.70089],[83.23099,18.75616],[83.27407,18.76523],[83.28745,18.79777],[83.36791,18.81557],[83.40661,18.84174],[83.39569,18.87914],[83.35554,18.92896],[83.36892,18.96132],[83.32119,18.97447],[83.3428,19.01449],[83.41665,19.00408],[83.45049,18.95576],[83.48237,19.00825],[83.46716,19.07746],[83.51314,19.07262],[83.52143,19.03271],[83.61209,19.10076],[83.62679,19.14969],[83.69206,19.05202],[83.71342,18.99346],[83.73398,18.98382],[83.79596,19.01607],[83.84255,18.9178],[83.85136,18.86003],[83.87788,18.82716],[84.05557,18.79246],[84.0894,18.75373],[84.16689,18.78415],[84.22422,18.79642],[84.2535,18.78262],[84.2914,18.8],[84.33966,18.80123],[84.39349,18.89211],[84.43671,18.92277],[84.42292,18.94711],[84.47894,18.99017],[84.51711,19.04634],[84.62687,19.08543],[84.61653,19.12624],[84.66828,19.13065],[84.6721,19.16552],[84.71352,19.1524],[84.70468,19.11772],[84.76857,19.08003],[85.15481,18.87834],[85.14492,18.85295],[85.05442,18.77126],[85.01176,18.69225],[84.94947,18.67649],[84.44354,18.21885],[83.98107,17.79763],[83.77893,17.63361],[83.20925,17.15734],[82.8246,16.92714],[82.20846,16.16914],[81.78413,16.05362],[81.60171,16.04774],[80.84225,15.52037],[80.65306,15.4875],[80.54735,15.42991],[80.4922,15.34128],[80.47381,15.25261],[80.48624,15.06582],[80.49835,15.0251],[80.66968,13.56514],[80.26863,13.56255],[80.24181,13.46797],[80.22545,13.48346],[80.14774,13.49443],[80.08045,13.49111],[80.08,13.52565],[80.00213,13.53964],[80.01841,13.50074],[79.97441,13.46419],[79.96622,13.38714],[79.93821,13.34898],[79.86379,13.31632],[79.8129,13.31712],[79.79245,13.29487],[79.73437,13.27843],[79.79598,13.24103],[79.75102,13.21106],[79.68369,13.24845],[79.68102,13.29448],[79.57781,13.26176],[79.54809,13.32329],[79.42941,13.33391],[79.41957,13.24971],[79.43293,13.1966],[79.39666,13.19679],[79.36005,13.17504],[79.36244,13.13752],[79.31106,13.1268],[79.28351,13.14994],[79.23853,13.1464],[79.20549,13.10147],[79.16498,13.01908],[79.06532,13.04951],[78.99361,13.08754],[78.95768,13.07478],[78.81243,13.08649],[78.75104,13.05634],[78.71387,13.06691],[78.70525,13.01518],[78.6625,13.02861],[78.63167,12.98455],[78.63629,12.92494],[78.60313,12.84933],[78.59178,12.77804],[78.55737,12.73938],[78.55312,12.69582],[78.50595,12.74103],[78.50517,12.68031],[78.46933,12.67292],[78.47136,12.62811],[78.3799,12.62235],[78.30177,12.66322],[78.27563,12.70205],[78.23857,12.6994],[78.23025,12.75702],[78.2528,12.82236],[78.25198,12.85741],[78.31411,12.85733],[78.32741,12.90272],[78.35638,12.93819],[78.38944,12.90542],[78.41213,12.94302],[78.46924,12.97546],[78.46092,13.03126],[78.5219,13.06638],[78.54509,13.11098],[78.57956,13.21461],[78.57797,13.28201],[78.51185,13.28722],[78.44649,13.30825],[78.43949,13.327],[78.36546,13.36503],[78.38151,13.40071],[78.37259,13.46181],[78.38241,13.52477],[78.40574,13.57659],[78.39268,13.5915],[78.32632,13.59445],[78.25894,13.58461],[78.20436,13.60369],[78.16645,13.65721],[78.11784,13.65587],[78.12295,13.71405],[78.09423,13.74251],[78.12795,13.78565],[78.11441,13.8625],[78.04999,13.89494],[78.04642,13.86104],[78.00476,13.87355],[77.95566,13.82664],[77.95098,13.88825],[77.98752,13.89784],[77.97015,13.95827],[77.92868,13.90698],[77.89567,13.93954],[77.83858,13.93508],[77.81494,13.91679],[77.83635,13.86863],[77.79261,13.8211],[77.6267,13.76984],[77.53033,13.69514],[77.45805,13.68671],[77.47014,13.7502],[77.45855,13.79212],[77.41662,13.80595],[77.43223,13.84163],[77.32787,13.83226],[77.31449,13.86393],[77.25829,13.84609],[77.21904,13.86794],[77.18236,13.8682],[77.15308,13.84278],[77.18088,13.78098],[77.17444,13.76135],[77.10308,13.76759],[77.06516,13.74405],[77.0277,13.77651],[77.00003,13.74482],[76.97723,13.81547],[77.01323,13.85558],[77.04239,13.9332],[76.99574,13.96114],[77.00108,13.98729],[76.93324,14.03009],[76.97878,14.07002],[76.89779,14.16518],[76.96469,14.18169],[77.02696,14.17477],[77.02154,14.13052],[77.03389,14.05587],[77.13014,14.04533],[77.1441,14.00245],[77.28518,14.01342],[77.31997,14.03126],[77.3503,13.95767],[77.35476,13.90325],[77.39713,13.90415],[77.42702,13.98353],[77.39,14.01386],[77.33291,14.02947],[77.40204,14.1102],[77.38331,14.13607],[77.39624,14.17175],[77.51711,14.17844],[77.49659,14.23419],[77.50284,14.27834],[77.45021,14.28414],[77.44887,14.31625],[77.37617,14.33081],[77.38984,14.26937],[77.28608,14.2828],[77.28786,14.33766],[77.23835,14.31759],[77.1661,14.34301],[77.13845,14.33721],[77.11838,14.29395],[77.11539,14.22104],[77.0818,14.2159],[77.05638,14.24623],[76.9426,14.2444],[76.92967,14.27651],[76.94748,14.31179],[76.9038,14.32379],[76.88373,14.35055],[76.88774,14.3947],[76.97828,14.48256],[76.91138,14.48836],[76.87481,14.47275],[76.83244,14.52761],[76.80434,14.53207],[76.76554,14.60075],[76.77639,14.68002],[76.80359,14.7398],[76.78371,14.78455],[76.83756,14.78968],[76.86771,14.96792],[76.76736,14.97267],[76.76365,14.98503]]]}},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_karnataka:{type:"Feature",id:"india_karnataka",properties:{},geometry:{type:"Polygon",coordinates:[[[73.87267,14.75312],[74.17989,14.95708],[74.2532,14.95804],[74.29821,15.04123],[74.31574,15.18805],[74.27607,15.27727],[74.32187,15.34414],[74.28027,15.38891],[74.27464,15.54999],[74.24074,15.66684],[74.11652,15.65308],[74.16212,15.75075],[74.28923,15.73953],[74.36893,15.78648],[74.34579,15.84959],[74.43203,15.95338],[74.46484,16.0421],[74.37226,16.07692],[74.48045,16.14527],[74.50509,16.22265],[74.31843,16.32588],[74.33806,16.40125],[74.26427,16.53936],[74.33986,16.54825],[74.54427,16.63407],[74.6313,16.57831],[74.68877,16.71489],[74.91203,16.7883],[74.99259,16.95146],[75.09075,16.95064],[75.18186,16.84374],[75.26705,16.86247],[75.28311,16.95524],[75.46783,16.98524],[75.51065,16.94733],[75.66898,16.97766],[75.67389,17.11369],[75.62834,17.18928],[75.65739,17.27069],[75.58469,17.34963],[75.63468,17.47651],[75.77995,17.37683],[75.89432,17.40292],[75.93159,17.32197],[76.11996,17.37007],[76.22917,17.36301],[76.38171,17.31172],[76.37153,17.4341],[76.33086,17.46872],[76.41561,17.60431],[76.48659,17.66155],[76.48652,17.71358],[76.56488,17.76523],[76.66314,17.68771],[76.8094,17.8693],[76.92164,17.94103],[76.9513,18.05843],[76.92422,18.14531],[77.14325,18.20848],[77.20119,18.27828],[77.24726,18.41311],[77.31257,18.43674],[77.41407,18.39352],[77.3672,18.30846],[77.46332,18.26219],[77.57345,18.24294],[77.59821,18.0861],[77.64737,17.99934],[77.6208,17.9031],[77.5709,17.86625],[77.53999,17.72825],[77.45138,17.69052],[77.44541,17.58272],[77.6912,17.50865],[77.53911,17.44295],[77.52471,17.36431],[77.45747,17.34038],[77.3772,17.14285],[77.46328,17.11129],[77.50069,17.01255],[77.45223,16.91995],[77.47617,16.7804],[77.46008,16.61106],[77.37653,16.48644],[77.25617,16.47308],[77.28927,16.408],[77.41673,16.36775],[77.52418,16.3753],[77.59655,16.31743],[77.49303,16.25534],[77.51178,15.92828],[77.2479,15.96378],[77.07659,15.90991],[77.03509,15.63815],[77.027,15.44075],[77.0421,15.36103],[77.15223,15.29148],[77.16873,15.17462],[77.1096,15.02859],[76.98159,15.0103],[76.87678,15.02859],[76.80034,15.09466],[76.76736,14.97267],[76.86771,14.96792],[76.83756,14.78968],[76.77639,14.68002],[76.76554,14.60075],[76.87481,14.47275],[76.88373,14.35055],[76.94748,14.31179],[76.9426,14.2444],[77.05638,14.24623],[77.1661,14.34301],[77.28608,14.2828],[77.38984,14.26937],[77.44887,14.31625],[77.50284,14.27834],[77.51711,14.17844],[77.39624,14.17175],[77.40204,14.1102],[77.33291,14.02947],[77.42702,13.98353],[77.35476,13.90325],[77.31997,14.03126],[77.1441,14.00245],[77.03389,14.05587],[77.02696,14.17477],[76.89779,14.16518],[76.97878,14.07002],[76.93324,14.03009],[77.04239,13.9332],[76.97723,13.81547],[77.06516,13.74405],[77.17444,13.76135],[77.18236,13.8682],[77.32787,13.83226],[77.43223,13.84163],[77.47014,13.7502],[77.53033,13.69514],[77.6267,13.76984],[77.79261,13.8211],[77.89567,13.93954],[77.95098,13.88825],[78.04999,13.89494],[78.11441,13.8625],[78.11784,13.65587],[78.20436,13.60369],[78.40574,13.57659],[78.37068,13.46984],[78.40217,13.31113],[78.58854,13.26912],[78.5219,13.06638],[78.46924,12.97546],[78.35684,12.94022],[78.31447,12.8595],[78.25248,12.85994],[78.23196,12.76495],[78.08636,12.80344],[77.99036,12.80553],[77.93327,12.8876],[77.81099,12.8303],[77.74108,12.67162],[77.60006,12.6661],[77.58743,12.51473],[77.63575,12.48605],[77.61553,12.36799],[77.52722,12.27746],[77.51993,12.19264],[77.60853,12.20409],[77.73432,12.17555],[77.77447,12.12033],[77.67932,11.97287],[77.60217,11.93627],[77.49513,11.94251],[77.42332,11.77259],[77.29576,11.80871],[77.11315,11.77337],[77.01458,11.81306],[76.90977,11.79343],[76.8262,11.60485],[76.56305,11.62046],[76.51399,11.70565],[76.41621,11.67255],[76.20482,11.86247],[76.1155,11.8579],[76.11204,11.97862],[76.00455,11.93123],[75.86924,11.95161],[75.79654,12.0533],[75.63883,12.14712],[75.5804,12.1556],[75.4863,12.29074],[75.43456,12.29653],[75.37427,12.46113],[75.22345,12.56714],[75.1619,12.66883],[75.06067,12.66842],[75.00958,12.79255],[74.8591,12.76032],[74.64061,12.65899],[74.51827,12.99543],[74.32397,13.82179],[73.87267,14.75312]]]}},india_kerala:{type:"Feature",id:"india_kerala",properties:{},geometry:{type:"Polygon",coordinates:[[[74.64061,12.65899],[74.8591,12.76032],[74.88399,12.75347],[74.95843,12.78474],[75.00958,12.79255],[74.99766,12.73819],[75.05297,12.71899],[75.06067,12.66842],[75.11342,12.67842],[75.1619,12.66883],[75.14362,12.63805],[75.18287,12.63181],[75.22345,12.56714],[75.23683,12.56625],[75.28071,12.61847],[75.29121,12.59649],[75.27114,12.55367],[75.28095,12.51799],[75.33492,12.49034],[75.3573,12.46234],[75.39003,12.49736],[75.41661,12.49293],[75.4241,12.46603],[75.39599,12.45143],[75.37427,12.46113],[75.36747,12.41202],[75.38331,12.39011],[75.42333,12.37233],[75.41374,12.34763],[75.43456,12.29653],[75.4863,12.29074],[75.51484,12.25818],[75.53759,12.20064],[75.5804,12.1556],[75.63883,12.14712],[75.66604,12.09583],[75.68727,12.10816],[75.73047,12.07283],[75.75506,12.08318],[75.79833,12.08006],[75.79654,12.0533],[75.82391,12.01308],[75.82999,11.98372],[75.86924,11.95161],[76.00455,11.93123],[76.03621,11.9406],[76.07903,11.96914],[76.11204,11.97862],[76.1155,11.8579],[76.15528,11.87128],[76.20482,11.86247],[76.22662,11.80542],[76.27964,11.81018],[76.30774,11.78297],[76.31799,11.75041],[76.34252,11.73748],[76.41129,11.75913],[76.42399,11.72006],[76.40338,11.70748],[76.41621,11.67255],[76.44345,11.63744],[76.42497,11.62329],[76.37992,11.6224],[76.37056,11.59341],[76.29786,11.56442],[76.2711,11.59296],[76.2256,11.56442],[76.24255,11.52874],[76.24478,11.49439],[76.32105,11.44489],[76.33354,11.45871],[76.39063,11.42794],[76.44861,11.38155],[76.53826,11.35167],[76.54532,11.30094],[76.52349,11.27236],[76.45271,11.23905],[76.44934,11.20462],[76.51048,11.21163],[76.53385,11.19671],[76.60091,11.20654],[76.62971,11.19413],[76.69784,11.23906],[76.72537,11.22534],[76.72765,11.19388],[76.69301,11.17193],[76.69124,11.14472],[76.73852,11.12108],[76.74788,11.07514],[76.73718,11.04749],[76.69507,11.02252],[76.68644,10.98934],[76.66047,10.96052],[76.64932,10.92395],[76.73272,10.88113],[76.77286,10.88158],[76.81746,10.86195],[76.85983,10.79996],[76.88838,10.79996],[76.8973,10.77096],[76.875,10.70674],[76.85537,10.67507],[76.87277,10.62958],[76.80497,10.62646],[76.80854,10.59434],[76.82995,10.58498],[76.81746,10.43869],[76.8072,10.41505],[76.83932,10.35974],[76.82944,10.30749],[76.9018,10.26001],[76.90974,10.23668],[76.93976,10.23927],[76.98194,10.22077],[77.04075,10.25298],[77.06496,10.29751],[77.11964,10.31782],[77.17683,10.35777],[77.23655,10.35242],[77.21441,10.30577],[77.25054,10.25359],[77.25544,10.22549],[77.28042,10.20721],[77.26769,10.12222],[77.23784,10.12768],[77.20426,10.11207],[77.21976,10.07801],[77.26184,10.03015],[77.25908,9.9945],[77.27231,9.96404],[77.24834,9.95177],[77.21305,9.87549],[77.23646,9.85946],[77.22277,9.82317],[77.24656,9.80841],[77.20553,9.69439],[77.17963,9.65641],[77.16816,9.61495],[77.21264,9.60207],[77.23711,9.58089],[77.27684,9.57498],[77.3042,9.59951],[77.36511,9.54996],[77.3997,9.49683],[77.39331,9.45986],[77.36661,9.46037],[77.33693,9.40901],[77.33713,9.36507],[77.32506,9.33664],[77.28329,9.30039],[77.28844,9.27469],[77.26509,9.18184],[77.26714,9.15394],[77.24693,9.12483],[77.21199,9.101],[77.18667,9.04329],[77.16025,9.03584],[77.14986,9.01008],[77.17354,8.99121],[77.19759,8.95104],[77.19567,8.9236],[77.2559,8.8781],[77.25798,8.83758],[77.2292,8.78679],[77.19607,8.74588],[77.17517,8.73703],[77.20586,8.68645],[77.21552,8.64836],[77.27872,8.56521],[77.26344,8.50713],[77.20618,8.47859],[77.22506,8.44602],[77.18854,8.43476],[77.15375,8.37722],[77.14974,8.32192],[77.12209,8.32281],[77.09077,8.2973],[76.92132,8.09605],[76.6728,8.34299],[76.46487,8.59279],[76.22556,8.95652],[75.91159,10.04616],[75.68288,10.55908],[75.58764,10.89204],[75.55244,11.04304],[75.25797,11.51227],[75.53645,11.69255],[75.53089,11.70357],[75.25113,11.52458],[74.97117,11.94518],[74.71236,12.49398],[74.64061,12.65899]]]}},india_maharashtra:{type:"Feature",id:"india_maharashtra",properties:{name:"Maharashtra"},geometry:{type:"Polygon",coordinates:[[[72.53789,20.1498],[72.80202,20.12516],[72.87472,20.22596],[72.97061,20.21213],[72.97329,20.13096],[73.18604,20.05291],[73.29353,20.15371],[73.31137,20.20723],[73.43,20.20634],[73.41484,20.38162],[73.47594,20.49491],[73.51787,20.67019],[73.62224,20.62514],[73.63428,20.58232],[73.74801,20.56716],[73.84658,20.62336],[73.88538,20.72951],[73.93846,20.76073],[73.94515,20.84012],[73.79279,21.06787],[73.68111,21.15233],[73.82249,21.17195],[73.83231,21.2674],[73.94827,21.29773],[73.96879,21.39228],[74.10883,21.44803],[74.30776,21.48014],[74.2917,21.55864],[73.97926,21.54124],[73.86085,21.49576],[73.82294,21.60057],[73.88583,21.64517],[73.89029,21.71073],[73.83231,21.81064],[74.04684,21.92259],[74.14585,21.95425],[74.28991,21.93597],[74.38848,22.02026],[74.52764,21.90876],[74.50578,21.78254],[74.59053,21.66435],[74.83048,21.61038],[74.86438,21.63402],[75.05795,21.56489],[75.11504,21.45963],[75.21985,21.41101],[75.38443,21.38559],[75.46828,21.39406],[75.83267,21.38336],[75.95934,21.39629],[76.05255,21.35259],[76.09849,21.37399],[76.15915,21.25892],[76.16851,21.08587],[76.3826,21.07963],[76.45262,21.11486],[76.48741,21.19604],[76.61676,21.19871],[76.66091,21.28256],[76.62434,21.33519],[76.73227,21.40878],[76.79159,21.48996],[76.79516,21.59745],[76.90131,21.60101],[76.9972,21.68174],[77.1212,21.72545],[77.20728,21.69423],[77.27998,21.76113],[77.47756,21.77005],[77.57122,21.62688],[77.56721,21.52965],[77.45749,21.55641],[77.41869,21.52073],[77.48692,21.37756],[77.93873,21.38693],[78.16932,21.49843],[78.21526,21.55374],[78.3,21.58496],[78.41329,21.57782],[78.43024,21.50155],[78.50874,21.52831],[78.58501,21.48683],[78.932,21.48728],[78.91327,21.59254],[79.1278,21.62822],[79.22102,21.69646],[79.48862,21.67416],[79.50602,21.59031],[79.57604,21.54348],[79.73259,21.60235],[79.85703,21.53099],[80.06665,21.55686],[80.18842,21.63402],[80.26022,21.62019],[80.36905,21.52296],[80.41142,21.43822],[80.51936,21.3896],[80.63532,21.25],[80.45736,21.17284],[80.42391,21.0096],[80.46539,20.92709],[80.54166,20.93378],[80.54344,20.79195],[80.57823,20.67866],[80.50776,20.65458],[80.51177,20.585],[80.62239,20.60373],[80.58581,20.39544],[80.61659,20.32587],[80.38288,20.24157],[80.4141,20.19028],[80.54032,20.11],[80.54567,19.98734],[80.46048,19.82812],[80.66476,19.69075],[80.65673,19.61225],[80.82755,19.56274],[80.88553,19.50922],[80.84271,19.36605],[80.74905,19.28666],[80.67864,19.33089],[80.60751,19.31353],[80.58732,19.39674],[80.48071,19.3355],[80.39329,19.24591],[80.39154,19.1836],[80.3302,19.13746],[80.26929,18.94468],[80.35176,18.84592],[80.24684,18.70149],[80.10826,18.68928],[79.94712,18.78372],[79.95979,18.85795],[79.93945,19.0406],[79.85699,19.09508],[79.94349,19.16387],[79.92836,19.24777],[79.97469,19.38922],[79.92536,19.49855],[79.87599,19.5041],[79.75713,19.60733],[79.63608,19.57639],[79.60249,19.51309],[79.5317,19.55241],[79.42494,19.53529],[79.22736,19.61468],[79.22023,19.5286],[79.1725,19.46081],[79.08018,19.53261],[79.00213,19.54198],[78.89954,19.66954],[78.84245,19.65839],[78.82963,19.75513],[78.60098,19.81809],[78.48728,19.79375],[78.28109,19.90236],[78.3514,19.78327],[78.32909,19.71548],[78.26933,19.69184],[78.29475,19.60621],[78.29564,19.46794],[78.20778,19.43583],[78.16318,19.3551],[78.16675,19.2436],[78.03473,19.2436],[77.92412,19.3444],[77.84428,19.30426],[77.81484,19.13745],[77.74304,19.06118],[77.75106,18.98357],[77.83714,18.95414],[77.90751,18.8295],[77.83749,18.80764],[77.74829,18.60515],[77.65541,18.5316],[77.59709,18.54762],[77.54937,18.3875],[77.55171,18.29114],[77.46332,18.26219],[77.3672,18.30846],[77.41407,18.39352],[77.31257,18.43674],[77.2452,18.41278],[77.19913,18.27795],[77.14119,18.20815],[77.03495,18.18076],[76.95329,18.18881],[76.92422,18.14531],[76.9513,18.05843],[76.9075,18.00923],[76.92164,17.94103],[76.8094,17.8693],[76.66314,17.68771],[76.56488,17.76523],[76.48652,17.71358],[76.48659,17.66155],[76.41561,17.60431],[76.33086,17.46872],[76.37153,17.4341],[76.38171,17.31172],[76.22917,17.36301],[76.11996,17.37007],[75.93159,17.32197],[75.89432,17.40292],[75.77995,17.37683],[75.63468,17.47651],[75.58469,17.34963],[75.65739,17.27069],[75.62834,17.18928],[75.67389,17.11369],[75.66898,16.97766],[75.51065,16.94733],[75.46783,16.98524],[75.28311,16.95524],[75.26705,16.86247],[75.18186,16.84374],[75.09075,16.95064],[74.99259,16.95146],[74.96287,16.87942],[74.90306,16.86241],[74.91203,16.7883],[74.68877,16.71489],[74.6313,16.57831],[74.56843,16.55445],[74.54427,16.63407],[74.33986,16.54825],[74.26427,16.53936],[74.33806,16.40125],[74.31843,16.32588],[74.50509,16.22265],[74.48045,16.14527],[74.37226,16.07692],[74.46484,16.0421],[74.43203,15.95338],[74.34579,15.84959],[74.36893,15.78648],[74.28923,15.73953],[74.16212,15.75075],[74.11652,15.65308],[74.02811,15.60433],[73.97592,15.62887],[73.94515,15.74126],[73.88226,15.74929],[73.68072,15.72057],[73.32871,15.60794],[72.98859,16.57559],[72.71294,17.97077],[72.60935,19.26366],[72.53789,20.1498]]]}},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]]]}},india_tamilnadu:{type:"Feature",id:"india_tamilnadu",properties:{},geometry:{type:"Polygon",coordinates:[[[76.23882,11.52666],[76.42497,11.62329],[76.48321,11.69182],[76.56305,11.62046],[76.8262,11.60485],[76.90977,11.79343],[77.01458,11.81306],[77.11315,11.77337],[77.29576,11.80871],[77.33679,11.76902],[77.42332,11.77259],[77.49513,11.94251],[77.60217,11.93627],[77.67932,11.97287],[77.77447,12.12033],[77.73432,12.17555],[77.60853,12.20409],[77.51993,12.19264],[77.52722,12.27746],[77.61553,12.36799],[77.63575,12.48605],[77.58743,12.51473],[77.60006,12.6661],[77.74108,12.67162],[77.79267,12.74643],[77.81099,12.8303],[77.93327,12.8876],[77.99036,12.80553],[78.08636,12.80344],[78.23196,12.76495],[78.2273,12.71513],[78.36824,12.61165],[78.54754,12.68569],[78.62559,12.9194],[78.61355,12.97872],[78.70231,13.05633],[78.80801,13.07774],[78.97973,13.0764],[79.15278,13.00727],[79.1889,13.08443],[79.25625,13.13661],[79.34679,13.13482],[79.45292,13.33852],[79.53513,13.33423],[79.58006,13.24544],[79.68442,13.25659],[79.92572,13.33598],[79.96184,13.45149],[80.06933,13.53757],[80.15229,13.4787],[80.25978,13.44748],[80.68273,13.45353],[80.58546,12.88895],[80.57389,12.78634],[80.43092,12.33305],[80.32877,12.14],[80.20563,11.84284],[79.85031,11.95606],[79.74742,12.0054],[79.69629,11.95142],[79.76493,11.85315],[80.17499,11.74816],[80.13891,11.5158],[80.22104,11.03359],[80.22222,10.98402],[79.85413,10.97539],[79.73705,10.98906],[79.70405,10.91904],[79.85166,10.82788],[80.22599,10.82479],[80.03964,10.09642],[79.66744,9.97318],[79.55982,9.92323],[79.37812,9.6665],[79.42037,9.35343],[79.56652,9.25796],[79.57134,9.08722],[79.49634,8.89762],[79.37403,8.97879],[79.06914,9.02225],[78.73928,8.93257],[78.54484,8.84743],[78.46298,8.3509],[78.36123,8.16045],[78.10363,8.04096],[77.66766,7.85864],[76.92132,8.09605],[77.09077,8.2973],[77.14974,8.32192],[77.20618,8.47859],[77.27872,8.56521],[77.21552,8.64836],[77.19607,8.74588],[77.25798,8.83758],[77.14986,9.01008],[77.26714,9.15394],[77.28844,9.27469],[77.33693,9.40901],[77.3997,9.49683],[77.3042,9.59951],[77.27684,9.57498],[77.16816,9.61495],[77.24656,9.80841],[77.21305,9.87549],[77.26184,10.03015],[77.28042,10.20721],[77.17683,10.35777],[77.06496,10.29751],[76.98194,10.22077],[76.82944,10.30749],[76.81746,10.43869],[76.82995,10.58498],[76.8973,10.77096],[76.81746,10.86195],[76.64932,10.92395],[76.73718,11.04749],[76.72765,11.19388],[76.44934,11.20462],[76.52349,11.27236],[76.53826,11.35167],[76.39063,11.42794],[76.25772,11.47343],[76.23882,11.52666]]]}},india_telengana:{type:"Feature",id:"india_telengana",properties:{},geometry:{type:"Polygon",coordinates:[[[77.23521,16.47123],[77.29413,16.47453],[77.37516,16.48768],[77.37501,16.50885],[77.41861,16.51735],[77.42586,16.57007],[77.46147,16.58589],[77.45871,16.61229],[77.47627,16.64839],[77.43775,16.64241],[77.42132,16.66752],[77.46657,16.6772],[77.47337,16.71709],[77.42692,16.72829],[77.44309,16.76259],[77.4748,16.78164],[77.45754,16.82843],[77.46322,16.84476],[77.45223,16.91995],[77.48061,16.97751],[77.478,17.00152],[77.50069,17.01255],[77.49527,17.04601],[77.46328,17.11129],[77.40575,17.12751],[77.3772,17.14285],[77.36157,17.16669],[77.37179,17.19944],[77.39294,17.1981],[77.40662,17.2372],[77.45894,17.28058],[77.43826,17.29144],[77.45747,17.34038],[77.45274,17.37335],[77.50349,17.35735],[77.52471,17.36431],[77.53972,17.40645],[77.53911,17.44295],[77.57779,17.43051],[77.60849,17.44332],[77.61732,17.47261],[77.65946,17.48011],[77.69188,17.47463],[77.6912,17.50865],[77.66304,17.5217],[77.59762,17.53374],[77.59603,17.56309],[77.55361,17.55007],[77.52751,17.57308],[77.49462,17.56675],[77.44541,17.58272],[77.45732,17.63263],[77.45138,17.69052],[77.49398,17.7153],[77.53999,17.72825],[77.56532,17.74838],[77.55654,17.76872],[77.50997,17.78724],[77.51604,17.80424],[77.55572,17.81934],[77.5709,17.86625],[77.6208,17.9031],[77.61974,17.93865],[77.65529,17.97047],[77.64737,17.99934],[77.5862,18.01459],[77.55377,18.03572],[77.54914,18.06475],[77.59821,18.0861],[77.59705,18.15205],[77.57179,18.19195],[77.58611,18.21875],[77.57345,18.24294],[77.60614,18.28059],[77.57018,18.29238],[77.56676,18.31792],[77.51948,18.34914],[77.54937,18.3875],[77.56007,18.43522],[77.59709,18.54762],[77.64035,18.55386],[77.65775,18.5271],[77.71216,18.55431],[77.73669,18.55476],[77.74829,18.60515],[77.72956,18.64262],[77.73268,18.67607],[77.74963,18.6899],[77.78664,18.6841],[77.83749,18.80764],[77.90751,18.8295],[77.90895,18.86137],[77.88264,18.86984],[77.86524,18.91043],[77.82421,18.9131],[77.83714,18.95414],[77.79611,18.95146],[77.80057,18.98447],[77.75106,18.98357],[77.74081,19.03041],[77.74304,19.06118],[77.77693,19.07322],[77.78942,19.10534],[77.83179,19.09195],[77.81484,19.13745],[77.84205,19.18294],[77.82822,19.19008],[77.85097,19.25743],[77.88398,19.25832],[77.88442,19.27928],[77.84562,19.28597],[77.84428,19.30426],[77.89602,19.31987],[77.92412,19.3444],[77.96916,19.31095],[78.00172,19.29846],[78.02938,19.27304],[78.03473,19.2436],[78.1101,19.24851],[78.1333,19.232],[78.16675,19.2436],[78.16675,19.28106],[78.18057,19.33369],[78.16318,19.3551],[78.17121,19.39747],[78.20778,19.43583],[78.23543,19.43182],[78.25684,19.4559],[78.29564,19.46794],[78.2787,19.5393],[78.29475,19.57365],[78.29475,19.60621],[78.27111,19.65661],[78.26933,19.69184],[78.29966,19.69273],[78.32909,19.71548],[78.3514,19.78327],[78.3224,19.84125],[78.2778,19.85151],[78.27921,19.88196],[78.3679,19.8814],[78.38128,19.83858],[78.41205,19.8252],[78.45978,19.81851],[78.47762,19.79531],[78.50973,19.82386],[78.5686,19.8136],[78.58734,19.8194],[78.67966,19.79175],[78.70018,19.769],[78.72203,19.78149],[78.76842,19.7806],[78.79116,19.76008],[78.82774,19.76097],[78.84691,19.69898],[78.84245,19.65839],[78.87457,19.65705],[78.89954,19.66954],[78.9379,19.66553],[78.95262,19.65125],[78.94637,19.61914],[78.97626,19.56384],[79.00213,19.54198],[79.03513,19.54733],[79.08018,19.53261],[79.08821,19.51477],[79.12389,19.50318],[79.1725,19.46081],[79.2064,19.46973],[79.19034,19.49381],[79.22023,19.5286],[79.23361,19.57945],[79.22736,19.61468],[79.35492,19.56339],[79.39729,19.53529],[79.42494,19.53529],[79.45394,19.49961],[79.4972,19.52013],[79.5317,19.55241],[79.55367,19.52413],[79.60249,19.51309],[79.61596,19.55941],[79.63608,19.57639],[79.71198,19.58528],[79.75713,19.60733],[79.81825,19.57293],[79.82378,19.55743],[79.87599,19.5041],[79.92536,19.49855],[79.97171,19.42013],[79.97469,19.38922],[79.94937,19.29163],[79.9293,19.24996],[79.92636,19.20252],[79.94349,19.16387],[79.88262,19.13295],[79.85699,19.09508],[79.8741,19.04152],[79.92544,19.05312],[79.93945,19.0406],[79.9397,18.98616],[79.95302,18.96934],[79.95979,18.85795],[79.91056,18.82565],[79.94712,18.78372],[79.99276,18.76905],[80.03276,18.74654],[80.10826,18.68928],[80.24684,18.70149],[80.27513,18.72272],[80.30656,18.68345],[80.33809,18.59903],[80.379,18.60937],[80.38851,18.5972],[80.45022,18.62656],[80.48858,18.62656],[80.514,18.61318],[80.53184,18.58598],[80.59562,18.54896],[80.63264,18.51863],[80.65093,18.47224],[80.6991,18.43612],[80.74281,18.32194],[80.74459,18.30231],[80.7883,18.24968],[80.73344,18.21891],[80.73478,18.17163],[80.79811,18.16628],[80.81774,18.18724],[80.81729,18.22515],[80.85922,18.22605],[80.84807,18.1975],[80.86189,18.13283],[80.9007,18.13461],[80.95422,18.16717],[80.9725,18.14353],[80.94931,18.12302],[80.94396,18.08109],[80.96225,18.03158],[80.98455,17.92276],[80.99436,17.91428],[81.00417,17.83846],[81.03227,17.78985],[81.07375,17.78628],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.56882,17.82776],[81.61119,17.81527],[81.64286,17.83935],[81.66293,17.87682],[81.68835,17.88485],[81.70307,17.86121],[81.75838,17.89332],[81.79272,17.85273],[81.78246,17.83177],[81.72939,17.81928],[81.68478,17.77067],[81.62323,17.76264],[81.5764,17.72607],[81.57105,17.68771],[81.50281,17.59003],[81.52377,17.57264],[81.50147,17.53919],[81.49345,17.44865],[81.44171,17.38175],[81.41584,17.36168],[81.37168,17.35722],[81.32262,17.38933],[81.28917,17.33759],[81.26732,17.3202],[81.19016,17.32733],[81.17053,17.29656],[81.18035,17.25463],[81.16295,17.23278],[81.11835,17.22475],[81.02603,17.18684],[80.99124,17.1797],[80.93058,17.20513],[80.90516,17.20111],[80.91318,17.14581],[80.87037,17.14625],[80.8552,17.11146],[80.86412,17.09585],[80.85877,17.05081],[80.82309,17.03787],[80.72586,17.06463],[80.68393,17.06865],[80.65673,17.08782],[80.56039,17.13822],[80.51936,17.10834],[80.49616,17.10789],[80.48234,17.05036],[80.42034,17.02494],[80.39001,17.07623],[80.36682,17.0566],[80.38778,17.0071],[80.35835,16.97052],[80.44264,16.9451],[80.48769,16.91745],[80.49126,16.94822],[80.53184,16.95001],[80.59027,16.91165],[80.5867,16.87374],[80.56485,16.86883],[80.55593,16.81843],[80.6041,16.78766],[80.56262,16.76268],[80.51088,16.76982],[80.45647,16.78989],[80.45245,16.81531],[80.41856,16.84252],[80.37306,16.8113],[80.35879,16.85501],[80.3191,16.87106],[80.31553,16.91254],[80.28877,16.97677],[80.26201,17.01066],[80.23569,17.00219],[80.19555,17.01825],[80.18217,17.04501],[80.134,16.98524],[80.08405,16.96339],[80.04569,16.96517],[80.03722,16.93663],[80.00957,16.90719],[79.99173,16.86303],[80.0332,16.85233],[80.04168,16.82602],[80.07093,16.81323],[80.054,16.74194],[80.02722,16.71251],[80.00576,16.70857],[79.95306,16.63621],[79.90723,16.63408],[79.88555,16.68642],[79.84286,16.70561],[79.81796,16.69098],[79.79256,16.72485],[79.74673,16.72106],[79.72286,16.68966],[79.68544,16.69755],[79.6621,16.68835],[79.63566,16.6594],[79.60613,16.67239],[79.53884,16.63046],[79.49421,16.63408],[79.44409,16.61796],[79.41773,16.57986],[79.37802,16.58412],[79.31162,16.57554],[79.27926,16.5816],[79.24543,16.57009],[79.24388,16.53515],[79.22091,16.51631],[79.21526,16.4846],[79.23202,16.46035],[79.21112,16.44396],[79.21143,16.35493],[79.23438,16.32518],[79.22111,16.23251],[79.1593,16.20893],[79.12305,16.23187],[79.09802,16.2236],[79.05373,16.23827],[79.01236,16.24173],[78.98352,16.21074],[78.92807,16.19871],[78.9049,16.17711],[78.92481,16.13259],[78.92138,16.10307],[78.88876,16.0879],[78.87606,16.13902],[78.83228,16.13919],[78.8419,16.08707],[78.82164,16.05227],[78.78267,16.02125],[78.73718,16.0097],[78.68277,16.03346],[78.64311,16.08312],[78.59917,16.08361],[78.55814,16.04517],[78.45394,16.07503],[78.40727,16.0756],[78.36075,16.04605],[78.32341,16.033],[78.29785,16.01169],[78.2682,16.02857],[78.25445,16.01627],[78.2507,15.96993],[78.20995,15.9197],[78.17371,15.89569],[78.17153,15.85511],[78.13252,15.8549],[78.10755,15.83401],[78.06997,15.85048],[78.03641,15.90188],[78.00803,15.86506],[77.97903,15.87982],[77.93428,15.88216],[77.89376,15.90154],[77.8616,15.88138],[77.80554,15.87083],[77.72205,15.89199],[77.689,15.87914],[77.6536,15.88393],[77.61152,15.91691],[77.58504,15.91532],[77.51178,15.92828],[77.52058,15.95112],[77.51562,16.00803],[77.49612,16.03679],[77.50848,16.07885],[77.49242,16.12134],[77.48889,16.16443],[77.50036,16.1925],[77.49303,16.25534],[77.59655,16.31743],[77.58991,16.33381],[77.54011,16.35849],[77.52418,16.3753],[77.4865,16.38299],[77.41673,16.36775],[77.37791,16.38517],[77.35761,16.3815],[77.28927,16.408],[77.26056,16.45344],[77.23521,16.47123]]]}},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]]]}},iran:{type:"Feature",properties:{},id:"iran",geometry:{type:"Polygon",coordinates:[[[43.96643,39.42704],[44.36828,39.45104],[44.3518,39.57183],[44.62479,39.89048],[45.02746,39.54218],[45.50433,39.06259],[45.9613,38.92951],[46.50828,38.94537],[47.3236,39.44892],[48.00512,39.77374],[48.4411,39.3641],[48.19977,39.25565],[48.3728,39.10236],[48.30414,38.906],[48.10427,38.85269],[48.67649,38.48336],[49.32106,38.48734],[53.94287,37.48358],[54.43724,37.47487],[54.70691,37.69815],[55.26122,38.10864],[55.91695,38.16284],[56.239,38.26407],[57.28683,38.36073],[57.57896,37.98007],[58.01879,37.91821],[58.41395,37.7018],[58.72191,37.76204],[59.4218,37.59896],[59.63834,37.17964],[60.08422,37.11653],[60.37835,36.70792],[61.23424,36.72619],[61.37598,35.51361],[60.99608,34.29808],[60.63333,34.05914],[60.68847,33.68779],[61.01753,33.53868],[60.68833,33.11604],[60.98034,32.20735],[60.95577,31.5572],[61.7915,31.4486],[61.89696,31.1188],[61.90736,30.81546],[60.99448,29.85451],[61.42455,29.4109],[61.97206,28.63509],[62.8889,28.33884],[62.90715,27.31879],[63.29659,27.35528],[63.40209,27.17648],[63.2895,26.57212],[62.5891,26.47058],[62.29032,26.24108],[61.94822,26.12877],[61.62376,24.73837],[60.55845,24.98624],[58.03141,25.27164],[57.11051,25.5495],[56.54686,26.57238],[55.4988,26.01213],[55.28816,25.6474],[54.37853,25.61961],[53.90126,26.2239],[53.08217,26.52934],[51.26311,27.61327],[50.77328,28.14996],[50.48217,27.81479],[50.17456,27.78564],[49.93835,27.81965],[49.88342,27.975],[49.92187,28.18825],[50.33305,28.67232],[49.4197,29.70202],[48.58632,29.62242],[47.9928,30.44356],[47.98907,30.97004],[47.65869,30.98703],[47.65817,31.39276],[47.76361,31.76875],[47.30962,32.37144],[45.91075,33.02471],[46.06882,33.24741],[45.37024,33.9384],[45.40649,34.48845],[45.61523,34.74162],[45.84765,35.07793],[46.0613,35.21211],[45.91186,35.63945],[46.06018,35.76881],[45.75644,35.74371],[45.3092,35.9317],[45.19226,36.33283],[44.97802,36.46548],[44.95056,36.68605],[44.80224,36.7609],[44.83543,36.92589],[44.74731,37.02887],[44.71435,37.2828],[44.57153,37.38762],[44.51099,37.70537],[44.17537,37.86225],[44.29736,38.30899],[44.10461,39.10449],[43.93976,39.34825],[43.96643,39.42704]]]}},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]]]}},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]]]}},north_korea:{type:"Feature",id:"north_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,37.2],[123.5,38.4],[124.38,40.12],[124.87,40.47],[126.05,40.95],[126.6,41.6],[126.9,41.8],[127.25,41.5],[128.2,41.4],[128.3,41.56],[128.04,42.03],[128.95,42.03],[129.35,42.44],[129.69,42.44],[129.88,43],[130.2,42.9],[130.3,42.66],[130.5,42.6],[130.7,42.3],[131,39],[128.33,38.61],[128.28,38.42],[128.08,38.32],[127.14,38.32],[126.99,38.21],[126.95,38.14],[126.88,38.1],[126.82,38],[126.67,37.95],[126.69,37.84],[126.667,37.828],[126.66,37.79],[126.585,37.76],[126.474,37.81],[126.42,37.845],[126.2,37.82],[126.18,37.74],[125,37.2]]]}},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]]]]}},south_korea:{type:"Feature",id:"south_korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[125,37.2],[126.18,37.74],[126.2,37.82],[126.42,37.845],[126.474,37.81],[126.585,37.76],[126.66,37.79],[126.667,37.828],[126.69,37.84],[126.67,37.95],[126.82,38],[126.88,38.1],[126.95,38.14],[126.99,38.21],[127.14,38.32],[128.08,38.32],[128.28,38.42],[128.33,38.61],[131,39],[131.3,36.6],[127.3,33],[125,33]]]}},sri_lanka:{type:"Feature",id:"sri_lanka",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:"Polygon",coordinates:[[[18.55316,42.39709],[18.487,42.33],[16,42.2],[13,45],[13.48,45.55],[13.6,45.46],[13.67282,45.45244],[13.78445,45.47445],[13.87695,45.43477],[13.98354,45.46061],[13.95607,45.5049],[13.99868,45.52812],[14.07402,45.49231],[14.19361,45.48114],[14.23361,45.51383],[14.33098,45.47073],[14.4841,45.54339],[14.55276,45.65149],[15.16462,45.43061],[15.36301,45.48661],[15.28061,45.60731],[15.34584,45.65341],[15.24587,45.72718],[15.55939,45.85272],[15.68573,45.84315],[15.71043,46.04506],[15.61913,46.08657],[15.60059,46.16509],[15.67131,46.23068],[15.78049,46.21928],[15.79422,46.26439],[16.073,46.34266],[16.04759,46.3891],[16.15145,46.40378],[16.30028,46.38152],[16.24191,46.49508],[16.36894,46.55083],[16.66077,46.45725],[16.72462,46.39715],[16.86058,46.35783],[16.97456,46.22688],[17.17232,46.1551],[17.31102,45.97167],[17.58087,45.93874],[17.66574,45.84483],[17.86118,45.77993],[18.15765,45.79625],[18.43522,45.74655],[18.68019,45.91486],[18.77838,45.88666],[18.82507,45.91724],[18.9164,45.70714],[18.96652,45.66972],[18.89717,45.56551],[18.94817,45.54136],[19.01686,45.56369],[19.10858,45.5144],[19.08125,45.47585],[19.00341,45.48553],[18.99315,45.44969],[19.03735,45.40735],[18.9792,45.37883],[19.09424,45.3367],[19.10972,45.30469],[19.2687,45.24886],[19.42108,45.23622],[19.45198,45.16219],[19.2041,45.17236],[19.14345,45.119],[19.09331,45.13091],[19.08464,45.11852],[19.11231,45.08359],[19.1011,44.98811],[19.16343,44.94855],[19.06865,44.88961],[18.99843,44.89696],[19.01991,44.84386],[18.83764,44.84591],[18.75065,44.90197],[18.73803,44.94119],[18.75375,44.95245],[18.78491,44.94261],[18.77858,44.98426],[18.72157,44.98326],[18.66267,45.04785],[18.46602,45.05359],[18.41889,45.09637],[18.22841,45.09274],[18.2011,45.0684],[18.11746,45.06832],[18.0011,45.14282],[17.93745,45.09903],[17.93891,45.07086],[17.84756,45.03242],[17.66404,45.12204],[17.59713,45.09425],[17.16882,45.13674],[16.92275,45.23503],[16.81812,45.17296],[16.5105,45.20898],[16.46738,45.13326],[16.40374,45.10639],[16.36047,44.99622],[16.29175,44.9865],[16.11145,45.08758],[15.99747,45.21978],[15.81894,45.2072],[15.77283,45.16143],[15.80439,45.1121],[15.75505,45.05587],[15.78598,44.96966],[15.7338,44.9371],[15.78598,44.84029],[15.74818,44.81311],[15.82858,44.72686],[15.90458,44.75089],[16.14789,44.48088],[16.15253,44.38405],[16.39709,44.06983],[17.1476,43.49677],[17.22656,43.49776],[17.282,43.47769],[17.30151,43.4393],[17.26227,43.39108],[17.37488,43.2502],[17.44734,43.1998],[17.43805,43.18365],[17.63424,43.09863],[17.71339,42.97351],[17.53967,42.93531],[17.64267,42.88351],[17.67975,42.92174],[17.7903,42.89961],[17.80815,42.92073],[17.85896,42.89458],[17.90239,42.81647],[18.24898,42.61375],[18.3609,42.61526],[18.44437,42.56076],[18.43575,42.48273],[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]]]}},kosovo:{type:"Feature",id:"kosovo",properties:{},geometry:{type:"Polygon",coordinates:[[[20.68323,41.85101],[20.64878,41.8621],[20.62895,41.87788],[20.59321,41.87344],[20.5834,41.88906],[20.57131,41.92032],[20.61548,41.94279],[20.61932,41.97284],[20.60727,41.98358],[20.58959,42.03994],[20.56682,42.05515],[20.55,42.08081],[20.5618,42.12415],[20.51171,42.21912],[20.4557,42.26696],[20.40232,42.28017],[20.39286,42.29328],[20.35016,42.30573],[20.34327,42.32034],[20.32919,42.32272],[20.30564,42.30975],[20.28975,42.31841],[20.25651,42.31381],[20.23897,42.32339],[20.24172,42.33451],[20.23137,42.34709],[20.24041,42.36756],[20.20299,42.40034],[20.2216,42.42031],[20.18897,42.44976],[20.18995,42.46123],[20.16241,42.50248],[20.09905,42.52756],[20.07781,42.55062],[20.05218,42.55643],[20.0611,42.56636],[20.07983,42.63561],[20.09833,42.65387],[20.02597,42.70293],[20.01357,42.73718],[20.0294,42.76543],[20.05828,42.77918],[20.17177,42.77208],[20.25749,42.77015],[20.26633,42.81006],[20.26709,42.81838],[20.40458,42.85177],[20.48421,42.87209],[20.52629,42.8857],[20.48117,42.92979],[20.48712,42.94371],[20.52036,42.97599],[20.538,42.97944],[20.54736,42.96696],[20.56759,43.00047],[20.59714,43.01791],[20.61815,43.00738],[20.63582,43.01263],[20.65529,43.03791],[20.66666,43.05941],[20.65555,43.06668],[20.65535,43.07614],[20.69024,43.09046],[20.68474,43.11734],[20.6571,43.13426],[20.60822,43.17079],[20.59313,43.19966],[20.59288,43.20807],[20.60326,43.21586],[20.61577,43.20947],[20.6759,43.21404],[20.71781,43.23861],[20.72976,43.25396],[20.78861,43.2509],[20.79902,43.26973],[20.82402,43.27416],[20.88056,43.23237],[20.89633,43.2064],[20.89185,43.19741],[20.86038,43.18418],[20.88322,43.17221],[20.968,43.12786],[20.97317,43.13725],[21.00171,43.14304],[21.02916,43.13467],[21.05505,43.11374],[21.0768,43.12108],[21.0795,43.1332],[21.09221,43.14057],[21.11813,43.11808],[21.14314,43.11815],[21.15722,43.09497],[21.14943,43.08237],[21.15915,43.04152],[21.17346,43.02927],[21.17228,43.01229],[21.18865,43.01181],[21.19528,43.02655],[21.20838,43.03051],[21.24098,43.01253],[21.25156,42.98139],[21.24127,42.95446],[21.27793,42.90132],[21.30679,42.91192],[21.33168,42.90934],[21.34717,42.90549],[21.36699,42.87815],[21.44,42.87777],[21.44185,42.85103],[21.43,42.84464],[21.42818,42.80712],[21.41748,42.77388],[21.39541,42.75691],[21.39835,42.75158],[21.45096,42.75723],[21.46671,42.74511],[21.48212,42.7524],[21.53015,42.73143],[21.56111,42.74322],[21.59623,42.731],[21.59439,42.7097],[21.67045,42.68104],[21.68037,42.6972],[21.73393,42.71782],[21.7767,42.72243],[21.77888,42.69807],[21.80449,42.65599],[21.77972,42.64209],[21.77173,42.62838],[21.77008,42.60166],[21.75125,42.58434],[21.75095,42.55505],[21.72961,42.54235],[21.70728,42.54294],[21.70222,42.53272],[21.71414,42.51308],[21.69423,42.49888],[21.67446,42.49033],[21.67458,42.48071],[21.62857,42.45056],[21.65142,42.40951],[21.62852,42.37199],[21.57112,42.35813],[21.5391,42.36425],[21.53133,42.33801],[21.56671,42.3189],[21.59596,42.27006],[21.58272,42.25167],[21.52186,42.23975],[21.50594,42.2651],[21.44573,42.27489],[21.43843,42.25552],[21.44638,42.23142],[21.43208,42.22775],[21.39412,42.24212],[21.3493,42.20076],[21.33667,42.1989],[21.33915,42.18753],[21.30895,42.13871],[21.32219,42.10706],[21.30296,42.10363],[21.29279,42.10824],[21.25722,42.08817],[21.23557,42.08617],[21.21595,42.09461],[21.20791,42.12657],[21.16719,42.1714],[21.16274,42.19266],[21.11303,42.20093],[21.05269,42.16308],[21.02143,42.14681],[20.92263,42.12229],[20.89259,42.09216],[20.83556,42.08285],[20.79199,42.07669],[20.76879,42.04106],[20.77208,41.95756],[20.77892,41.91873],[20.74544,41.8779],[20.68323,41.85101]]]}},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]]]}},hrva:{type:"Feature",id:"hrva",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.85486,36.53392],[-76.85486,37.35488],[-75.8194,37.35488],[-75.8194,36.53392],[-76.85486,36.53392]]]}},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]]]}}};
25806
25807   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-forum":{id:"osm-india-forum",featureId:"india_full",type:"forum",countryCodes:["in"],name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=65",contacts:[{name:"OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-github":{id:"osm-india-github",featureId:"india_full",type:"github",name:"OpenStreetMap India GitHub",description:"Code with us: {url}",url:"https://github.com/osm-in",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"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-telegram":{id:"osm-india-telegram",featureId:"india_full",type:"telegram",name:"OpenStreetMap India Telegram",description:"Join our family: {url}",url:"https://t.me/OSMIndia",contacts:[{name:"Naveen Francis",email:"naveenpf@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-website":{id:"osm-india-website",featureId:"india_full",type:"osm",name:"OpenStreetMap India",countryCodes:["in"],description:"Mappers and OpenStreetMap users in India",url:"https://openstreetmap.in/",contacts:[{name:" OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-wiki":{id:"osm-india-wiki",featureId:"india_full",type:"wiki",name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}",url:"https://wiki.openstreetmap.org/wiki/WikiProject_India",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"osm-india-youtube":{id:"osm-india-youtube",featureId:"india_full",type:"youtube",name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}",url:"https://www.youtube.com/channel/UCu5sKaPU04x0RJkgGkoFORw",contacts:[{name:"Naveen Francis",email:"naveenpf@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-Puducherry-Mailing-List":{id:"OSM-Puducherry-Mailing-List",featureId:"india_puducherry",type:"mailinglist",name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap.",url:"https://www.freelists.org/archive/puduvailug/",signupUrl:"https://www.freelists.org/list/puduvailug",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-iran-aparat":{id:"osm-iran-aparat",featureId:"iran",type:"aparat",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Aparat",description:"Subscribe to our channel at {url}",extendedDescription:"A good resource of videos about anything related to OpenStreetMap. Mainly in Persian.",url:"https://www.aparat.com/osm_iran",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-forum":{id:"osm-iran-forum",featureId:"iran",type:"forum",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran web forum",description:"OpenStreetMap Iran web forum",extendedDescription:"A web forum for OpenStreetMap users in Iran. Feel free to ask questions and discuss with others!",url:"https://forum.openstreetmap.org/viewforum.php?id=103",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"osm-iran-telegram":{id:"osm-iran-telegram",featureId:"iran",type:"telegram",countryCodes:["ir"],languageCodes:["fa"],name:"OpenStreetMap Iran Telegram",description:"You're welcome to join our Telegram channel at {url}. We also have a supergroup of many OSMers interested in Iran. Find its link in bio of channel.",url:"https://t.me/openstreetmapir",contacts:[{name:"Iman",email:"iriman@chmail.ir"}]},"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-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-Asia-mailinglist":{id:"OSM-Asia-mailinglist",featureId:"asia_full",type:"mailinglist",name:"OpenStreetMap Asia Mailinglist",description:"Talk-asia is the official Mailinglist for Asian Community",url:"https://lists.openstreetmap.org/listinfo/talk-asia",contacts:[{name:"Erwin Olario",email:"govvin@gmail.com"}]},"osm-asia-telegram":{id:"osm-asia-telegram",featureId:"asia_full",type:"telegram",name:"OpenStreetMap Asia Telegram",description:"Join our family: {url}",url:"https://t.me/OpenStreetMapAsia",contacts:[{name:"Erwin Olario",email:"govvin@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-south-korea-telegram":{id:"OSM-south-korea-telegram",featureId:"south_korea",type:"telegram",countryCodes:["kr"],languageCodes:["ko","en"],name:"OSM South Korea Telegram",description:"Unofficial Channnel for OpenStreetMap contributors, communities, and users in South 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-sri-lanka-facebook":{id:"OSM-sri-lanka-facebook",featureId:"sri_lanka",type:"facebook",countryCodes:["lk"],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-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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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"}]},"kosovo-telegram":{id:"kosovo-telegram",type:"telegram",featureId:"kosovo",countryCodes:["xk"],languageCodes:["sq","sr","en"],name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language.",url:"https://t.me/osmkosovo",contacts:[{name:"Guillaume Rischard",email:"guillaumenospam@openstreetmapnospam.lu"}]},"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"},"no-telegram":{id:"no-telegram",type:"telegram",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"@OSM_no on Telegram",description:"OpenStreetMap Norway Telegram chat",url:"https://t.me/OSM_no",contacts:[{name:"Syver Stensholt",email:"sssandum@gmail.com"}]},"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://webchat.oftc.net/?channels=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://webchat.oftc.net/?channels=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"}]},"MaptimeHRVA-twitter":{id:"MaptimeHRVA-twitter",featureId:"hrva",type:"twitter",name:"MaptimeHRVA Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/maptimehrva",contacts:[{name:"Jonah Adkins",email:"jonahadkins@gmail.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://webchat.oftc.net/?channels=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",featureId:"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-Discord":{id:"OSM-Discord",type:"discord",languageCodes:["en"],name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord",url:"https://discord.gg/SRZUYUz",contacts:[{name:"Austin Harrison",email:"jaustinharrison@gmail.com"}]},"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-IRC":{id:"OSM-IRC",type:"irc",languageCodes:["en"],name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"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/"}]}};
25808
25809   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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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/v2/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:[1,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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"City_of_Melbourne_May_2018",name:"City of Melbourne",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmapau.gdbhzo3g/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcGF1IiwiYSI6ImNqbWl3bXZ6aDA0MTkzd21xdnV1d2k0azEifQ.HYkMOqH_E2fYd1b0oXRe6w",endDate:"2018-05-01T00:00:00.000Z",startDate:"2018-05-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[144.9146,-37.79929],[144.9139,-37.79888],[144.91276,-37.79858],[144.91138,-37.79876],[144.90975,-37.79976],[144.90604,-37.80641],[144.90428,-37.81261],[144.9042,-37.81421],[144.90561,-37.82089],[144.90426,-37.82245],[144.89902,-37.82728],[144.89686,-37.83007],[144.89598,-37.83355],[144.89602,-37.83873],[144.89703,-37.84192],[144.90113,-37.84692],[144.9052,-37.85019],[144.90684,-37.85056],[144.90802,-37.8502],[144.9084,-37.84948],[144.90701,-37.84771],[144.90763,-37.84693],[144.90448,-37.84165],[144.90529,-37.84139],[144.90806,-37.8458],[144.91181,-37.8502],[144.91274,-37.85039],[144.91548,-37.84892],[144.91553,-37.84814],[144.91396,-37.84594],[144.91619,-37.84451],[144.91396,-37.84131],[144.91634,-37.83985],[144.91651,-37.83841],[144.91508,-37.83441],[144.91829,-37.83307],[144.91947,-37.83258],[144.92102,-37.83087],[144.92186,-37.83002],[144.92297,-37.8295],[144.92937,-37.82816],[144.93529,-37.82702],[144.94112,-37.82692],[144.94181,-37.82679],[144.94585,-37.8275],[144.94707,-37.82794],[144.94784,-37.82779],[144.95786,-37.82953],[144.95921,-37.82941],[144.9613,-37.82902],[144.96254,-37.82972],[144.96477,-37.83184],[144.96565,-37.83229],[144.96621,-37.83231],[144.97033,-37.83121],[144.97052,-37.83228],[144.97106,-37.83307],[144.97346,-37.83507],[144.97428,-37.83595],[144.97943,-37.85002],[144.97968,-37.85081],[144.98061,-37.85117],[144.98425,-37.85151],[144.98483,-37.85139],[144.98537,-37.85085],[144.98923,-37.83109],[144.98891,-37.83038],[144.99226,-37.81041],[144.99243,-37.80983],[144.99187,-37.80895],[144.97449,-37.80714],[144.97683,-37.79327],[144.97674,-37.7928],[144.97642,-37.79232],[144.97589,-37.79219],[144.96977,-37.79146],[144.97076,-37.78566],[144.97041,-37.785],[144.9699,-37.78477],[144.96488,-37.7842],[144.96511,-37.78252],[144.96507,-37.78198],[144.96421,-37.78142],[144.96398,-37.78082],[144.96389,-37.77964],[144.96355,-37.7785],[144.96267,-37.77779],[144.96136,-37.77724],[144.93919,-37.77456],[144.93836,-37.77458],[144.93801,-37.77485],[144.93728,-37.77601],[144.93658,-37.77692],[144.93613,-37.77728],[144.93598,-37.77791],[144.93778,-37.78142],[144.93827,-37.78421],[144.93911,-37.78654],[144.93885,-37.78672],[144.93881,-37.7873],[144.93773,-37.78801],[144.93216,-37.7874],[144.93123,-37.78783],[144.93076,-37.78786],[144.93003,-37.78735],[144.92181,-37.78642],[144.91488,-37.77938],[144.91428,-37.77865],[144.9137,-37.77853],[144.91293,-37.77855],[144.90819,-37.78135],[144.90722,-37.78206],[144.90572,-37.7845],[144.90529,-37.78637],[144.90428,-37.78657],[144.90375,-37.78718],[144.90319,-37.78827],[144.90201,-37.78883],[144.90143,-37.78964],[144.90188,-37.79103],[144.90257,-37.79198],[144.90415,-37.79288],[144.90645,-37.79383],[144.90814,-37.79456],[144.91046,-37.79519],[144.9127,-37.79605],[144.91429,-37.79695],[144.91525,-37.79783],[144.91539,-37.79815],[144.91531,-37.79848],[144.91518,-37.79872],[144.9148,-37.79914],[144.9146,-37.79929]]],terms_url:"https://data.melbourne.vic.gov.au/Property-Planning/2018-Aerial-Imagery-True-Ortho-/qa5h-sfgh",terms_text:"City of Melbourne",best:true,icon:"https://www.melbourne.vic.gov.au/_catalogs/masterpage/android-icon.png"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:[6,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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"eufar-balaton",name:"EUFAR Balaton orthophotos",type:"tms",template:"http://e.tile.openstreetmap.hu/balaton/0/{zoom}/{x}/{y}.jpg",endDate:"2010-08-31T00:00:00.000Z",startDate:"2010-08-01T00:00:00.000Z",zoomExtent:[12,19],polygon:[[[18.17918,46.98502],[18.17773,47.01816],[18.08176,47.05643],[18.10281,47.06311],[18.08152,47.09344],[18.06436,47.09049],[18.03537,47.07983],[18.03344,47.08262],[17.9582,47.05567],[17.99436,47.00449],[17.86441,46.95517],[17.80274,47.0103],[17.67184,46.97207],[17.23875,46.77079],[17.22244,46.6796],[17.47175,46.70306],[18.16735,46.94133],[18.17918,46.98502]]],terms_url:"http://www.bli.okologia.mta.hu/",terms_text:"EUFAR Balaton ortofotó 2010",best:true,description:"1940 geo-tagged photography from Balaton Limnological Institute."},{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.din.developpement-durable.gouv.fr/wxs?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.din.developpement-durable.gouv.fr/wxs?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.din.developpement-durable.gouv.fr/wxs?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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"helsingborg-orto",name:"Helsingborg Orthophoto",type:"tms",template:"http://mapproxy.openstreetmap.se/tiles/1.0.0/hborg2016_EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[5,20],polygon:[[[12.74345,55.94997],[12.93777,55.90804],[13.00369,55.96842],[12.79083,56.25022],[12.56698,56.1356],[12.74345,55.94997]]],terms_url:"https://helsingborg.opendatasoft.com/",terms_text:"© Helsingborg municipality",best:true,description:"Orthophotos from the municipality of Helsingborg 2016, public domain",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Helsingborg_vapen.svg/198px-Helsingborg_vapen.svg.png"},{id:"hri-orto",name:"Helsinki region 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://hri.fi/data/en_GB/dataset/paakaupunkiseudun-ortokuva-2017",terms_text:"© Espoon, Helsingin ja Vantaan kaupungit, Kirkkonummen ja Nurmijärven kunnat sekä HSL ja HSY",best:true,description:"Ortophotos from the municipalities of Espoo, Helsinki, Vantaa, Kirkkonummi and Nurmijärvi + HSL and HSY",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/fi/hri_logo.png"},{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:"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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",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_airphoto",name:"Japan GSI airphoto Imagery",type:"tms",template:"http://cyberjapandata.gsi.go.jp/xyz/airphoto/{zoom}/{x}/{y}.png",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI airphoto Imagery. Not fully orthorectified, but a bit newer and/or differently covered than GSI ortho Imagery."},{id:"finds.jp_KBN_2500",name:"Japan GSI KIBAN 2500",type:"tms",template:"http://www.finds.jp/ws/tmc/1.0.0/KBN2500FN-900913-L/{zoom}/{x}/{y}.png",zoomExtent:[15,20],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.finds.jp/siteinfo/c_tou.html.ja",terms_text:"GSI KIBAN 2500",description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older."},{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",description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older."},{id:"gsi.go.jp_seamlessphoto",name:"Japan GSI seamlessphoto Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/seamlessphoto/{zoom}/{x}/{y}.jpg",zoomExtent:[14,18],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan seamless photo",description:"Japan GSI seamlessphoto Imagery. The collection of latest imageries of GSI ortho, airphoto, post disaster and others."},{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",description:"Japan GSI Standard Map. Widely covered."},{id:"kalmar-orto-2014",name:"Kalmar North Orthophoto 2014",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2014/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.28473,56.70827],[16.38856,56.70798],[16.40843,56.7615],[16.46269,56.75672],[16.47753,56.76023],[16.48815,56.77023],[16.48754,56.79231],[16.48254,56.79547],[16.47667,56.8223],[16.4687,56.82614],[16.48584,56.86271],[16.48809,56.87369],[16.45694,56.87786],[16.46288,56.88769],[16.42696,56.88757],[16.39809,56.89604],[16.36791,56.8952],[16.36717,56.85985],[16.36431,56.84636],[16.36001,56.83657],[16.34423,56.82532],[16.32675,56.79284],[16.26114,56.74422],[16.28473,56.70827]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the north coast of the municipality of Kalmar 2014",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2016",name:"Kalmar South Orthophoto 2016",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2016/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.156,56.45834],[16.11389,56.46083],[16.09246,56.46633],[16.0724,56.4662],[16.07126,56.51153],[16.08516,56.56847],[16.14417,56.63933],[16.21168,56.68491],[16.28412,56.71655],[16.25135,56.74358],[16.25045,56.75062],[16.29558,56.7512],[16.33516,56.72511],[16.38922,56.71885],[16.41137,56.67602],[16.4053,56.66294],[16.33101,56.625],[16.28048,56.613],[16.21561,56.51967],[16.156,56.45834]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the south coast of the municipality of Kalmar 2016",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2018",name:"Kalmar Urban Orthophoto 2018",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2018/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&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:[9,22],polygon:[[[16.3416,56.81756],[16.32773,56.7973],[16.36692,56.78706],[16.37105,56.79153],[16.36978,56.80511],[16.35645,56.8133],[16.3416,56.81756]],[[16.39207,56.79339],[16.4608,56.78944],[16.48817,56.79067],[16.4833,56.76986],[16.46612,56.76711],[16.45409,56.76774],[16.43173,56.77309],[16.43178,56.77663],[16.40554,56.77214],[16.39325,56.77349],[16.39207,56.79339]],[[16.29836,56.79102],[16.28796,56.7883],[16.27727,56.78367],[16.27623,56.77952],[16.2862,56.7761],[16.3108,56.77696],[16.3118,56.78086],[16.30364,56.78883],[16.29836,56.79102]],[[16.20686,56.63637],[16.22098,56.62389],[16.2453,56.62467],[16.26751,56.62951],[16.28724,56.63831],[16.37871,56.65462],[16.38806,56.6897],[16.38664,56.72867],[16.31586,56.72879],[16.29956,56.7219],[16.29331,56.70021],[16.26799,56.66889],[16.23945,56.66991],[16.2266,56.6624],[16.21411,56.64972],[16.20686,56.63637]],[[16.15172,56.67843],[16.15712,56.69334],[16.15268,56.70297],[16.13274,56.71254],[16.10987,56.71964],[16.08638,56.7112],[16.07969,56.70056],[16.08149,56.69566],[16.09534,56.69599],[16.12877,56.67766],[16.15172,56.67843]],[[15.97369,56.62759],[16.00164,56.63215],[16.04126,56.62999],[16.05658,56.62489],[16.06201,56.61794],[16.09186,56.60378],[16.10527,56.5926],[16.09581,56.58161],[16.03481,56.60405],[16.0305,56.61252],[16.0088,56.60223],[15.98755,56.59742],[15.98449,56.57141],[15.94887,56.57264],[15.91878,56.55184],[15.90892,56.55393],[15.89921,56.56867],[15.9188,56.57287],[15.94612,56.57491],[15.96371,56.59004],[15.9496,56.59724],[15.94308,56.60903],[15.95726,56.61598],[15.97589,56.62005],[15.97369,56.62759]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for urban areas of the municipality of Kalmar 2018",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{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"},{id:"Aargau-AGIS-2017",name:"Kanton Aargau 25cm (AGIS 2017)",type:"tms",template:"https://mapproxy.osm.ch/tiles/AGIS2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-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 OF2017",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://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-topowebb",name:"Lantmäteriet Topographic Map",type:"tms",template:"https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/9b342b7d9f12d4ddb92277be9869d860/1.0.0/topowebb/default/3857/{zoom}/{y}/{x}.png",zoomExtent:[3,15],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:"Topographic map of Sweden 1:50 000",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.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:"linkoping-orto",name:"Linköping Orthophoto",type:"wms",template:"http://kartan.linkoping.se/wms?servicename=wms_ortofoto&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Kommun_2010_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[15.36884,58.6305],[15.41279,58.65623],[15.46635,58.6339],[15.54291,58.64408],[15.54119,58.60672],[15.58376,58.6414],[15.7592,58.55267],[15.76675,58.52006],[15.91438,58.51755],[16.08089,58.37148],[15.82718,58.30588],[15.84915,58.21449],[15.65861,58.15513],[15.56763,58.19134],[15.55939,58.14661],[15.50171,58.07679],[15.37777,58.05881],[15.28713,58.1031],[15.27203,58.13483],[15.35889,58.16455],[15.32387,58.38012],[15.24971,58.40027],[15.3582,58.47288],[15.36884,58.6305]]],terms_url:"https://www.linkoping.se/open/",terms_text:"© Linköping municipality",best:true,description:"Orthophotos from the municipality of Linköping 2010, open data",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Linköping_vapen.svg/198px-Linköping_vapen.svg.png"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"https://owsproxy.lgl-bw.de/owsproxy/ows/WMS_Maps4BW?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=webatlasde&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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"https://tiles.arcgis.com/tiles/hGdibHYSPO59RG1h/arcgis/rest/services/MassGIS_Level3_Parcels/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[15,20],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]]],overlay:true},{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://kart.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade&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://kart.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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://gis.npd.no/ogc/factmaps/2_0?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=fclFixed,pplAll,fldByStatus&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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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]],[[17.79852,46.81745],[17.79178,46.81585],[17.79601,46.80664],[17.7948,46.80598],[17.79693,46.80056],[17.80109,46.79993],[17.80736,46.80225],[17.79852,46.81745]],[[17.7788,46.81461],[17.78446,46.80714],[17.79083,46.80925],[17.7853,46.81683],[17.7788,46.81461]]],terms_text:"openstreetmap.hu"},{id:"OpenTopoMap",name:"OpenTopoMap",type:"tms",template:"https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png",zoomExtent:[3,17],terms_url:"https://tile.opentopomap.org/about#verwendung",terms_text:"Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png"},{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:"OSIP_1ft",name:"OSIP 1ft Imagery Most Current Available",type:"wms",template:"https://geo.oit.ohio.gov/arcgis/services/OSIP/osip_best_avail_1ft/ImageServer/WMSServer?FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-83.1356,41.75081],[-83.08101,41.7511],[-83.0796,41.62936],[-82.95011,41.54404],[-82.89032,41.54404],[-82.89032,41.69462],[-82.8494,41.7463],[-82.76758,41.73925],[-82.75184,41.63584],[-82.64799,41.62408],[-82.68575,41.50634],[-82.49063,41.40492],[-82.0217,41.53462],[-81.72901,41.52048],[-81.39541,41.7369],[-81.10587,41.84484],[-80.50161,41.99939],[-80.51105,40.62127],[-80.6275,40.59021],[-80.58344,40.49933],[-80.58973,40.2812],[-80.85095,39.625],[-81.19399,39.37974],[-81.38912,39.31159],[-81.45521,39.38704],[-81.515,39.35054],[-81.54333,39.26288],[-81.72586,39.19461],[-81.73216,38.9258],[-81.9021,38.85477],[-81.95875,38.89397],[-81.9084,38.93315],[-82.02799,38.99922],[-82.11611,38.92336],[-82.12555,38.8278],[-82.19794,38.78856],[-82.16647,38.72475],[-82.16017,38.58712],[-82.26718,38.57236],[-82.29865,38.43198],[-82.57875,38.39745],[-82.73925,38.53545],[-82.8494,38.56006],[-82.91235,38.73212],[-83.00676,38.71002],[-83.14524,38.59942],[-83.30575,38.58466],[-83.39387,38.64368],[-83.46625,38.64614],[-83.54178,38.69283],[-83.65193,38.61172],[-83.74635,38.63385],[-83.9635,38.76403],[-84.08624,38.75421],[-84.22157,38.7812],[-84.34117,38.99922],[-84.49223,39.07255],[-84.64015,39.05545],[-84.74086,39.11164],[-84.84471,39.08477],[-84.82898,41.70637],[-83.44737,41.76038],[-83.13438,41.64959],[-83.1356,41.75081]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 1-foot orthoimagery from the Ohio Statewide Imagery Program."},{id:"OSIP_6in",name:"OSIP 6in Imagery Most Current Available",type:"wms",template:"https://geo.oit.ohio.gov/arcgis/rest/services/OSIP/OSIP_6in_best_avail/ImageServer/exportImage?f=image&bbox={bbox}&imageSR=3857&bboxSR=4326&SR={proj}&size={width}%2C{height}",projection:"EPSG:4326",endDate:"2013-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[1,22],polygon:[[[-84.8172,39.566],[-84.47765,39.56679],[-84.00558,39.56441],[-84.01108,39.25379],[-83.99391,39.25273],[-84.05605,38.77041],[-83.95821,38.78567],[-83.86791,38.75274],[-83.83461,38.7123],[-83.79101,38.69623],[-83.76904,38.65093],[-83.66398,38.62331],[-83.63926,38.63725],[-83.62141,38.67801],[-83.52219,38.70025],[-83.46451,38.6705],[-83.37112,38.65602],[-83.32615,38.63189],[-83.31928,38.60265],[-83.29319,38.59353],[-83.26435,38.61499],[-83.241,38.62545],[-83.20599,38.61311],[-83.14796,38.61848],[-83.12222,38.64342],[-83.10505,38.67184],[-83.05527,38.6906],[-83.02299,38.7257],[-82.97733,38.72195],[-82.89459,38.75382],[-82.87365,38.73721],[-82.88189,38.68765],[-82.84927,38.59111],[-82.78748,38.55595],[-82.72533,38.55595],[-82.69238,38.53608],[-82.65495,38.48988],[-82.60998,38.46757],[-82.59899,38.41836],[-82.55333,38.39926],[-82.40364,38.43584],[-82.37514,38.43154],[-82.32468,38.4431],[-82.30614,38.48343],[-82.29927,38.5205],[-82.28416,38.58414],[-82.35901,38.58682],[-82.35249,38.67747],[-82.47059,38.68417],[-82.46475,38.7415],[-82.48466,38.74391],[-82.48158,38.77336],[-82.58045,38.78192],[-82.57393,38.84532],[-82.75795,38.85709],[-82.75074,38.94606],[-82.80739,38.9506],[-83.02265,38.95994],[-83.2053,38.96208],[-83.21011,38.99037],[-83.24032,39.01785],[-83.26778,39.02052],[-83.31242,39.05438],[-83.38486,39.05785],[-83.61111,39.02052],[-83.70586,39.02398],[-83.8686,39.02345],[-83.86414,39.24449],[-83.83598,39.24316],[-83.83804,39.22082],[-83.80646,39.22161],[-83.78277,39.26044],[-83.59051,39.37757],[-83.37044,39.37545],[-83.26435,39.51675],[-83.25096,39.69609],[-83.65093,39.71907],[-83.64578,39.77688],[-83.73642,39.78269],[-83.73951,39.79034],[-83.82568,39.79983],[-83.825,39.82409],[-83.93898,39.83095],[-83.93761,39.84492],[-84.05125,39.85283],[-84.00867,40.31147],[-84.00181,40.31121],[-83.9994,40.47986],[-83.98979,40.48038],[-83.99151,40.53285],[-83.88439,40.53442],[-83.8813,40.52972],[-83.52184,40.50753],[-83.54176,40.33686],[-83.63857,40.33739],[-83.63617,40.30179],[-83.56647,40.30179],[-83.54656,40.27612],[-83.55343,40.22817],[-83.49609,40.22371],[-83.50674,40.10985],[-83.16788,40.10565],[-83.17028,40.24521],[-83.2465,40.24678],[-83.2465,40.5091],[-83.41267,40.5078],[-83.41782,40.68741],[-83.43773,40.68923],[-83.43842,40.70433],[-83.49335,40.70355],[-83.493,40.81901],[-83.51395,40.82005],[-83.51257,40.90339],[-83.47584,40.90313],[-83.47515,40.94697],[-83.45592,40.94749],[-83.45592,40.99001],[-83.41747,40.99052],[-83.41782,41.16754],[-83.87787,41.17064],[-83.88062,41.41132],[-83.85143,41.41235],[-83.74432,41.4646],[-83.70827,41.49341],[-83.7038,41.52143],[-83.67805,41.54405],[-83.6063,41.56922],[-83.57094,41.61236],[-83.41782,41.61673],[-83.42297,41.25329],[-83.23139,41.25045],[-82.84241,41.25303],[-82.83245,40.99493],[-82.42973,40.99078],[-82.4342,41.06279],[-82.33463,41.06408],[-82.33944,41.28632],[-82.83897,41.29225],[-82.84515,41.43217],[-82.9509,41.4332],[-82.95158,41.48286],[-82.87262,41.48826],[-82.84447,41.49469],[-82.83417,41.45945],[-82.79984,41.4682],[-82.81494,41.49649],[-82.7528,41.50086],[-82.7401,41.48441],[-82.70199,41.49521],[-82.70817,41.55098],[-82.78164,41.54816],[-82.83142,41.59465],[-82.86507,41.57847],[-82.85854,41.5551],[-82.88807,41.52631],[-82.93098,41.51835],[-82.98626,41.53505],[-83.04016,41.5682],[-83.06694,41.60235],[-83.10574,41.6175],[-83.14247,41.61955],[-83.20564,41.63828],[-83.33954,41.70957],[-83.35327,41.69189],[-83.4264,41.69548],[-83.41679,41.70291],[-83.41816,41.7375],[-83.88405,41.72341],[-83.87993,41.62032],[-83.88783,41.62006],[-83.88577,41.48955],[-84.34547,41.48852],[-84.34513,41.42548],[-84.23183,41.42522],[-84.23355,41.16366],[-83.97366,41.16444],[-83.97434,41.17995],[-83.90259,41.17865],[-83.90327,41.16418],[-83.88371,41.16444],[-83.88336,40.92337],[-83.99975,40.92233],[-83.99769,40.90754],[-84.11167,40.90651],[-84.11167,40.8629],[-84.34444,40.86186],[-84.33758,40.90521],[-84.39491,40.90547],[-84.39663,40.98871],[-84.33861,40.98897],[-84.33964,41.21043],[-84.45362,41.21146],[-84.45499,41.25458],[-84.80621,41.2551],[-84.80724,40.72488],[-84.45877,40.7254],[-84.46083,40.35649],[-84.43851,40.35073],[-84.43474,40.17494],[-84.44504,40.15841],[-84.43336,40.15841],[-84.42959,39.92185],[-84.81651,39.91974],[-84.8172,39.57685],[-84.82647,39.56997],[-84.8172,39.566]],[[-82.83211,41.73033],[-82.80945,41.72828],[-82.77374,41.7006],[-82.78198,41.66368],[-82.84309,41.61544],[-82.86713,41.68266],[-82.83211,41.73033]],[[-81.09077,40.89742],[-81.09146,40.9913],[-81.00494,40.99026],[-81.007,41.1373],[-80.51537,41.13574],[-80.51468,40.89794],[-81.09077,40.89742]]],terms_url:"https://ogrip.oit.ohio.gov/ProjectsInitiatives/StatewideImagery.aspx",terms_text:"Ohio Statewide Imagery Program",description:"Most recent available 6-inch orthoimagery from the Ohio Statewide Imagery Program."},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"https://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.38,45.5666],[13.63822,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 ©2019 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:"https://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.38,45.5666],[13.63822,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 ©2019 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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"stockholm-orto",name:"Stockholm Orthophoto",type:"wms",template:"http://openmap.stockholm.se/bios/wms/app/baggis/web/WMS_STHLM_ORTOFOTO_2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=p_1002820&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,21],polygon:[[[17.8755,59.2625],[17.94411,59.27307],[18.09551,59.22603],[18.19582,59.22786],[18.20297,59.24886],[18.12538,59.30779],[18.1786,59.32566],[18.09876,59.3721],[18.04264,59.37816],[18.00796,59.34334],[17.93655,59.37641],[17.97483,59.40246],[17.90882,59.4417],[17.8854,59.43792],[17.88918,59.41382],[17.84077,59.38568],[17.81708,59.40054],[17.77725,59.39984],[17.75622,59.3916],[17.79899,59.36204],[17.94993,59.31121],[17.85622,59.28412],[17.8755,59.2625]]],terms_url:"http://dataportalen.stockholm.se/dataportalen/",terms_text:"© Stockholm municipality, CC0",best:true,description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Stockholm_vapen_bra.svg/196px-Stockholm_vapen_bra.svg.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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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:"US-TIGER-Roads-2018",name:"TIGER Roads 2018",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cjo1wbulo3ub82ro1c9onlzmh/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-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:"Toulouse-Orthophotoplan-2017",name:"Toulouse - Orthophotoplan 2017",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2017&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",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",best:true},{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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2018",name:"UrbIS-Ortho 2018",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:Ortho2018&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-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-Imagery",name:"USGS Imagery",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fbasemap.nationalmap.gov%2Farcgis%2Frest%2Fservices%2FUSGSImageryOnly%2FMapServer",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]]],description:"Public domain aerial imagery, mostly NAIP",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:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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 Footprints",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Building_Footprints%2FMapServer&transparent=true&layers=show%3A20",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",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FMostRecentImagery%2FMostRecentImagery_WGS%2FMapServer&transparent=true&layers=show%3A0",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 Property Lines",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Parcels%2FMapServer&transparent=true",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"}];
25810
25811   var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},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","line","area"],tags:{amenity:"*"},searchable:false,name:"Amenity"},attraction:{icon:"maki-star",fields:["name","attraction","operator","opening_hours"],moreFields:["opening_hours","fee","payment_multi","address","website","phone","email","fax"],geometry:["point","vertex","line","area"],tags:{attraction:"*"},searchable:false,name:"Attraction"},boundary:{fields:["boundary"],geometry:["line"],tags:{boundary:"*"},searchable:false,name:"Boundary"},circular:{geometry:["vertex","line"],fields:["name"],tags:{junction:"circular"},name:"Traffic Circle",searchable:false},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2,searchable:false},highway:{fields:["name","highway"],geometry:["point","vertex","line","area"],tags:{highway:"*"},searchable:false,name:"Highway"},landuse:{fields:["name","landuse"],geometry:["area"],tags:{landuse:"*"},matchScore:0.9,searchable:false,name:"Land Use"},leisure:{icon:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","line","area"],tags:{leisure:"*"},searchable:false,name:"Leisure"},man_made:{icon:"temaki-storage_tank",fields:["name","man_made"],moreFields:["material"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},searchable:false,name:"Man Made"},natural:{icon:"maki-natural",fields:["name","natural"],geometry:["point","vertex","line","area"],tags:{natural:"*"},searchable:false,name:"Natural"},place:{fields:["name","place"],geometry:["point","vertex","area"],tags:{place:"*"},searchable:false,name:"Place"},power:{geometry:["point","vertex","line","area"],tags:{power:"*"},fields:["power"],moreFields:["material"],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},seamark:{icon:"maki-harbor",fields:["seamark/type"],geometry:["point","vertex","line","area"],tags:{"seamark:type":"*"},searchable:false,name:"Seamark"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","line","area"],tags:{tourism:"*"},searchable:false,name:"Tourism"},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":{icon:"temaki-storage_tank",fields:["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":{icon:"temaki-chairlift",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":{icon:"fas-plane-departure",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"],moreFields:["wheelchair","smoking"],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/recycling":{icon:"maki-recycling",fields:["recycling_type","recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},name:"Recycling",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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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","website"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["name","brand","lit","opening_hours","wheelchair","covered"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-bank",fields:["name","operator","address","building_area","atm","drive_through"],moreFields:["opening_hours","currency_multi","website","phone","email","fax","wheelchair"],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","address","building_area","outdoor_seating","brewery"],moreFields:["smoking","opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["dive","beer","bier","booze"],tags:{amenity:"bar"},name:"Bar"},"amenity/bbq":{icon:"maki-bbq",fields:["covered","fuel","access_simple"],moreFields:["lit"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],moreFields:["access_simple","inscription","lit"],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","fee"],moreFields:["payment_multi","covered"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_parking"},name:"Bicycle Parking"},"amenity/bicycle_rental":{icon:"maki-bicycle",fields:["capacity","network","operator","fee","payment_multi"],moreFields:["opening_hours","address","website","phone","email","fax","wheelchair","covered"],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"],moreFields:["payment_multi","covered"],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","outdoor_seating","brewery"],moreFields:["{amenity/bar}"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{icon:"temaki-boating",fields:["name","operator","fee","payment_multi"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","operator","payment_multi","currency_multi","address","building_area"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],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","outdoor_seating"],moreFields:["diet_multi","takeaway","delivery","capacity","opening_hours","smoking","payment_multi","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair","bar"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity","address","opening_hours","lit"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","address","opening_hours","payment_multi"],moreFields:["brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","address","payment_multi","supervised"],moreFields:["lit","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"temaki-car_wash",fields:["address","building_area","opening_hours","payment_multi"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",fields:["name","operator","address","building_area","opening_hours","smoking"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["gambling","roulette","craps","poker","blackjack"],tags:{amenity:"casino"},name:"Casino"},"amenity/charging_station":{icon:"fas-charging-station",fields:["name","operator","capacity","fee","payment_multi"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["lit"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/clock/sundial":{icon:"temaki-clock",fields:["name","support","visibility","inscription"],moreFields:[],geometry:["point","vertex"],terms:["gnomon","shadow"],tags:{amenity:"clock",display:"sundial"},reference:{key:"display",value:"sundial"},name:"Sundial"},"amenity/college":{icon:"maki-college",fields:["name","operator","address","website","internet_access"],moreFields:["religion","denomination","internet_access/fee","internet_access/ssid","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["university","undergraduate school"],tags:{amenity:"college"},name:"College Grounds"},"amenity/community_centre":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["event","hall"],tags:{amenity:"community_centre"},name:"Community Center"},"amenity/compressed_air":{icon:"maki-car",fields:["operator","fee","payment_multi","lit"],geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"temaki-courthouse",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],moreFields:["address","website","phone","email","fax","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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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/dive_centre":{icon:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","scuba_diving"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["diving","scuba"],tags:{amenity:"dive_centre"},name:"Dive Center"},"amenity/doctors":{icon:"maki-doctor",fields:["name","operator","healthcare/speciality","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["martial arts","dojang"],tags:{amenity:"dojo"},name:"Dojo / Martial Arts Academy"},"amenity/drinking_water":{icon:"maki-drinking-water",fields:["operator","access_simple","fee","wheelchair"],moreFields:["lit","covered"],geometry:["point"],tags:{amenity:"drinking_water"},terms:["potable water source","water fountain","drinking fountain","bubbler","water tap"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","drive_through"],moreFields:["opening_hours","diet_multi","takeaway","delivery","smoking","capacity","outdoor_seating","internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"fast_food"},terms:["restaurant","takeaway"],name:"Fast Food"},"amenity/fast_food/burger":{icon:"maki-fast-food",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"burger"},reference:{key:"cuisine",value:"burger"},name:"Burger Fast Food"},"amenity/fast_food/chicken":{icon:"fas-drumstick-bite",geometry:["point","area"],terms:["breakfast","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"chicken"},reference:{key:"cuisine",value:"chicken"},name:"Chicken Fast Food"},"amenity/fast_food/fish_and_chips":{icon:"fas-fish",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","french fries"],tags:{amenity:"fast_food",cuisine:"fish_and_chips"},reference:{key:"cuisine",value:"fish_and_chips"},name:"Fish & Chips Fast Food"},"amenity/fast_food/kebab":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"kebab"},reference:{key:"cuisine",value:"kebab"},name:"Kebab Fast Food"},"amenity/fast_food/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"fast_food",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Fast Food"},"amenity/fast_food/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Fast Food"},"amenity/fast_food/sandwich":{icon:"maki-restaurant",geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"sandwich"},reference:{key:"cuisine",value:"sandwich"},name:"Sandwich Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["smoking","outdoor_seating","capacity","internet_access","internet_access/fee","internet_access/ssid","diet_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fast food","restaurant","food"],tags:{amenity:"food_court"},name:"Food Court"},"amenity/fountain":{icon:"temaki-fountain",fields:["name","operator","lit"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi"],moreFields:["opening_hours","payment_multi","building","website","phone","email","fax","wheelchair"],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","address"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{amenity:"grave_yard"},name:"Graveyard"},"amenity/grit_bin":{icon:"fas-box",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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","outdoor_seating"],moreFields:["takeaway","delivery","drive_through","internet_access","internet_access/fee","internet_access/ssid","diet_multi","payment_multi","website","phone","email","fax","wheelchair"],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","internet_access","internet_access/fee","internet_access/ssid"],moreFields:["opening_hours","smoking","outdoor_seating","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours","language_multi"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-library",fields:["name","operator","building_area","address","ref/isil","internet_access"],moreFields:["access_simple","opening_hours","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair","payment_multi"],geometry:["point","area"],terms:["book"],tags:{amenity:"library"},name:"Library"},"amenity/love_hotel":{icon:"maki-heart",fields:["name","operator","address","building_area","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"love_hotel"},name:"Love Hotel"},"amenity/marketplace":{icon:"maki-shop",fields:["name","operator","address","building","opening_hours"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area"],moreFields:["website","phone","email","fax","wheelchair"],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/money_transfer":{icon:"maki-bank",fields:["name","brand","address","building_area","payment_multi","currency_multi"],moreFields:["opening_hours","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["money order","check","bill","currency","finance","wire transfer","cable","person to person","cash to cash","exchange"],tags:{amenity:"money_transfer"},name:"Money Transfer Station"},"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","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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-car",fields:["operator","parking","capacity","access_simple","fee","surface"],moreFields:["name","supervised","park_ride","maxstay","payment_multi","address","website","phone","email","fax","wheelchair","covered"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:["automobile parking","car lot","car parking","rv parking","truck parking","vehicle parking"],name:"Parking Lot"},"amenity/parking/multi-storey":{icon:"maki-car",fields:["{amenity/parking}","building","levels","height"],geometry:["area"],tags:{amenity:"parking",parking:"multi-storey"},addTags:{building:"parking",amenity:"parking",parking:"multi-storey"},removeTags:{building:"parking",amenity:"parking",parking:"multi-storey"},reference:{key:"parking",value:"multi-storey"},terms:["car","indoor parking","multistorey car park","parkade","parking building","parking deck","parking garage","parking ramp","parking structure"],name:"Multilevel Parking Garage"},"amenity/payment_centre":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],moreFields:["currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["check","tax pay","bill pay","currency","finance","cash","money"],tags:{amenity:"payment_centre"},name:"Payment Center"},"amenity/payment_terminal":{icon:"maki-bank",fields:["name","brand","address","opening_hours","payment_multi"],moreFields:["currency_multi","wheelchair"],geometry:["point"],terms:["interactive kiosk","ekiosk","atm","bill pay","tax pay","phone pay","finance","cash","money transfer","card"],tags:{amenity:"payment_terminal"},name:"Payment Terminal"},"amenity/pharmacy":{icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","dispensing"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{amenity:"pharmacy"},addTags:{amenity:"pharmacy",healthcare:"pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy"},reference:{key:"amenity",value:"pharmacy"},terms:["apothecary","drug store","drugstore","med*","prescription"],name:"Pharmacy Counter"},"amenity/photo_booth":{icon:"maki-attraction",fields:["name","operator","payment_multi","wheelchair"],geometry:["point","area"],terms:["photobooth","photo","booth","kiosk","camera"],tags:{amenity:"photo_booth"},name:"Photo Booth"},"amenity/place_of_worship":{icon:"maki-place-of-worship",fields:["name","religion","denomination","address","building_area","service_times"],moreFields:["opening_hours","internet_access","internet_access/ssid","website","phone","email","fax","wheelchair"],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-religious-buddhist",fields:["name","religion","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","religion","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:"Christian Church"},"amenity/place_of_worship/hindu":{icon:"temaki-hinduism",fields:["name","religion","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","religion","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:"Jewish Synagogue"},"amenity/place_of_worship/muslim":{icon:"maki-religious-muslim",fields:["name","religion","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:"Muslim Mosque"},"amenity/place_of_worship/shinto":{icon:"temaki-shinto",fields:["name","religion","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","religion","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","religion","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-globe",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["badge","constable","constabulary","cop","detective","fed","law","enforcement","officer","patrol"],tags:{amenity:"police"},name:"Police"},"amenity/post_box":{icon:"temaki-post_box",fields:["operator","collection_times","drive_through","ref"],moreFields:["wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["letter","mail"],tags:{amenity:"post_office"},name:"Post Office"},"amenity/prison":{icon:"maki-prison",fields:["name","operator","address"],moreFields:["website","phone","email","fax","wheelchair"],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","brewery"],moreFields:["outdoor_seating","diet_multi","payment_multi","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","fee"],moreFields:["opening_hours","payment_multi","website","phone","email","fax","wheelchair"],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","lit"],moreFields:["wheelchair"],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"],moreFields:["website","phone","email","fax","wheelchair"],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"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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_container":{icon:"maki-recycling",fields:["recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{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","outdoor_seating"],moreFields:["takeaway","delivery","capacity","diet_multi","smoking","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair","bar"],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/restaurant/american":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","coffee","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"american"},reference:{key:"cuisine",value:"american"},name:"American Restaurant"},"amenity/restaurant/asian":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"asian"},reference:{key:"cuisine",value:"asian"},name:"Asian Restaurant"},"amenity/restaurant/chinese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"chinese"},reference:{key:"cuisine",value:"chinese"},name:"Chinese Restaurant"},"amenity/restaurant/french":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"french"},reference:{key:"cuisine",value:"french"},name:"French Restaurant"},"amenity/restaurant/german":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"german"},reference:{key:"cuisine",value:"german"},name:"German Restaurant"},"amenity/restaurant/greek":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","gyros","pitas","olives"],tags:{amenity:"restaurant",cuisine:"greek"},reference:{key:"cuisine",value:"greek"},name:"Greek Restaurant"},"amenity/restaurant/indian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","curry"],tags:{amenity:"restaurant",cuisine:"indian"},reference:{key:"cuisine",value:"indian"},name:"Indian Restaurant"},"amenity/restaurant/italian":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","pasta","pizza"],tags:{amenity:"restaurant",cuisine:"italian"},reference:{key:"cuisine",value:"italian"},name:"Italian Restaurant"},"amenity/restaurant/japanese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"japanese"},reference:{key:"cuisine",value:"japanese"},name:"Japanese Restaurant"},"amenity/restaurant/mexican":{icon:"fas-pepper-hot",geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"restaurant",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Restaurant"},"amenity/restaurant/noodle":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","ramen noodles","soup","soba noodles","cellophane noodles","rice noodles"],tags:{amenity:"restaurant",cuisine:"noodle"},reference:{key:"cuisine",value:"noodle"},name:"Noodle Restaurant"},"amenity/restaurant/pizza":{icon:"maki-restaurant-pizza",geometry:["point","area"],terms:["bar","dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"restaurant",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Restaurant"},"amenity/restaurant/seafood":{icon:"maki-restaurant-seafood",geometry:["point","area"],terms:["bar","breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","fish","shellfish","molluscs","crustaceans","clams","oysters","lobsters","crab","shrimp","squid","octopus"],tags:{amenity:"restaurant",cuisine:"seafood"},reference:{key:"cuisine",value:"seafood"},name:"Seafood Restaurant"},"amenity/restaurant/steakhouse":{icon:"maki-slaughterhouse",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","steak house","chop house","beef"],tags:{amenity:"restaurant",cuisine:"steak_house"},reference:{key:"cuisine",value:"steak_house"},name:"Steakhouse"},"amenity/restaurant/sushi":{icon:"fas-fish",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"sushi"},reference:{key:"cuisine",value:"sushi"},name:"Sushi Restaurant"},"amenity/restaurant/thai":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"thai"},reference:{key:"cuisine",value:"thai"},name:"Thai Restaurant"},"amenity/restaurant/turkish":{icon:"maki-restaurant",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"turkish"},reference:{key:"cuisine",value:"turkish"},name:"Turkish Restaurant"},"amenity/restaurant/vietnamese":{icon:"maki-restaurant-noodle",geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"vietnamese"},reference:{key:"cuisine",value:"vietnamese"},name:"Vietnamese Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["operator","access_simple","fee","water_point"],moreFields:["payment_multi"],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","website"],moreFields:["internet_access","internet_access/ssid","phone","email","fax","wheelchair"],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"],moreFields:["lit","wheelchair"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shelter/gazebo":{icon:"maki-shelter",fields:["name","building_area","bench","lit"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"gazebo"},name:"Gazebo"},"amenity/shelter/lean_to":{icon:"maki-shelter",fields:["name","operator","building_area"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"lean_to"},name:"Lean-To"},"amenity/shelter/picnic_shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","lit","bin"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"picnic_shelter"},reference:{key:"shelter_type",value:"picnic_shelter"},terms:["pavilion"],name:"Picnic Shelter"},"amenity/shelter/public_transport":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","lit"],geometry:["point","area"],terms:["bus stop","metro stop","waiting"],tags:{amenity:"shelter",shelter_type:"public_transport"},reference:{key:"shelter_type",value:"public_transport"},name:"Transit Shelter"},"amenity/shower":{icon:"temaki-shower",fields:["opening_hours","fee","supervised","building_area","access_simple","wheelchair"],moreFields:["operator","gender","payment_multi"],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"],moreFields:["lit","wheelchair","covered"],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"],moreFields:["opening_hours","wheelchair","internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax"],geometry:["point","area"],terms:[],tags:{amenity:"social_facility"},name:"Social Facility"},"amenity/social_facility/food_bank":{icon:"temaki-social_facility",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:["{amenity/social_facility}","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",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:["{amenity/social_facility}","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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],moreFields:["address","opening_hours","wheelchair"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","booth"],moreFields:["covered","indoor","lit","wheelchair"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/theatre/type/amphi":{icon:"maki-theatre",fields:["name","operator","address","lit"],geometry:["point","area"],terms:["open air","outdoor","greek","ampi"],tags:{amenity:"theatre","theatre:type":"amphi"},name:"Amphitheatre"},"amenity/toilets":{icon:"maki-toilet",fields:["toilets/disposal","building_area","access_simple","gender","diaper","wheelchair"],moreFields:["fee","opening_hours","operator","payment_multi"],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"],moreFields:["website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["village","city","government","courthouse","municipal"],tags:{amenity:"townhall"},name:"Town Hall"},"amenity/university":{icon:"maki-college",fields:["{amenity/college}"],moreFields:["{amenity/college}"],geometry:["point","area"],terms:["college","graduate school","PhD program","master's degree program"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["car inspection"],tags:{amenity:"vehicle_inspection"},name:"Vehicle Inspection"},"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",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",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",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",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",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",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:["{amenity/vending_machine}"],geometry:["point"],terms:["excrement bags","poop","waste","dog","animal"],tags:{amenity:"vending_machine",vending:"excrement_bags"},reference:{key:"vending",value:"excrement_bags"},name:"Excrement Bag Dispenser"},"amenity/vending_machine/feminine_hygiene":{icon:"temaki-vending_machine",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",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",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",matchScore:0.5},"amenity/vending_machine/ice_cream":{icon:"temaki-vending_machine",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:["mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Locker"},"amenity/vending_machine/parcel_pickup":{icon:"temaki-vending_machine",fields:["vending","operator"],geometry:["point"],terms:["amazon","locker","mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},name:"Parcel Pickup Locker"},"amenity/vending_machine/parking_tickets":{icon:"temaki-vending_machine",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",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",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",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:"temaki-veterinary_care",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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:["operator","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","fee","payment_multi"],moreFields:["website","phone","email","fax","wheelchair"],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",fields:["operator","fee","payment_multi"],geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-drinking-water",fields:["operator","fee","payment_multi"],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",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:["{attraction}","height"],geometry:["point"],terms:["ferris wheel","theme park","amusement ride"],tags:{attraction:"big_wheel"},name:"Big Wheel"},"attraction/bumper_car":{icon:"maki-car",geometry:["point","area"],terms:["theme park","dodgem cars","autoscooter"],tags:{attraction:"bumper_car"},name:"Bumper Car"},"attraction/bungee_jumping":{icon:"maki-pitch",fields:["{attraction}","height"],geometry:["point","area"],terms:["theme park","bungy jumping","jumping platform"],tags:{attraction:"bungee_jumping"},name:"Bungee Jumping"},"attraction/carousel":{icon:"temaki-amusement_park",fields:["{attraction}","building_area"],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:["{attraction}","building_area"],geometry:["point","line","area"],terms:["theme park","ghost train"],tags:{attraction:"dark_ride"},name:"Dark Ride"},"attraction/drop_tower":{icon:"temaki-tower",fields:["{attraction}","height"],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",geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",geometry:["point"],terms:["theme park","carnival ride","amusement ride"],tags:{attraction:"pirate_ship"},name:"Pirate Ship"},"attraction/river_rafting":{icon:"maki-ferry",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",geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-rail",fields:["{attraction}","fee"],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:["{attraction}","height"],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","material"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access","material"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],moreFields:["address","website","phone","email","fax"],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:"temaki-wall",fields:["height","material"],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","material"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"temaki-railing",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},terms:["railing","handrail","guard rail"],name:"Railing",matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"temaki-guard_rail",fields:["material"],geometry:["line"],tags:{barrier:"guard_rail"},name:"Guard Rail",terms:["guardrail","traffic barrier","crash barrier","median barrier","roadside barrier","Armco barrier"],matchScore:0.75},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/kerb":{fields:["kerb","tactile_paving"],moreFields:["material"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Curb"},"barrier/kerb/flush":{icon:"maki-wheelchair",geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"flush"},reference:{key:"kerb",value:"flush"},terms:["even curb","level curb","tactile curb"],name:"Flush Curb"},"barrier/kerb/lowered":{icon:"maki-wheelchair",geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"lowered"},reference:{key:"kerb",value:"lowered"},terms:["curb cut","curb ramp","kerb ramp","dropped kerb","pram ramp"],name:"Lowered Curb"},"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":{icon:"temaki-wall",fields:["height","material"],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","payment_multi","currency_multi"],moreFields:["address","website","phone","email","fax"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"temaki-wall",fields:["wall","height","material"],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"]},"bridge/support":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],moreFields:["material","seamark/type"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building:{icon:"maki-home",fields:["name","building","levels","height","address"],moreFields:["architect","building/material","layer","roof/colour","smoking","wheelchair"],geometry:["point","area"],tags:{building:"*"},matchScore:0.6,terms:[],name:"Building"},"building/bunker":{geometry:["area"],tags:{building:"bunker"},matchScore:0.5,name:"Bunker",searchable:false},"building/entrance":{icon:"maki-entrance-alt1",fields:[],moreFields:[],geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-building",geometry:["point","vertex","area"],tags:{building:"train_station"},matchScore:0.5,name:"Train Station Building",searchable:false},"building/apartments":{icon:"maki-building",geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartment Building"},"building/barn":{icon:"maki-farm",geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/carport":{icon:"fas-warehouse",fields:["height","capacity"],geometry:["area"],tags:{building:"carport"},matchScore:0.5,terms:["covered parking space","garage","car","porch"],name:"Carport"},"building/cathedral":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["{building}","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-home",geometry:["area"],tags:{building:"detached"},terms:["home","single","family","residence","dwelling"],matchScore:0.5,name:"Detached House"},"building/dormitory":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",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-centre",geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/hut":{icon:"maki-home",fields:["name"],geometry:["area"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-building",geometry:["area"],terms:["kindergarden","pre-school"],tags:{building:"kindergarten"},matchScore:0.5,name:"Preschool/Kindergarten Building"},"building/mosque":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["{building}","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",geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-building",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",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",geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["{building}","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-building",geometry:["area"],tags:{building:"terrace"},terms:["home","terrace","brownstone","family","residence","dwelling"],matchScore:0.5,name:"Row Houses"},"building/transportation":{icon:"maki-building",fields:["{building}","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",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:"fas-handshake",fields:["name","club","operator","address","building_area","opening_hours"],moreFields:["access_simple","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},"club/sport":{icon:"maki-pitch",fields:["name","sport","{club}"],geometry:["point","area"],tags:{club:"sport"},terms:["athletics club","sporting club","sports association","sports society"],name:"Sports Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],moreFields:["product","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"jeweler"},reference:{key:"shop",value:"jewelry"},name:"Jeweler",searchable:false},"craft/locksmith":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"locksmith"},reference:{key:"shop",value:"locksmith"},name:"Locksmith",searchable:false},"craft/optician":{icon:"maki-marker-stroked",geometry:["point","area"],tags:{craft:"optician"},reference:{key:"shop",value:"optician"},name:"Optician",searchable:false},"craft/tailor":{icon:"maki-clothing-store",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",geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-storage_tank",fields:["{craft}","product"],geometry:["point","area"],terms:["alcohol","beer","beverage","bier","booze","cider"],tags:{craft:"brewery"},name:"Brewery"},"craft/carpenter":{icon:"temaki-tools",geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","{craft}"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-storage_tank",fields:["{craft}","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",geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-plumber",geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},"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"],moreFields:["website","phone","email","fax","wheelchair"],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:["ref","fire_hydrant/type","colour","water_source","couplings"],moreFields:["fire_hydrant/pressure","fire_hydrant/diameter","water_volume","survey/date"],geometry:["point","vertex"],terms:["fire plug","fire water well","hydrant"],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"},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/cartpath_service":{icon:"maki-golf",fields:["{golf/path}","maxspeed"],geometry:["line"],tags:{highway:"service",golf:"cartpath",golf_cart:"designated"},reference:{key:"golf",value:"cartpath"},name:"Golf Cartpath / Service Road"},"golf/cartpath":{icon:"maki-golf",fields:["{golf/path}"],geometry:["line"],tags:{golf:"cartpath",golf_cart:"designated"},reference:{key:"golf",value:"cartpath"},name:"Golf Cartpath"},"golf/driving_range":{icon:"maki-golf",fields:["name","capacity"],geometry:["area"],tags:{golf:"driving_range",landuse:"grass"},reference:{key:"golf",value:"driving_range"},name:"Driving Range"},"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":{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/path":{icon:"maki-golf",fields:["name","surface","width","structure","incline"],geometry:["line"],tags:{golf:"path",foot:"designated"},reference:{key:"golf",value:"path"},name:"Golf Walking Path"},"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":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"water_hazard",natural:"water"},reference:{key:"golf",value:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-hospital",fields:["name","healthcare","operator","healthcare/speciality","address","building_area"],moreFields:["opening_hours","payment_multi","brand","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{healthcare:"*"},terms:["clinic","doctor","disease","health","institution","sick","surgery","wellness"],name:"Healthcare Facility"},"healthcare/alternative":{icon:"maki-hospital",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",geometry:["point","area"],terms:["back","pain","spine"],tags:{healthcare:"alternative","healthcare:speciality":"chiropractic"},name:"Chiropractor"},"healthcare/audiologist":{icon:"maki-hospital",geometry:["point","area"],terms:["ear","hearing","sound"],tags:{healthcare:"audiologist"},name:"Audiologist"},"healthcare/birthing_center":{icon:"maki-hospital",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:["{healthcare}","blood_components"],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",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",geometry:["point","area"],terms:["baby","childbirth","delivery","labour","labor","pregnancy"],tags:{healthcare:"midwife"},name:"Midwife"},"healthcare/occupational_therapist":{icon:"maki-hospital",geometry:["point","area"],terms:["therapist","therapy"],tags:{healthcare:"occupational_therapist"},name:"Occupational Therapist"},"healthcare/optometrist":{icon:"maki-hospital",geometry:["point","area"],terms:["eye","glasses","lasik","lenses","vision"],tags:{healthcare:"optometrist"},name:"Optometrist"},"healthcare/physiotherapist":{icon:"temaki-physiotherapist",geometry:["point","area"],terms:["physical","therapist","therapy"],tags:{healthcare:"physiotherapist"},name:"Physiotherapist"},"healthcare/podiatrist":{icon:"maki-hospital",geometry:["point","area"],terms:["foot","feet","nails"],tags:{healthcare:"podiatrist"},name:"Podiatrist"},"healthcare/psychotherapist":{icon:"maki-hospital",geometry:["point","area"],terms:["anxiety","counselor","depression","mental health","mind","suicide","therapist","therapy"],tags:{healthcare:"psychotherapist"},name:"Psychotherapist"},"healthcare/rehabilitation":{icon:"maki-hospital",geometry:["point","area"],terms:["rehab","therapist","therapy"],tags:{healthcare:"rehabilitation"},name:"Rehabilitation Facility"},"healthcare/speech_therapist":{icon:"maki-hospital",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","incline","horse_scale"],moreFields:["wheelchair","lit","smoothness","covered","dog"],icon:"maki-horse-riding",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"maki-bus",fields:["name","operator","oneway","structure","covered"],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/construction":{icon:"maki-barrier",fields:["name","opening_date","check_date","note","oneway","structure","access"],geometry:["line"],tags:{highway:"construction",access:"no"},terms:["closed","closure","construction"],name:"Road Closed"},"highway/corridor":{icon:"temaki-pedestrian",fields:["name","width","level","access_simple","wheelchair"],moreFields:["maxheight"],geometry:["line"],tags:{highway:"corridor"},terms:["gallery","hall","hallway","indoor","passage","passageway"],name:"Indoor Corridor"},"highway/crossing/zebra-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","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/crossing/zebra":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/crossing/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/crossing/marked":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/crossing/unmarked-raised":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/crossing/unmarked":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked"},removeTags:{highway:"crossing",crossing:"unmarked"},tags:{highway:"crossing"},reference:{key:"highway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"highway/cycleway":{icon:"maki-bicycle",fields:["name","oneway","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","maxspeed","covered","dog"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref","wheelchair"],moreFields:["maxheight"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"temaki-pedestrian",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","covered","dog"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"footway"},name:"Foot Path"},"highway/footway/zebra-raised":{icon:"temaki-pedestrian",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","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/footway/zebra":{icon:"temaki-pedestrian",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"zebra"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/footway/conveying":{icon:"temaki-pedestrian",fields:["name","conveying","access_simple","lit","width","wheelchair"],geometry:["line"],terms:["moving sidewalk","autwalk","skywalk","travolator","travelator","travellator","conveyor"],tags:{highway:"footway",conveying:"*"},name:"Moving Walkway"},"highway/footway/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/footway/marked":{icon:"temaki-pedestrian",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/footway/sidewalk":{icon:"temaki-pedestrian",geometry:["line"],tags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:["pavement","sidepath"],name:"Sidewalk"},"highway/footway/unmarked-raised":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"footway",footway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/footway/unmarked":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},tags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"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","access"],moreFields:["cycleway","maxheight","covered","junction_line","lit","smoothness","oneway/bicycle"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{highway:"milestone"},terms:["milestone","marker"],name:"Highway Milestone"},"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:["destination_oneway","destination/ref_oneway","junction/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","destination/symbol_oneway","junction_line","lit","maxheight","maxspeed/advisory","name","ref_road_number","smoothness","toll"],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","access"],moreFields:["toll","maxheight","covered","lit","smoothness","minspeed","junction_line"],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-other-line",fields:["name","surface","width","structure","access","incline"],moreFields:["wheelchair","lit","smoothness","trail_visibility","sac_scale","mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered","ref","dog"],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:"temaki-pedestrian",fields:["name","surface","lit","width","oneway","structure","access"],moreFields:["covered","smoothness"],geometry:["line"],tags:{highway:"pedestrian"},terms:["center","centre","plaza","quad","square","walkway"],name:"Pedestrian Street"},"highway/primary_link":{icon:"iD-highway-primary-link",fields:["destination_oneway","destination/ref_oneway","oneway","maxspeed","lanes","surface","structure","access"],moreFields:["covered","cycleway","destination/symbol_oneway","junction/ref_oneway","junction_line","lit","maxheight","maxspeed/advisory","name","oneway/bicycle","ref_road_number","smoothness","toll"],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","ref_road_number","access"],moreFields:["covered","cycleway","junction_line","lit","maxheight","maxspeed/advisory","oneway/bicycle","smoothness","toll"],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","access"],moreFields:["covered","cycleway","junction_line","lit","oneway/bicycle","maxheight","maxspeed/advisory","smoothness"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name","operator","opening_hours"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-other-line",fields:["{highway/residential}"],moreFields:["{highway/residential}"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-highway-secondary-link",fields:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"secondary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","access"],moreFields:["covered","lanes","lit","maxheight","maxspeed/advisory","oneway/bicycle"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-highway-service",geometry:["line"],tags:{highway:"service",service:"alley"},reference:{key:"service",value:"alley"},name:"Alley"},"highway/service/drive-through":{icon:"iD-highway-service",fields:["{highway/service}","covered"],geometry:["line"],tags:{highway:"service",service:"drive-through"},reference:{key:"service",value:"drive-through"},name:"Drive-Through"},"highway/service/driveway":{icon:"iD-highway-service",geometry:["line"],tags:{highway:"service",service:"driveway"},reference:{key:"service",value:"driveway"},name:"Driveway"},"highway/service/emergency_access":{icon:"iD-highway-service",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",geometry:["line"],tags:{highway:"service",service:"parking_aisle"},reference:{key:"service",value:"parking_aisle"},name:"Parking Aisle"},"highway/services":{icon:"maki-car",fields:["{highway/rest_area}"],moreFields:["{highway/rest_area}"],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","maxspeed"],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/steps/conveying":{icon:"maki-entrance",fields:["name","incline_steps","conveying","access_simple","lit","width","handrail","step_count"],geometry:["line"],terms:["moving staircase","moving stairway","people mover"],tags:{highway:"steps",conveying:"*"},name:"Escalator"},"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:["{highway/primary_link}"],moreFields:["{highway/primary_link}"],geometry:["line"],tags:{highway:"tertiary_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["{highway/primary}"],moreFields:["{highway/primary}"],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"],moreFields:["mtb/scale","mtb/scale/uphill","mtb/scale/imba","horse_scale","covered"],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:["{highway/motorway_link}"],moreFields:["{highway/motorway_link}"],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","access"],moreFields:["toll","maxheight","covered","lit","smoothness","minspeed","junction_line"],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:["{highway/residential}"],moreFields:["{highway/residential}"],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","access_simple"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization","access_simple"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-monument",fields:["name","memorial","inscription"],moreFields:["material","website"],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","access_simple"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription","access_simple"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],moreFields:["material"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription","access_simple"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},"historic/wreck":{icon:"temaki-ruins",fields:["name","access_simple","seamark/wreck/category","historic/wreck/date_sunk","historic/wreck/visible_at_low_tide","historic/wreck/visible_at_high_tide"],moreFields:["seamark/type"],geometry:["point","area"],tags:{historic:"wreck"},addTags:{historic:"wreck","seamark:type":"wreck"},removeTags:{historic:"wreck","seamark:type":"wreck"},terms:["hull","mast","maritime","remains","ship","boat"],name:"Shipwreck"},"internet_access/wlan":{icon:"fas-wifi",geometry:["point","area"],fields:["internet_access/fee","internet_access/ssid"],terms:["wi-fi","wifi","hotspot"],tags:{internet_access:"wlan"},matchScore:0.25,name:"Wi-Fi Hotspot"},junction:{icon:"temaki-junction",fields:["name"],geometry:["vertex","area"],tags:{junction:"yes"},name:"Junction"},"landuse/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{landuse:"basin"},name:"Basin",searchable:false},"landuse/farm":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},name:"Farmland",searchable:false},"landuse/pond":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"pond"},name:"Pond",searchable:false},"landuse/reservoir":{icon:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{landuse:"reservoir"},name:"Reservoir",searchable:false},"landuse/allotments":{icon:"maki-garden-centre",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-aquarium",fields:["name","operator","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"aquaculture"},terms:["fish farm","crustacean","algae","aquafarming","shrimp farm","oyster farm","mariculture","algaculture"],name:"Aquaculture"},"landuse/brownfield":{geometry:["area"],fields:["name"],tags:{landuse:"brownfield"},terms:[],matchScore:0.9,name:"Brownfield"},"landuse/cemetery":{icon:"maki-cemetery",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","forestry","lumber","silviculture","tree"],name:"Managed Forest"},"landuse/garages":{icon:"fas-warehouse",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-garden",fields:["name","operator","plant"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"plant_nursery"},terms:["flower","garden","grow","vivero"],name:"Plant Nursery"},"landuse/quarry":{geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],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"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],moreFields:["address","website","phone","email","fax"],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/residential/apartments":{icon:"maki-building",fields:["name","operator","address"],geometry:["point","area"],tags:{residential:"apartments"},addTags:{landuse:"residential",residential:"apartments"},removeTags:{landuse:"residential",residential:"apartments"},reference:{key:"residential",value:"apartments"},terms:["flat","residence","tenement"],name:"Apartment Complex"},"landuse/retail":{icon:"maki-commercial",geometry:["area"],fields:["name"],moreFields:["address","website","phone","email","fax"],tags:{landuse:"retail"},matchScore:0.9,name:"Retail Area"},"landuse/vineyard":{fields:["name","operator","grape_variety"],moreFields:["address","website","phone","email","fax"],geometry:["area"],tags:{landuse:"vineyard"},addTags:{landuse:"vineyard",crop:"grape"},removeTags:{landuse:"vineyard",crop:"grape",grape_variety:"*"},terms:["grape","wine"],name:"Vineyard"},"leisure/adult_gaming_centre":{icon:"temaki-casino",fields:["{amenity/casino}"],moreFields:["{amenity/casino}"],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"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["pay-to-play games","video games","driving simulators","pinball machines"],tags:{leisure:"amusement_arcade"},name:"Amusement Arcade"},"leisure/bandstand":{icon:"maki-music",fields:["name","building_area","operator"],moreFields:["website"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","fee"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["name","building_area","address","opening_hours"],moreFields:["website"],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"],moreFields:["opening_hours","payment_multi","smoking","website","phone","email","fax"],geometry:["point","area"],terms:["bowling center"],tags:{leisure:"bowling_alley"},name:"Bowling Alley"},"leisure/common":{icon:"temaki-pedestrian",fields:["name"],moreFields:["website"],geometry:["point","area"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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","building_area","dance/style"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],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",fields:["name"],moreFields:["website","phone","email","fax"],geometry:["point","area"],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/fishing":{icon:"fas-fish",fields:["name","access_simple"],geometry:["point","area"],tags:{leisure:"fishing"},terms:["angler"],name:"Fishing Spot"},"leisure/fitness_centre":{icon:"fas-dumbbell",fields:["name","sport","address","building_area"],moreFields:["opening_hours","fee","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"fitness_centre"},terms:["health","gym","leisure","studio"],name:"Gym / Fitness Center"},"leisure/fitness_centre/yoga":{icon:"maki-pitch",geometry:["point","area"],terms:["studio","asanas","modern yoga","meditation"],tags:{leisure:"fitness_centre",sport:"yoga"},reference:{key:"sport",value:"yoga"},name:"Yoga Studio"},"leisure/fitness_station":{icon:"maki-pitch",fields:["fitness_station","ref"],moreFields:["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",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",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",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",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",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",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",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",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",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",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",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","operator","access_simple"],moreFields:["fee","payment_multi","website","phone","email","fax"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["payment_multi","website","phone","email","fax"],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"],moreFields:["payment_multi","internet_access","internet_access/fee","internet_access/ssid","smoking","phone","email","fax"],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"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["equestrian","stable"],tags:{leisure:"horse_riding"},name:"Horseback Riding Facility"},"leisure/ice_rink":{icon:"fas-skating",fields:["name","seasonal","sport_ice","operator","address","building"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],terms:["hockey","skating","curling"],tags:{leisure:"ice_rink"},name:"Ice Rink"},"leisure/marina":{icon:"maki-harbor",fields:["name","operator","capacity","fee","sanitary_dump_station","power_supply"],moreFields:["address","payment_multi","internet_access","internet_access/fee","internet_access/ssid","seamark/type","website","phone","email","fax"],geometry:["point","vertex","area"],terms:["boat"],tags:{leisure:"marina"},name:"Marina"},"leisure/miniature_golf":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax"],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","operator","address","opening_hours"],moreFields:["dog","website","phone","email","fax"],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",fields:["name","operator","address","opening_hours"],moreFields:["dog","smoking","website","phone","email","fax"],geometry:["point","area"],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",fields:["material","lit","bench"],geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/picnic_table/chess":{icon:"fas-chess-knight",geometry:["point"],tags:{leisure:"picnic_table",sport:"chess"},reference:{key:"sport",value:"chess"},terms:["bench","chess board","checkerboard","checkers","chequerboard","game table"],name:"Chess Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],moreFields:["access_simple","fee"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"american_football"},reference:{key:"sport",value:"american_football"},terms:["football","gridiron"],name:"American Football Field"},"leisure/pitch/australian_football":{icon:"maki-american-football",geometry:["point","area"],tags:{leisure:"pitch",sport:"australian_football"},reference:{key:"sport",value:"australian_football"},terms:["Aussie","AFL","football"],name:"Australian Football Field"},"leisure/pitch/badminton":{icon:"maki-tennis",fields:["{leisure/pitch}","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",geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Field"},"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-volleyball",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","{leisure/pitch}"],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",geometry:["point","area"],tags:{leisure:"pitch",sport:"bowls"},reference:{key:"sport",value:"bowls"},terms:[],name:"Bowling Green"},"leisure/pitch/cricket":{icon:"maki-cricket",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:["{leisure/pitch}","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/netball":{icon:"maki-volleyball",geometry:["point","area"],tags:{leisure:"pitch",sport:"netball"},reference:{key:"sport",value:"netball"},terms:[],name:"Netball Court"},"leisure/pitch/rugby_league":{icon:"maki-american-football",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-american-football",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-skateboard",geometry:["point","area"],tags:{leisure:"pitch",sport:"skateboard"},reference:{key:"sport",value:"skateboard"},terms:[],name:"Skate Park"},"leisure/pitch/soccer":{icon:"maki-soccer",geometry:["point","area"],tags:{leisure:"pitch",sport:"soccer"},reference:{key:"sport",value:"soccer"},terms:["football"],name:"Soccer Field"},"leisure/pitch/softball":{icon:"maki-baseball",geometry:["point","area"],tags:{leisure:"pitch",sport:"softball"},reference:{key:"sport",value:"softball"},terms:["softball","diamond"],name:"Softball 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:["{leisure/pitch}","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"tennis"},reference:{key:"sport",value:"tennis"},terms:[],name:"Tennis Court"},"leisure/pitch/volleyball":{icon:"maki-volleyball",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"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/sauna":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],moreFields:["payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"maki-slipway",fields:["name","access_simple","fee"],moreFields:["seamark/type"],geometry:["point","vertex","line"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/sports_centre":{icon:"maki-pitch",fields:["name","sport","building","address","fee"],moreFields:["opening_hours","payment_multi","website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"sports_centre"},terms:[],name:"Sports Center / Complex"},"leisure/sports_centre/climbing":{icon:"temaki-abseiling",geometry:["point","area"],terms:["abseiling","artificial climbing wall","belaying","bouldering","rock climbing facility","indoor rock wall","rappeling","rock gym","ropes"],tags:{leisure:"sports_centre",sport:"climbing"},reference:{key:"sport",value:"climbing"},name:"Climbing Gym"},"leisure/sports_centre/swimming":{icon:"maki-swimming",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"],moreFields:["website","phone","email","fax"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","lit","location_pool","length","swimming_pool"],moreFields:["operator","address"],geometry:["point","area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-other-line",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/track/horse_racing":{icon:"maki-horse-riding",fields:["surface","sport_racing_nonmotor","lit","width","lanes"],geometry:["point","line","area"],tags:{leisure:"track",sport:"horse_racing"},terms:["race*","horse","track"],name:"Racetrack (Horse Racing)"},"leisure/track/running":{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/water_park":{icon:"maki-swimming",fields:["name","operator","address"],moreFields:["payment_multi","brand","website","phone","email","fax"],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/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":{icon:"maki-bridge",fields:["name","bridge","layer","maxweight"],moreFields:["material","seamark/type"],geometry:["area"],tags:{man_made:"bridge"},addTags:{man_made:"bridge",layer:"1"},removeTags:{man_made:"bridge",layer:"*"},reference:{key:"man_made",value:"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",fields:["material"],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/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment"},"man_made/flagpole":{icon:"maki-embassy",fields:["operator","flag/type","country","lit","height"],moreFields:["material"],geometry:["point","vertex"],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":{fields:["material"],geometry:["line","area"],tags:{man_made:"groyne"},name:"Groyne"},"man_made/lighthouse":{icon:"maki-lighthouse",fields:["name","operator","building_area","height"],moreFields:["address","website","phone","email","fax","seamark/type"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height"],moreFields:["material","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/mast/communication":{icon:"maki-communications-tower",fields:["{man_made/mast}","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","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Mast"},"man_made/mast/communication/mobile_phone":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","cell mast","cell phone mast","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:mobile_phone":"yes"},reference:{key:"communication:mobile_phone",value:"yes"},name:"Mobile Phone Mast"},"man_made/mast/communication/radio":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","radio mast","radio tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:radio":"yes"},reference:{key:"communication:radio",value:"yes"},name:"Radio Broadcast Mast"},"man_made/mast/communication/television":{icon:"maki-communications-tower",geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","television mast","television tower","transmission mast","transmission tower","tv mast","tv tower"],tags:{man_made:"mast","tower:type":"communication","communication:television":"yes"},reference:{key:"communication:television",value:"yes"},name:"Television Broadcast Mast"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","vertex","area"],fields:["monitoring_multi","operator"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observatory":{fields:["name","operator","address","access_simple","building_area"],moreFields:["website","phone","email","fax"],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:"temaki-pedestrian",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"],terms:["oil","natural gas","water","sewer","sewage"],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":{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/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/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","building_area"],moreFields:["architect"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/tower/bell_tower":{icon:"fas-bell",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["belfry","bell gable","campanile","church tower","klockstapel"],tags:{man_made:"tower","tower:type":"bell_tower"},reference:{key:"tower:type",value:"bell_tower"},name:"Bell Tower"},"man_made/tower/communication":{icon:"temaki-tower",fields:["{man_made/tower}","communication_multi"],geometry:["point","area"],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:"tower","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Tower"},"man_made/tower/minaret":{icon:"temaki-tower",geometry:["point","area"],terms:["Islam","mosque","Muezzin","Muslim"],tags:{man_made:"tower","tower:type":"minaret"},reference:{key:"tower:type",value:"minaret"},name:"Minaret"},"man_made/tower/observation":{icon:"temaki-tower",moreFields:["{man_made/tower}","opening_hours"],geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},reference:{key:"tower:type",value:"observation"},name:"Observation Tower"},"man_made/wastewater_plant":{icon:"maki-water",fields:["name","operator","address"],moreFields:["website","phone","email","fax"],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-watermill",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"maki-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"],moreFields:["website","phone","email","fax"],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/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:["name","water","intermittent"],moreFields:["salt","tidal"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/basin":{icon:"maki-water",fields:["name","basin","intermittent_yes"],geometry:["area"],tags:{natural:"water",water:"basin"},reference:{key:"water",value:"basin"},terms:["detention","drain","overflow","rain","retention"],name:"Basin"},"natural/water/canal":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"canal"},reference:{key:"water",value:"canal"},name:"Canal"},"natural/water/lake":{icon:"maki-water",fields:["{natural/water}","salt","tidal"],geometry:["area"],tags:{natural:"water",water:"lake"},reference:{key:"water",value:"lake"},terms:["lakelet","loch","mere"],name:"Lake"},"natural/water/pond":{icon:"maki-water",fields:["{natural/water}","salt"],geometry:["area"],tags:{natural:"water",water:"pond"},reference:{key:"water",value:"pond"},terms:["lakelet","millpond","tarn","pool","mere"],name:"Pond"},"natural/water/reservoir":{icon:"maki-water",geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"water",value:"reservoir"},name:"Reservoir"},"natural/water/river":{icon:"maki-water",fields:["{natural/water}","tidal"],geometry:["area"],tags:{natural:"water",water:"river"},reference:{key:"water",value:"river"},terms:["beck","branch","brook","course","creek","estuary","rill","riverbank","rivulet","run","runnel","stream","tributary","watercourse"],name:"River"},"natural/water/stream":{icon:"maki-water",fields:["{natural/water}"],geometry:["area"],tags:{natural:"water",water:"stream"},reference:{key:"water",value:"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"],name:"Stream"},"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"],moreFields:["operator","smoking","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"travel_agent"},reference:{key:"shop",value:"travel_agency"},terms:[],name:"Travel Agency",searchable:false},"office/accountant":{icon:"temaki-accounting",geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"advertising_agency"},terms:["ad","ad agency","advert agency","advertising","marketing"],name:"Advertising Agency"},"office/architect":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"association"},terms:["association","non-profit","nonprofit","organization","society"],name:"Nonprofit Organization Office"},"office/charity":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-suitcase",fields:["{office}","internet_access"],moreFields:["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",geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"energy_supplier"},terms:["electricity","energy company","energy utility","gas utility"],name:"Energy Supplier Office"},"office/estate_agent":{icon:"temaki-real_estate_agency",geometry:["point","area"],tags:{office:"estate_agent"},terms:["real estate"],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-town-hall",fields:["name","government","{office}"],geometry:["point","area"],tags:{office:"government"},terms:[],name:"Government Office"},"office/government/register_office":{icon:"maki-town-hall",fields:["{office}","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:["{office}","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",geometry:["point","area"],tags:{office:"guide"},terms:["dive guide","mountain guide","tour guide"],name:"Tour Guide Office"},"office/insurance":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"it"},terms:["computer","information","software","technology"],name:"Information Technology Office"},"office/lawyer":{icon:"fas-balance-scale",geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"lawyer",lawyer:"notary"},reference:{key:"office",value:"notary"},searchable:false,name:"Notary Office"},"office/moving_company":{icon:"fas-people-carry",geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"ngo"},terms:["ngo","non government","non-government","organization","organisation"],name:"NGO Office"},"office/notary":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"notary"},terms:["clerk","deeds","estate","signature","wills"],name:"Notary Office"},"office/political_party":{icon:"maki-town-hall",geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"private_investigator"},terms:["PI","private eye","private detective"],name:"Private Investigator Office"},"office/quango":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"quango"},terms:["ngo","non government","non-government","organization","organisation","quasi autonomous","quasi-autonomous"],name:"Quasi-NGO Office"},"office/religion":{icon:"maki-suitcase",fields:["{office}","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"tax_advisor"},terms:["tax","tax consultant"],name:"Tax Advisor Office"},"office/telecommunication":{icon:"maki-telephone",geometry:["point","area"],tags:{office:"telecommunication"},terms:["communication","internet","phone","voice"],name:"Telecom Office"},"office/therapist":{icon:"maki-suitcase",geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-suitcase",fields:["{office}","operator"],geometry:["point","area"],tags:{office:"water_utility"},terms:["water board","utility"],name:"Water Utility Office"},"piste/downhill":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","snowboard","downhill","piste"],tags:{"piste:type":"downhill"},name:"Downhill Piste/Ski Run"},"piste/downhill/halfpipe":{icon:"fas-snowboarding",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","halfpipe","half pipe","snowboard","downhill","piste"],tags:{"piste:type":"downhill",man_made:"piste:halfpipe"},name:"Halfpipe"},"piste/hike":{icon:"temaki-snow_shoeing",fields:["name","piste/type","piste/difficulty","piste/grooming_hike","oneway","lit"],geometry:["line","area"],terms:["hike","winter hiking","snowshoe","snowshoeing","piste","ski"],tags:{"piste:type":"hike"},name:"Snowshoeing or Winter Hiking Trail"},"piste/ice_skate":{icon:"fas-skating",fields:["name","piste/type","sport_ice","oneway","lit"],geometry:["line","area"],terms:["ice","skating","ski","piste"],tags:{"piste:type":"ice_skate"},name:"Ice Skating Piste"},"piste/nordic":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_nordic","piste/grooming_nordic","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","skating","piste"],tags:{"piste:type":"nordic"},name:"Nordic or Crosscountry Piste/Ski Trail"},"piste/piste":{icon:"fas-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","downhill","alpine","snowboard","skitour","ski touring","sled","luge","sleigh","sledge","ski-joring","husky","horse","winter hiking","snowshoe","snowshoeing","ice","skating"],tags:{"piste:type":"*"},name:"Winter Sport Trails"},"piste/skitour":{icon:"fas-skiing-nordic",fields:["name","piste/type","piste/difficulty_skitour","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","skitour","crosscountry","ski touring","piste"],tags:{"piste:type":"skitour"},name:"Ski Touring Trail"},"piste/sled":{icon:"temaki-sledding",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","sled","luge","sleigh","sledge","piste"],tags:{"piste:type":"sled"},name:"Sled Piste"},"piste/sleigh":{icon:"fas-sleigh",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","piste","sled","luge","sleigh","sledge","ski-joring","husky","horse"],tags:{"piste:type":"sleigh"},name:"Sleigh Piste"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city_block":{icon:"maki-triangle-stroked",fields:["name"],moreFields:["website"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],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"],moreFields:["website"],geometry:["point","area"],tags:{place:"quarter"},terms:["boro","borough","quarter"],name:"Sub-Borough / Quarter"},"place/square":{geometry:["point","area"],fields:["name"],moreFields:["website"],tags:{place:"square"},name:"Square"},"place/suburb":{icon:"maki-triangle-stroked",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],moreFields:["website"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],moreFields:["website"],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/cable/underground":{fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"cable",location:"underground"},name:"Underground Power Cable"},"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/method/photovoltaic":{icon:"fas-solar-panel",fields:["operator","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["photovoltaic module","PV module","sunlight"],tags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel"},addTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},removeTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},reference:{key:"generator:method",value:"photovoltaic"},name:"Solar Panel"},"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","material"],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:["design","ref","material"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-power",fields:["ref","operator","transformer","location","rating","devices","phases"],moreFields:["frequency","voltage/primary","voltage/secondary","voltage/tertiary","windings","windings/configuration"],geometry:["point","vertex","area"],tags:{power:"transformer"},name:"Transformer"},"public_transport/platform_aerialway":{icon:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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-pedestrian",fields:["{public_transport/platform}"],moreFields:["{public_transport/platform}"],geometry:["point","line","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:"temaki-pedestrian",fields:["name","ref_platform","network","operator","departures_board","surface"],moreFields:["lit","bench","shelter","wheelchair"],geometry:["point","line","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:["{public_transport/station}","aerialway/access","aerialway/summer/access"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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:["{public_transport/station}"],moreFields:["{public_transport/station}"],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"],moreFields:["internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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:"iD-relation",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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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:["{public_transport/stop_position}"],moreFields:["{public_transport/stop_position}"],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"],moreFields:["covered"],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"],moreFields:["covered"],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:"temaki-light_rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","direction_vertex"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"miniature"},terms:["rideable miniature railway","narrow gauge railway","minimum gauge railway"],name:"Miniature Railway"},"railway/monorail":{icon:"temaki-monorail",fields:["name","structure","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-railway-rail",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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:"temaki-subway",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["maxspeed","voltage_electrified","frequency_electrified"],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:"temaki-tram",fields:["name","structure","gauge","electrified","service_rail","usage_rail"],moreFields:["covered","frequency_electrified","maxspeed","voltage_electrified"],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:"maki-ferry",geometry:["line"],fields:["name","operator","duration","access","to","from"],tags:{route:"ferry"},name:"Ferry Route"},"seamark/beacon_isolated_danger":{fields:["ref","operator","seamark/beacon_isolated_danger/shape","seamark/type"],geometry:["point","vertex"],terms:["beacon isolated danger","isolated danger beacon","iala"],tags:{"seamark:type":"beacon_isolated_danger"},name:"Danger Beacon"},"seamark/beacon_lateral":{fields:["ref","operator","seamark/beacon_lateral/colour","seamark/beacon_lateral/category","seamark/beacon_lateral/shape","seamark/beacon_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral beacon","beacon lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"beacon_lateral"},name:"Channel Beacon"},"seamark/buoy_lateral":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system","seamark/type"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral"},name:"Channel Buoy"},"seamark/buoy_lateral/green":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"green"},name:"Green Buoy"},"seamark/buoy_lateral/red":{geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"red"},name:"Red Buoy"},"seamark/mooring":{fields:["ref","operator","seamark/mooring/category","seamark/type"],geometry:["point"],terms:["dolphin","pile","bollard","buoy","post"],tags:{"seamark:type":"mooring"},name:"Mooring"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],moreFields:["brand","currency_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishmonger"},reference:{key:"shop",value:"seafood"},name:"Fishmonger",searchable:false},"shop/furnace":{icon:"maki-shop",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:["{shop}","agrarian"],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:["{shop}","drive_through"],geometry:["point","area"],terms:["alcohol","beer","booze","wine"],tags:{shop:"alcohol"},name:"Liquor Store"},"shop/anime":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"anime"},terms:["manga","japan","cosplay","figurine","dakimakura"],name:"Anime Shop"},"shop/antiques":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-shop",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",geometry:["point","area"],terms:["art*","exhibit*","gallery"],tags:{shop:"art"},name:"Art Store"},"shop/baby_goods":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods"},name:"Baby Goods Store"},"shop/bag":{icon:"maki-shop",geometry:["point","area"],terms:["handbag","purse"],tags:{shop:"bag"},name:"Bag/Luggage Store"},"shop/bakery":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery"},terms:["bread","cakes","rolls"],name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"bathroom_furnishing"},name:"Bathroom Furnishing Store"},"shop/beauty":{icon:"maki-shop",fields:["{shop}","beauty"],geometry:["point","area"],terms:["spa","salon","tanning"],tags:{shop:"beauty"},name:"Beauty Shop"},"shop/beauty/nails":{icon:"maki-shop",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",geometry:["point","area"],tags:{shop:"beauty",beauty:"tanning"},reference:{key:"leisure",value:"tanning_salon"},name:"Tanning Salon"},"shop/bed":{icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages"},terms:["drinks"],name:"Beverage Store"},"shop/bicycle":{icon:"maki-bicycle",fields:["{shop}","service/bicycle"],geometry:["point","area"],terms:["bike","repair","tricycle","unicycle"],tags:{shop:"bicycle"},name:"Bicycle Shop"},"shop/bookmaker":{icon:"maki-shop",geometry:["point","area"],terms:["betting","bookie"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-shop",fields:["{shop}","internet_access"],moreFields:["{shop}","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{shop:"books"},name:"Book Store"},"shop/boutique":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"fas-bacon",geometry:["point","area"],terms:["chicken","beef","lamb","meat","pork"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"candles"},terms:["wax"],name:"Candle Shop"},"shop/car_parts":{icon:"maki-car",geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car_parts"},name:"Car Parts Store"},"shop/car_repair":{icon:"maki-car-repair",fields:["{shop}","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive","garage","service"],tags:{shop:"car_repair"},name:"Car Repair Shop"},"shop/car":{icon:"maki-car",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],terms:["automobile","automotive"],tags:{shop:"car"},name:"Car Dealership"},"shop/caravan":{icon:"temaki-rv_park",fields:["name","brand","{shop}","second_hand","service/vehicle"],geometry:["point","area"],tags:{shop:"caravan"},terms:["auto","camper","recreational vehicle"],name:"RV Dealership"},"shop/carpet":{icon:"maki-shop",geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["thrift","op shop","nonprofit"],tags:{shop:"charity"},name:"Charity Store"},"shop/cheese":{icon:"fas-cheese",geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","beauty","drug store","drugstore","gift","hair","med*","pharmacy","prescription","tooth"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate"},terms:["cocoa"],name:"Chocolate Store"},"shop/clothes":{icon:"maki-clothing-store",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"clothes"},name:"Clothing Store"},"shop/coffee":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"computer"},terms:["desktop","laptop","hardware","operating system","software"],name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionery",geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"fas-print",geometry:["point","area"],tags:{shop:"copyshop"},terms:["print","scan"],name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics"},terms:["make-up","makeup"],name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft"},terms:["art*","paint*","frame"],name:"Arts and Crafts Store"},"shop/curtain":{icon:"maki-shop",geometry:["point","area"],terms:["drape*","window"],tags:{shop:"curtain"},name:"Curtain Store"},"shop/dairy":{icon:"fas-cheese",geometry:["point","area"],terms:["milk","egg","cheese"],tags:{shop:"dairy"},name:"Dairy Store"},"shop/deli":{icon:"maki-restaurant",geometry:["point","area"],terms:["lunch","meat","sandwich"],tags:{shop:"deli"},name:"Deli"},"shop/department_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning"},name:"Dry Cleaner"},"shop/e-cigarette":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"e-cigarette"},terms:["electronic","vape","vaping","vapor"],name:"E-Cigarette Shop"},"shop/electronics":{icon:"maki-shop",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",geometry:["point","area"],terms:["sex","porn"],tags:{shop:"erotic"},name:"Erotic Store"},"shop/fabric":{icon:"maki-shop",geometry:["point","area"],terms:["sew"],tags:{shop:"fabric"},name:"Fabric Store"},"shop/farm":{icon:"maki-shop",geometry:["point","area"],terms:["farm shop","farm stand"],tags:{shop:"farm"},name:"Produce Stand"},"shop/fashion":{icon:"maki-shop",fields:["name","clothes","{shop}"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/fireplace":{icon:"maki-shop",geometry:["point","area"],terms:["fireplace","stove","masonry heater"],tags:{shop:"fireplace"},name:"Fireplace Store"},"shop/fishing":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"fishing"},terms:["bait","fishing line","flies","fly","lure","reel","rod","tackle"],name:"Fishing Shop"},"shop/florist":{icon:"maki-florist",geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frame"},terms:["art*","paint*","photo*","frame"],name:"Framing Shop"},"shop/frozen_food":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food"},name:"Frozen Food"},"shop/fuel":{icon:"maki-shop",fields:["{shop}","fuel_multi"],geometry:["point","area"],tags:{shop:"fuel"},name:"Fuel Shop",matchScore:0.5},"shop/funeral_directors":{icon:"maki-cemetery",fields:["{shop}","religion","denomination"],geometry:["point","area"],terms:["undertaker","memorial home"],tags:{shop:"funeral_directors"},name:"Funeral Home"},"shop/furniture":{icon:"fas-couch",geometry:["point","area"],terms:["chair","sofa","table"],tags:{shop:"furniture"},name:"Furniture Store"},"shop/garden_centre":{icon:"maki-garden-centre",geometry:["point","area"],terms:["landscape","mulch","shrub","tree"],tags:{shop:"garden_centre"},name:"Garden Center"},"shop/gas":{icon:"maki-shop",geometry:["point","area"],terms:["cng","lpg","natural gas","propane","refill","tank"],tags:{shop:"gas"},name:"Bottled Gas Shop"},"shop/gift":{icon:"maki-gift",geometry:["point","area"],terms:["souvenir"],tags:{shop:"gift"},name:"Gift Shop"},"shop/greengrocer":{icon:"maki-shop",geometry:["point","area"],terms:["fruit","produce","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"temaki-beauty_salon",geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-shop",geometry:["point","area"],terms:["wholefood","vitamins","vegetarian","vegan"],tags:{shop:"health_food"},name:"Health Food Shop"},"shop/hearing_aids":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids"},name:"Hearing Aids Store"},"shop/herbalist":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-shop",geometry:["point","area"],terms:["audio","hi-fi","high fidelity","stereo","video"],tags:{shop:"hifi"},name:"Hifi Store"},"shop/houseware":{icon:"fas-blender",geometry:["point","area"],terms:["home","household"],tags:{shop:"houseware"},name:"Houseware Store"},"shop/hunting":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"hunting"},terms:["arrows","bows","bullets","crossbows","rifles","traps"],name:"Hunting Shop"},"shop/interior_decoration":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration"},name:"Interior Decoration Store"},"shop/jewelry":{icon:"maki-jewelry-store",geometry:["point","area"],terms:["bracelet","diamond","earrings","gem","gold","jeweler","jewellery","jeweller","necklace","pins","ring","silver"],tags:{shop:"jewelry"},name:"Jewelry Store"},"shop/kiosk":{icon:"maki-shop",fields:["{shop}","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen"},terms:["cabinets","countertops","sinks"],name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"fas-key",geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"medical_supply"},name:"Medical Supply Store"},"shop/mobile_phone":{icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone"},name:"Mobile Phone Store"},"shop/money_lender":{icon:"maki-bank",fields:["{shop}","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["{shop}","service/vehicle"],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","brand","{shop}"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-music",geometry:["point","area"],terms:["tape casettes","CDs","compact discs","vinyl records"],tags:{shop:"music"},name:"Music Store"},"shop/musical_instrument":{icon:"maki-music",geometry:["point","area"],terms:["guitar"],tags:{shop:"musical_instrument"},name:"Musical Instrument Store"},"shop/newsagent":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent"},name:"Newspaper/Magazine Shop"},"shop/nutrition_supplements":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements"},name:"Nutrition Supplements Store"},"shop/optician":{icon:"maki-optician",geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"supermarket",organic:"only"},name:"Organic Goods Store"},"shop/outdoor":{icon:"temaki-compass",geometry:["point","area"],terms:["camping","climbing","hiking","outfitter","outdoor equipment","outdoor supplies"],tags:{shop:"outdoor"},name:"Outdoors Store"},"shop/paint":{icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"maki-shop",geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-bakery",geometry:["point","area"],tags:{shop:"pastry"},terms:["patisserie","cake shop","cakery"],name:"Pastry Shop"},"shop/pawnbroker":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-dog-park",geometry:["point","area"],terms:["cat","dog"],tags:{shop:"pet_grooming"},name:"Pet Grooming Store"},"shop/pet":{icon:"maki-dog-park",geometry:["point","area"],terms:["animal","cat","dog","fish","kitten","puppy","reptile"],tags:{shop:"pet"},name:"Pet Store"},"shop/photo":{icon:"maki-attraction",geometry:["point","area"],terms:["camera","film"],tags:{shop:"photo"},name:"Photography Store"},"shop/pyrotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"radiotechnics"},terms:["antenna","transistor"],name:"Radio/Electronic Component Store"},"shop/religion":{icon:"maki-shop",fields:["{shop}","religion","denomination"],geometry:["point","area"],tags:{shop:"religion"},name:"Religious Store"},"shop/scuba_diving":{icon:"maki-swimming",fields:["{shop}","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-shop",geometry:["point","area"],terms:["fishmonger"],tags:{shop:"seafood"},name:"Seafood Shop"},"shop/second_hand":{icon:"maki-shop",fields:["{shop}","second_hand"],geometry:["point","area"],terms:["secondhand","second hand","resale","thrift","used"],tags:{shop:"second_hand"},name:"Consignment/Thrift Store"},"shop/sewing":{icon:"maki-shop",geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes"},terms:["boots","cleats","clogs","heels","loafers","oxfords","sneakers"],name:"Shoe Store"},"shop/sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports"},terms:["athletics"],name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-shop",geometry:["point","area"],terms:["card","paper"],tags:{shop:"stationery"},name:"Stationery Store"},"shop/storage_rental":{icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental"},terms:["garages"],name:"Storage Rental"},"shop/supermarket":{icon:"maki-grocery",moreFields:["diet_multi","{shop}"],geometry:["point","area"],terms:["grocery","store","shop"],tags:{shop:"supermarket"},name:"Supermarket"},"shop/tailor":{icon:"maki-clothing-store",geometry:["point","area"],terms:["clothes","suit"],tags:{shop:"tailor"},name:"Tailor"},"shop/tattoo":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tattoo"},terms:["ink"],name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"ticket"},terms:["box office"],name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tobacco"},terms:["cigarettes","cigars"],name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys"},terms:["games"],name:"Toy Store"},"shop/trade":{icon:"maki-shop",fields:["name","trade","{shop}"],geometry:["point","area"],tags:{shop:"trade"},name:"Trade Shop"},"shop/travel_agency":{icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"vacuum_cleaner"},name:"Vacuum Cleaner Store"},"shop/variety_store":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store"},name:"Variety Store"},"shop/video_games":{icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games"},name:"Video Game Store"},"shop/video":{icon:"temaki-movie_rental",geometry:["point","area"],terms:["DVD","VHS","video casette"],tags:{shop:"video"},name:"Video Store"},"shop/watches":{icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water_sports"},name:"Watersport/Swim Shop"},"shop/water":{icon:"maki-shop",geometry:["point","area"],tags:{shop:"water"},name:"Drinking Water Shop"},"shop/weapons":{icon:"maki-shop",geometry:["point","area"],terms:["ammo","gun","knife","knives"],tags:{shop:"weapons"},name:"Weapon Shop"},"shop/wholesale":{icon:"maki-warehouse",fields:["{shop}","wholesale"],geometry:["point","area"],terms:["warehouse club","cash and carry"],tags:{shop:"wholesale"},name:"Wholesale Store"},"shop/window_blind":{icon:"temaki-window",geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},"tourism/alpine_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","internet_access","fee"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["climbing hut"],tags:{tourism:"alpine_hut"},name:"Alpine Hut"},"tourism/apartment":{icon:"maki-lodging",fields:["name","operator","address","building_area","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"apartment"},name:"Guest Apartment / Condo"},"tourism/aquarium":{icon:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","smoking","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],moreFields:["material","website"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/artwork/mural":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"mural"},reference:{key:"artwork_type",value:"mural"},terms:["fresco","wall painting"],name:"Mural"},"tourism/artwork/sculpture":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"sculpture"},reference:{key:"artwork_type",value:"sculpture"},terms:["statue","figure","carving"],name:"Sculpture"},"tourism/artwork/statue":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"statue"},reference:{key:"artwork_type",value:"statue"},terms:["sculpture","figure","carving"],name:"Statue"},"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"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","sanitary_dump_station","power_supply","website","phone","email","fax","wheelchair"],geometry:["point","vertex","area"],terms:["tent","rv"],tags:{tourism:"camp_site"},name:"Campground"},"tourism/caravan_site":{icon:"temaki-rv_park",fields:["name","address","capacity","sanitary_dump_station","power_supply","internet_access"],moreFields:["operator","fee","payment_multi","internet_access/fee","internet_access/ssid","smoking","website","phone","email","fax","wheelchair"],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","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","rooms","internet_access"],moreFields:["smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"hostel"},name:"Hostel"},"tourism/hotel":{icon:"maki-lodging",fields:["name","brand","address","building_area","rooms","internet_access"],moreFields:["operator","smoking","payment_multi","internet_access/fee","internet_access/ssid","stars","website","phone","email","fax","wheelchair","bar"],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"],moreFields:["material"],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"],moreFields:["internet_access","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],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","brand","address","building_area","rooms","internet_access"],moreFields:["operator","smoking","payment_multi","internet_access/fee","internet_access/ssid","website","phone","email","fax","wheelchair"],geometry:["point","area"],tags:{tourism:"motel"},name:"Motel"},"tourism/museum":{icon:"temaki-museum",fields:["name","operator","address","building_area","opening_hours"],moreFields:["fee","payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["smoking","fee","payment_multi","website","wheelchair"],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"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],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"],moreFields:["address","opening_hours","website","phone","email","fax"],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","fee","fireplace"],moreFields:["payment_multi","wheelchair"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"temaki-zoo",fields:["name","operator","address","opening_hours","fee"],moreFields:["payment_multi","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","surface","direction_vertex"],geometry:["vertex","line","area"],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:["surface","direction_vertex"],geometry:["vertex","area"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","area"],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",fields:["surface"],geometry:["vertex","line","area"],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","direction_vertex"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},traffic_sign_vertex:{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction"],geometry:["vertex"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},traffic_sign:{icon:"maki-square-stroked",fields:["traffic_sign","direction"],geometry:["point"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},"traffic_sign/city_limit_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","name"],geometry:["vertex"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/city_limit":{icon:"maki-square-stroked",fields:["traffic_sign","direction","name"],geometry:["point"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/maxspeed_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","maxspeed"],geometry:["vertex"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"traffic_sign/maxspeed":{icon:"maki-square-stroked",fields:["traffic_sign","direction","maxspeed"],geometry:["point"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"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/enforcement":{icon:"iD-relation",fields:["name","enforcement"],geometry:["relation"],tags:{type:"enforcement"},name:"Enforcement"},"type/restriction":{icon:"iD-restriction",fields:["restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-restriction-no-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_left_turn"},name:"No Left Turn"},"type/restriction/no_right_turn":{icon:"iD-restriction-no-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_right_turn"},name:"No Right Turn"},"type/restriction/no_straight_on":{icon:"iD-restriction-no-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"no_straight_on"},name:"No Straight On"},"type/restriction/no_u_turn":{icon:"iD-restriction-no-u-turn",geometry:["relation"],tags:{type:"restriction",restriction:"no_u_turn"},name:"No U-turn"},"type/restriction/only_left_turn":{icon:"iD-restriction-only-left-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_left_turn"},name:"Only Left Turn"},"type/restriction/only_right_turn":{icon:"iD-restriction-only-right-turn",geometry:["relation"],tags:{type:"restriction",restriction:"only_right_turn"},name:"Only Right Turn"},"type/restriction/only_straight_on":{icon:"iD-restriction-only-straight-on",geometry:["relation"],tags:{type:"restriction",restriction:"only_straight_on"},name:"Only Straight On"},"type/restriction/only_u_turn":{icon:"iD-restriction-only-u-turn",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","to","from"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"iD-route-bus",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route","to","from"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"iD-route-ferry",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","to","from"],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","to","from"],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","to","from"],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","to","from"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/pipeline":{icon:"iD-route-pipeline",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"iD-route-piste",fields:["name","piste/type","colour","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-route-power",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-route-road",fields:["name","ref_route","network_road","to","from"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"iD-route-subway",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-route-train",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"iD-route-tram",fields:["name","ref_route","operator","network","to","from"],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:{moreFields:["name"],geometry:["vertex"],tags:{},name:"Other",matchScore:0.1},"waterway/riverbank":{icon:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank",searchable:false},"waterway/boatyard":{icon:"maki-harbor",fields:["name","operator"],moreFields:["address","website","phone","email","fax","wheelchair"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent"],moreFields:["salt"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],moreFields:["website"],fields:["name"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["{waterway/drain}"],moreFields:["{waterway/drain}"],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"],moreFields:["covered"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-fuel",fields:["name","operator","address","opening_hours","fuel_multi"],moreFields:["payment_multi","brand","seamark/type","building","website","phone","email","fax","wheelchair"],geometry:["point","area"],terms:["petrol","gas","diesel","boat"],tags:{waterway:"fuel"},name:"Marine Fuel Station"},"waterway/milestone":{icon:"temaki-milestone",fields:["distance","direction_vertex"],moreFields:["seamark/type"],geometry:["point","vertex"],tags:{waterway:"milestone"},terms:["milestone","marker"],name:"Waterway Milestone"},"waterway/river":{icon:"iD-waterway-river",fields:["name","structure_waterway","width","intermittent","tidal"],moreFields:["covered","salt"],geometry:["line"],terms:["beck","branch","brook","course","creek","estuary","rill","rivulet","run","runnel","stream","tributary","watercourse"],tags:{waterway:"river"},name:"River"},"waterway/sanitary_dump_station":{icon:"temaki-storage_tank",fields:["name","operator","access_simple","fee","water_point"],moreFields:["opening_hours","payment_multi","seamark/type"],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:["{waterway/stream}","intermittent"],moreFields:["{waterway/stream}"],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"],moreFields:["covered","salt","tidal"],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-waterfall",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/bank/ABANCA":{name:"ABANCA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9598744"},addTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},removeTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},matchScore:2,suggestion:true},"amenity/bank/ABN AMRO":{name:"ABN AMRO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287471"},addTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},removeTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},matchScore:2,suggestion:true},"amenity/bank/ABSA":{name:"ABSA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q331688"},addTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},removeTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},matchScore:2,suggestion:true},"amenity/bank/AIB":{name:"AIB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1642179"},addTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},removeTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},matchScore:2,suggestion:true},"amenity/bank/ANZ":{name:"ANZ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q714641"},addTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},removeTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},matchScore:2,suggestion:true},"amenity/bank/ASB Bank":{name:"ASB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q297214"},addTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},removeTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},matchScore:2,suggestion:true},"amenity/bank/ATB Financial":{name:"ATB Financial",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q298762"},addTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},removeTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},matchScore:2,suggestion:true},"amenity/bank/AXA":{name:"AXA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160054"},addTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},removeTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},matchScore:2,suggestion:true},"amenity/bank/Access Bank":{name:"Access Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4672420"},addTags:{amenity:"bank","brand:wikidata":"Q4672420","brand:wikipedia":"en:Access Bank Group",name:"Access Bank"},removeTags:{amenity:"bank","brand:wikidata":"Q4672420","brand:wikipedia":"en:Access Bank Group",name:"Access Bank"},matchScore:2,suggestion:true},"amenity/bank/Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517050"},addTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},removeTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},matchScore:2,suggestion:true},"amenity/bank/Agribank":{name:"Agribank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4693829"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},removeTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},matchScore:2,suggestion:true},"amenity/bank/Akbank":{name:"Akbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q416624"},addTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},removeTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},matchScore:2,suggestion:true},"amenity/bank/Alior Bank":{name:"Alior Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9148395"},addTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},removeTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},matchScore:2,suggestion:true},"amenity/bank/Allahabad Bank":{name:"Allahabad Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2018840"},addTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},removeTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},matchScore:2,suggestion:true},"amenity/bank/Allied Bank":{name:"Allied Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4732555"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},removeTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},matchScore:2,suggestion:true},"amenity/bank/Alpha Bank":{name:"Alpha Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q747394"},addTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},removeTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},matchScore:2,suggestion:true},"amenity/bank/Andhra Bank":{name:"Andhra Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003476"},addTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},removeTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},matchScore:2,suggestion:true},"amenity/bank/Antonveneta":{name:"Antonveneta",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633689"},addTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},removeTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},matchScore:2,suggestion:true},"amenity/bank/Argenta":{name:"Argenta",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q932856"},addTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},removeTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},matchScore:2,suggestion:true},"amenity/bank/Arvest Bank":{name:"Arvest Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4802393"},addTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},removeTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},matchScore:2,suggestion:true},"amenity/bank/Asia United Bank":{name:"Asia United Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4806482"},addTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},removeTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},matchScore:2,suggestion:true},"amenity/bank/Askari Bank":{name:"Askari Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4807137"},addTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},removeTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},matchScore:2,suggestion:true},"amenity/bank/Associated Bank":{name:"Associated Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4809155"},addTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},removeTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q758052"},addTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},removeTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},matchScore:2,suggestion:true},"amenity/bank/Axis Bank":{name:"Axis Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003549"},addTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},removeTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},matchScore:2,suggestion:true},"amenity/bank/BAC":{name:"BAC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5715556"},addTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},removeTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},matchScore:2,suggestion:true},"amenity/bank/BAWAG PSK":{name:"BAWAG PSK",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q379938"},addTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},removeTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},matchScore:2,suggestion:true},"amenity/bank/BB&T":{name:"BB&T",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795486"},addTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},removeTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},matchScore:2,suggestion:true},"amenity/bank/BBBank":{name:"BBBank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795504"},addTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},removeTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},matchScore:2,suggestion:true},"amenity/bank/BBVA":{name:"BBVA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806189"},addTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},removeTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},matchScore:2,suggestion:true},"amenity/bank/BBVA Bancomer":{name:"BBVA Bancomer",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},removeTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835088"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},removeTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},matchScore:2,suggestion:true},"amenity/bank/BBVA Continental":{name:"BBVA Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835089"},addTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},removeTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876788"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},removeTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},matchScore:2,suggestion:true},"amenity/bank/BCA":{name:"BCA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806626"},addTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},removeTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},matchScore:2,suggestion:true},"amenity/bank/BCI":{name:"BCI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882083"},addTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},removeTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},matchScore:2,suggestion:true},"amenity/bank/BCP (Bolivia)":{name:"BCP (Bolivia)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16826675"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (France)":{name:"BCP (France)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Luxembourg)":{name:"BCP (Luxembourg)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Peru)":{name:"BCP (Peru)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854124"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCR":{name:"BCR",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6951632"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},removeTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},matchScore:2,suggestion:true},"amenity/bank/BDO":{name:"BDO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854129"},addTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},removeTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},matchScore:2,suggestion:true},"amenity/bank/BGŻ BNP Paribas":{name:"BGŻ BNP Paribas",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9164980"},addTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},removeTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BMCE Bank":{name:"BMCE Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2300433"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},removeTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883409"},addTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},removeTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},matchScore:2,suggestion:true},"amenity/bank/BMN":{name:"BMN",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3754900"},addTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},removeTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},matchScore:2,suggestion:true},"amenity/bank/BMO":{name:"BMO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},removeTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank":{name:"BMO Harris Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835981"},addTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},removeTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},matchScore:2,suggestion:true},"amenity/bank/BNA":{name:"BNA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883410"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},removeTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},matchScore:2,suggestion:true},"amenity/bank/BNI":{name:"BNI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882611"},addTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},removeTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},matchScore:2,suggestion:true},"amenity/bank/BNL":{name:"BNL",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2201225"},addTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},removeTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q499707"},addTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},removeTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas Fortis":{name:"BNP Paribas Fortis",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796827"},addTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},removeTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},matchScore:2,suggestion:true},"amenity/bank/BOC":{name:"BOC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},removeTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},matchScore:2,suggestion:true},"amenity/bank/BPI":{name:"BPI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2501256"},addTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},removeTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},matchScore:2,suggestion:true},"amenity/bank/BRD":{name:"BRD",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796927"},addTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},removeTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},matchScore:2,suggestion:true},"amenity/bank/BRED":{name:"BRED",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2877455"},addTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},removeTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},matchScore:2,suggestion:true},"amenity/bank/BRI":{name:"BRI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q623042"},addTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},removeTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},matchScore:2,suggestion:true},"amenity/bank/BTN":{name:"BTN",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474534"},addTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},removeTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},matchScore:2,suggestion:true},"amenity/bank/BW-Bank":{name:"BW-Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q798891"},addTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},removeTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},matchScore:2,suggestion:true},"amenity/bank/Banamex":{name:"Banamex",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q749474"},addTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},removeTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},matchScore:2,suggestion:true},"amenity/bank/Banca Intesa":{name:"Banca Intesa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q647092"},addTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},removeTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},matchScore:2,suggestion:true},"amenity/bank/Banca March":{name:"Banca March",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q578252"},addTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},removeTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Milano":{name:"Banca Popolare di Milano",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806154"},addTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},removeTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Novara":{name:"Banca Popolare di Novara",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633742"},addTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},removeTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{name:"Banca Popolare di Sondrio",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q686176"},addTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},removeTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Verona":{name:"Banca Popolare di Verona",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3167468"},addTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},removeTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{name:"Banca Popolare di Vicenza",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127200"},addTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},removeTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},matchScore:2,suggestion:true},"amenity/bank/Banca Românească":{name:"Banca Românească",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854052"},addTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},removeTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},matchScore:2,suggestion:true},"amenity/bank/Banca Sella":{name:"Banca Sella",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633749"},addTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},removeTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},matchScore:2,suggestion:true},"amenity/bank/Banca Transilvania":{name:"Banca Transilvania",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806161"},addTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},removeTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},matchScore:2,suggestion:true},"amenity/bank/Bancaribe":{name:"Bancaribe",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717827"},addTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},removeTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},matchScore:2,suggestion:true},"amenity/bank/Banco AV Villas":{name:"Banco AV Villas",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854068"},addTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},removeTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},matchScore:2,suggestion:true},"amenity/bank/Banco Agrario":{name:"Banco Agrario",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q20013358"},addTags:{amenity:"bank",brand:"Banco Agrario","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario"},removeTags:{amenity:"bank",brand:"Banco Agrario","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario"},matchScore:2,suggestion:true},"amenity/bank/Banco Agrario de Colombia":{name:"Banco Agrario de Colombia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q20013358"},addTags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"},removeTags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"Banco Agrario de Colombia"},matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854076"},addTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},removeTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},matchScore:2,suggestion:true},"amenity/bank/Banco BPM":{name:"Banco BPM",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27331643"},addTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},removeTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},matchScore:2,suggestion:true},"amenity/bank/Banco Caja Social":{name:"Banco Caja Social",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717869"},addTags:{amenity:"bank",brand:"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social"},removeTags:{amenity:"bank",brand:"Banco Caja Social","brand:wikidata":"Q5717869","brand:wikipedia":"es:Banco Caja Social",name:"Banco Caja Social"},matchScore:2,suggestion:true},"amenity/bank/Banco Ciudad":{name:"Banco Ciudad",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856204"},addTags:{amenity:"bank",brand:"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad"},removeTags:{amenity:"bank",brand:"Banco Ciudad","brand:wikidata":"Q4856204","brand:wikipedia":"en:Bank of the City of Buenos Aires",name:"Banco Ciudad"},matchScore:2,suggestion:true},"amenity/bank/Banco Continental":{name:"Banco Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835089"},addTags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental"},removeTags:{amenity:"bank",brand:"Banco Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"Banco Continental"},matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5718188"},addTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},removeTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},matchScore:2,suggestion:true},"amenity/bank/Banco Falabella":{name:"Banco Falabella",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854088"},addTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},removeTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},matchScore:2,suggestion:true},"amenity/bank/Banco G&T Continental":{name:"Banco G&T Continental",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717949"},addTags:{amenity:"bank",brand:"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental"},removeTags:{amenity:"bank",brand:"Banco G&T Continental","brand:wikidata":"Q5717949","brand:wikipedia":"es:Banco GYT Continental, S.A.",name:"Banco G&T Continental"},matchScore:2,suggestion:true},"amenity/bank/Banco General":{name:"Banco General",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27618271"},addTags:{amenity:"bank",brand:"Banco General","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General"},removeTags:{amenity:"bank",brand:"Banco General","brand:wikidata":"Q27618271","brand:wikipedia":"es:Banco General (Panamá)",name:"Banco General"},matchScore:2,suggestion:true},"amenity/bank/Banco Industrial":{name:"Banco Industrial",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16489444"},addTags:{amenity:"bank",brand:"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial"},removeTags:{amenity:"bank",brand:"Banco Industrial","brand:wikidata":"Q16489444","brand:wikipedia":"es:Banco Industrial",name:"Banco Industrial"},matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854104"},addTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},removeTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},matchScore:2,suggestion:true},"amenity/bank/Banco Nación":{name:"Banco Nación",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883376"},addTags:{amenity:"bank",brand:"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación"},removeTags:{amenity:"bank",brand:"Banco Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806193"},addTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},removeTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},matchScore:2,suggestion:true},"amenity/bank/Banco Pichincha":{name:"Banco Pichincha",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854135"},addTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},removeTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},matchScore:2,suggestion:true},"amenity/bank/Banco Popular":{name:"Banco Popular",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q537259"},addTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},removeTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},matchScore:2,suggestion:true},"amenity/bank/Banco Provincia":{name:"Banco Provincia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856209"},addTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},removeTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},matchScore:2,suggestion:true},"amenity/bank/Banco Sabadell":{name:"Banco Sabadell",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q762330"},addTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},removeTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},matchScore:2,suggestion:true},"amenity/bank/Banco Santa Fe":{name:"Banco Santa Fe",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6046871"},addTags:{amenity:"bank",brand:"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe"},removeTags:{amenity:"bank",brand:"Banco Santa Fe","brand:wikidata":"Q6046871","brand:wikipedia":"es:Nuevo Banco de Santa Fe",name:"Banco Santa Fe"},matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6496310"},addTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},removeTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},matchScore:2,suggestion:true},"amenity/bank/Banco de Bogotá":{name:"Banco de Bogotá",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854122"},addTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},removeTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},matchScore:2,suggestion:true},"amenity/bank/Banco de Chile":{name:"Banco de Chile",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882085"},addTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},removeTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},matchScore:2,suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{name:"Banco de Desarrollo Banrural",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5719130"},addTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},removeTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},matchScore:2,suggestion:true},"amenity/bank/Banco de Occidente":{name:"Banco de Occidente",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854127"},addTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},removeTags:{amenity:"bank",brand:"Banco de Occidente","brand:wikidata":"Q4854127","brand:wikipedia":"es:Banco de Occidente (Colombia)",name:"Banco de Occidente"},matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517093"},addTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},removeTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Argentina)":{name:"Banco de la Nación (Argentina)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883376"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},removeTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación (Peru)":{name:"Banco de la Nación (Peru)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856206"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"},removeTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q4856206","brand:wikipedia":"en:Bank of the Nation (Peru)",name:"Banco de la Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco di Napoli":{name:"Banco di Napoli",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633835"},addTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},removeTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},matchScore:2,suggestion:true},"amenity/bank/Banco di Sardegna":{name:"Banco di Sardegna",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806205"},addTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},removeTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},matchScore:2,suggestion:true},"amenity/bank/Banco do Brasil":{name:"Banco do Brasil",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q610817"},addTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},removeTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854137"},addTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},removeTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},matchScore:2,suggestion:true},"amenity/bank/Bancolombia":{name:"Bancolombia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806206"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},removeTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},removeTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854143"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},removeTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854841"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},removeTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},removeTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4034833"},addTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},removeTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},matchScore:2,suggestion:true},"amenity/bank/Bank Alfalah":{name:"Bank Alfalah",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855895"},addTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},removeTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697619"},addTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},removeTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},matchScore:2,suggestion:true},"amenity/bank/Bank Danamon":{name:"Bank Danamon",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855913"},addTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},removeTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri":{name:"Bank Mandiri",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806639"},addTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},removeTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri Syariah":{name:"Bank Mandiri Syariah",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474533"},addTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},removeTags:{amenity:"bank",brand:"Bank Mandiri Syariah","brand:wikidata":"Q12474533","brand:wikipedia":"id:Bank Syariah Mandiri",name:"Bank Mandiri Syariah"},matchScore:2,suggestion:true},"amenity/bank/Bank Mega":{name:"Bank Mega",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474504"},addTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},removeTags:{amenity:"bank",brand:"Bank Mega","brand:wikidata":"Q12474504","brand:wikipedia":"id:Bank Mega",name:"Bank Mega"},matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855949"},addTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},removeTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},matchScore:2,suggestion:true},"amenity/bank/Bank Pekao":{name:"Bank Pekao",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806642"},addTags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"en:Bank Pekao",name:"Bank Pekao"},removeTags:{amenity:"bank",brand:"Bank Pekao","brand:wikidata":"Q806642","brand:wikipedia":"en:Bank Pekao",name:"Bank Pekao"},matchScore:2,suggestion:true},"amenity/bank/Bank Rakyat":{name:"Bank Rakyat",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855964"},addTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},removeTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},matchScore:2,suggestion:true},"amenity/bank/Bank of Africa":{name:"Bank of Africa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882627"},addTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},removeTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa",short_name:"BOA"},matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487907"},addTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},removeTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003797"},addTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},removeTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ceylon":{name:"Bank of Ceylon",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882652"},addTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},removeTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},matchScore:2,suggestion:true},"amenity/bank/Bank of China":{name:"Bank of China",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},removeTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/Bank of Commerce":{name:"Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856092"},addTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},removeTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806678"},addTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},removeTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004439"},addTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},removeTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ireland":{name:"Bank of Ireland",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806689"},addTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},removeTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004304"},addTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},removeTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},matchScore:2,suggestion:true},"amenity/bank/Bank of Montreal":{name:"Bank of Montreal",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},removeTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},matchScore:2,suggestion:true},"amenity/bank/Bank of New Zealand":{name:"Bank of New Zealand",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806687"},addTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},removeTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},matchScore:2,suggestion:true},"amenity/bank/Bank of Scotland":{name:"Bank of Scotland",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q627381"},addTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},removeTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},matchScore:2,suggestion:true},"amenity/bank/Bank of the West":{name:"Bank of the West",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2881919"},addTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},removeTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},matchScore:2,suggestion:true},"amenity/bank/Bankia":{name:"Bankia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806807"},addTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},removeTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},matchScore:2,suggestion:true},"amenity/bank/Bankinter":{name:"Bankinter",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806808"},addTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},removeTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},matchScore:2,suggestion:true},"amenity/bank/Banner Bank":{name:"Banner Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856910"},addTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},removeTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},matchScore:2,suggestion:true},"amenity/bank/Banorte":{name:"Banorte",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806914"},addTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},removeTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},matchScore:2,suggestion:true},"amenity/bank/Banque Atlantique":{name:"Banque Atlantique",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882890"},addTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},removeTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},matchScore:2,suggestion:true},"amenity/bank/Banque Laurentienne":{name:"Banque Laurentienne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1360087"},addTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},removeTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},matchScore:2,suggestion:true},"amenity/bank/Banque Populaire":{name:"Banque Populaire",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883441"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},removeTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4857098"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},removeTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q245343"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},removeTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},matchScore:2,suggestion:true},"amenity/bank/Belfius":{name:"Belfius",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1956014"},addTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},removeTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},matchScore:2,suggestion:true},"amenity/bank/Bendigo Bank":{name:"Bendigo Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4887077"},addTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},removeTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},matchScore:2,suggestion:true},"amenity/bank/Berliner Volksbank":{name:"Berliner Volksbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q821855"},addTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},removeTags:{amenity:"bank",brand:"Berliner Volksbank","brand:wikidata":"Q821855","brand:wikipedia":"de:Berliner Volksbank",name:"Berliner Volksbank"},matchScore:2,suggestion:true},"amenity/bank/Bicentenario":{name:"Bicentenario",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5728123"},addTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},removeTags:{amenity:"bank",brand:"Bicentenario","brand:wikidata":"Q5728123","brand:wikipedia":"es:Bicentenario Banco Universal",name:"Bicentenario"},matchScore:2,suggestion:true},"amenity/bank/Bicici":{name:"Bicici",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1667302"},addTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},removeTags:{amenity:"bank",brand:"Bicici","brand:wikidata":"Q1667302","brand:wikipedia":"fr:Banque internationale pour le commerce et l'industrie de la Côte d'Ivoire",name:"Bicici"},matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806181"},addTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},removeTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},matchScore:2,suggestion:true},"amenity/bank/Budapest Bank":{name:"Budapest Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27493463"},addTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},removeTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},matchScore:2,suggestion:true},"amenity/bank/CBAO":{name:"CBAO",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q532104"},addTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},removeTags:{amenity:"bank",brand:"CBAO","brand:wikidata":"Q532104","brand:wikipedia":"fr:CBAO Groupe Attijariwafa bank",name:"CBAO"},matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1023306"},addTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},removeTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},matchScore:2,suggestion:true},"amenity/bank/CIB Bank":{name:"CIB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q839566"},addTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},removeTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIBC":{name:"CIBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q666694"},addTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},removeTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},matchScore:2,suggestion:true},"amenity/bank/CIC":{name:"CIC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q746525"},addTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},removeTags:{amenity:"bank",brand:"CIC","brand:wikidata":"Q746525","brand:wikipedia":"en:Crédit Industriel et Commercial",name:"CIC"},matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006220"},addTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},removeTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Bank":{name:"CIMB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3045976"},addTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},removeTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5011747"},addTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},removeTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},matchScore:2,suggestion:true},"amenity/bank/CNEP":{name:"CNEP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2931752"},addTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},removeTags:{amenity:"bank",brand:"CNEP","brand:wikidata":"Q2931752","brand:wikipedia":"fr:CNEP-Banque",name:"CNEP"},matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2933350"},addTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},removeTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},matchScore:2,suggestion:true},"amenity/bank/Caisse d'Épargne":{name:"Caisse d'Épargne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1547738"},addTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},removeTags:{amenity:"bank",brand:"Caisse d'Épargne","brand:wikidata":"Q1547738","brand:wikipedia":"en:Groupe Caisse d'Épargne",name:"Caisse d'Épargne"},matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal":{name:"Caixa Econômica Federal",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q835283"},addTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},removeTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},matchScore:2,suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{name:"Caixa Geral de Depósitos",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1026044"},addTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},removeTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},matchScore:2,suggestion:true},"amenity/bank/Caixabank":{name:"Caixabank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q847225"},addTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},removeTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},matchScore:2,suggestion:true},"amenity/bank/Caja España":{name:"Caja España",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q966985"},addTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},removeTags:{amenity:"bank",brand:"Caja España","brand:wikidata":"Q966985","brand:wikipedia":"es:Caja España",name:"Caja España"},matchScore:2,suggestion:true},"amenity/bank/Caja Rural":{name:"Caja Rural",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3649971"},addTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},removeTags:{amenity:"bank",brand:"Caja Rural","brand:wikidata":"Q3649971","brand:wikipedia":"es:Caja Rural",name:"Caja Rural"},matchScore:2,suggestion:true},"amenity/bank/Caja Rural de Jaén":{name:"Caja Rural de Jaén",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q18720350"},addTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},removeTags:{amenity:"bank",brand:"Caja Rural de Jaén","brand:wikidata":"Q18720350","brand:wikipedia":"es:Caja Rural de Jaén",name:"Caja Rural de Jaén"},matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3751637"},addTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},removeTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},matchScore:2,suggestion:true},"amenity/bank/Cajamar":{name:"Cajamar",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8254971"},addTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},removeTags:{amenity:"bank",brand:"Cajamar","brand:wikidata":"Q8254971","brand:wikipedia":"es:Cajamar",name:"Cajamar"},matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003777"},addTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},removeTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},matchScore:2,suggestion:true},"amenity/bank/Capital One":{name:"Capital One",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1034654"},addTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},removeTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},matchScore:2,suggestion:true},"amenity/bank/Carige":{name:"Carige",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633695"},addTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},removeTags:{amenity:"bank",brand:"Carige","brand:wikidata":"Q3633695","brand:wikipedia":"en:Banca Carige",name:"Carige"},matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2938832"},addTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},removeTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},matchScore:2,suggestion:true},"amenity/bank/Carisbo":{name:"Carisbo",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661937"},addTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},removeTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},matchScore:2,suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{name:"Cassa di Risparmio del Veneto",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661909"},addTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},removeTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},matchScore:2,suggestion:true},"amenity/bank/CatalunyaCaixa":{name:"CatalunyaCaixa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3750952"},addTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},removeTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},matchScore:2,suggestion:true},"amenity/bank/Central Bank of India":{name:"Central Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2007090"},addTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},removeTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Chase":{name:"Chase",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q524629"},addTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},removeTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},matchScore:2,suggestion:true},"amenity/bank/China Bank":{name:"China Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5100080"},addTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},removeTags:{amenity:"bank",brand:"China Bank","brand:wikidata":"Q5100080","brand:wikipedia":"en:Chinabank",name:"China Bank"},matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q18387359"},addTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},removeTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},matchScore:2,suggestion:true},"amenity/bank/China Construction Bank":{name:"China Construction Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},removeTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/Citibank":{name:"Citibank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q857063"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},removeTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},matchScore:2,suggestion:true},"amenity/bank/Citizens Bank":{name:"Citizens Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25209674"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},removeTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/Clydesdale Bank":{name:"Clydesdale Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q971680"},addTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikipedia":"en:Clydesdale Bank","brand:wikidata":"Q971680",name:"Clydesdale Bank"},removeTags:{amenity:"bank",brand:"Clydesdale Bank","brand:wikipedia":"en:Clydesdale Bank","brand:wikidata":"Q971680",name:"Clydesdale Bank"},matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1114148"},addTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},removeTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},matchScore:2,suggestion:true},"amenity/bank/Commercial Bank of Ceylon PLC":{name:"Commercial Bank of Ceylon PLC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5152468"},addTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},removeTags:{amenity:"bank",brand:"Commercial Bank of Ceylon PLC","brand:wikidata":"Q5152468","brand:wikipedia":"en:Commercial Bank of Ceylon",name:"Commercial Bank of Ceylon PLC"},matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q157617"},addTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},removeTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q285328"},addTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},removeTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},matchScore:2,suggestion:true},"amenity/bank/Corporation Bank":{name:"Corporation Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003387"},addTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},removeTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},matchScore:2,suggestion:true},"amenity/bank/Credem":{name:"Credem",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696881"},addTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},removeTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},matchScore:2,suggestion:true},"amenity/bank/Credicoop":{name:"Credicoop",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854086"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},removeTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q372657"},addTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},removeTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696888"},addTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},removeTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},matchScore:2,suggestion:true},"amenity/bank/Crelan":{name:"Crelan",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q389872"},addTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},removeTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},matchScore:2,suggestion:true},"amenity/bank/Crédit Agricole":{name:"Crédit Agricole",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q590952"},addTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},removeTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},matchScore:2,suggestion:true},"amenity/bank/Crédit Maritime":{name:"Crédit Maritime",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17176866"},addTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},removeTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel":{name:"Crédit Mutuel",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q642627"},addTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},removeTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel de Bretagne":{name:"Crédit Mutuel de Bretagne",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006236"},addTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},removeTags:{amenity:"bank",brand:"Crédit Mutuel de Bretagne","brand:wikidata":"Q3006236","brand:wikipedia":"fr:Crédit mutuel Arkéa",name:"Crédit Mutuel de Bretagne"},matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006209"},addTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},removeTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},matchScore:2,suggestion:true},"amenity/bank/Crédito Agrícola":{name:"Crédito Agrícola",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10262017"},addTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},removeTags:{amenity:"bank",brand:"Crédito Agrícola","brand:wikidata":"Q10262017","brand:wikipedia":"pt:Crédito Agrícola",name:"Crédito Agrícola"},matchScore:2,suggestion:true},"amenity/bank/Cбербанк":{name:"Cбербанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q205012"},addTags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},removeTags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1636974"},addTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},removeTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5242054"},addTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},removeTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},matchScore:2,suggestion:true},"amenity/bank/Denizbank":{name:"Denizbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1115064"},addTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},removeTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},matchScore:2,suggestion:true},"amenity/bank/Desjardins":{name:"Desjardins",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2933350"},addTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},removeTags:{amenity:"bank",brand:"Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Desjardins"},matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q66048"},addTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},removeTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},matchScore:2,suggestion:true},"amenity/bank/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5310570"},addTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},removeTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},matchScore:2,suggestion:true},"amenity/bank/EastWest Bank":{name:"EastWest Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5327595"},addTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},removeTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},matchScore:2,suggestion:true},"amenity/bank/EastWest Unibank":{name:"EastWest Unibank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5327595"},addTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},removeTags:{amenity:"bank",brand:"EastWest Unibank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Unibank"},matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q930225"},addTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},removeTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},matchScore:2,suggestion:true},"amenity/bank/Erste Bank":{name:"Erste Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696867"},addTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},removeTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},matchScore:2,suggestion:true},"amenity/bank/FNB":{name:"FNB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3072956"},addTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},removeTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5439099"},addTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},removeTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},matchScore:2,suggestion:true},"amenity/bank/Federal Bank":{name:"Federal Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2044983"},addTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},removeTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},matchScore:2,suggestion:true},"amenity/bank/Fifth Third Bank":{name:"Fifth Third Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1411810"},addTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},removeTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1416237"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},removeTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank":{name:"First Citizens Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5452734"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},removeTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/First National Bank":{name:"First National Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5426765"},addTags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"},removeTags:{amenity:"bank",brand:"First National Bank","brand:wikidata":"Q5426765","brand:wikipedia":"en:F.N.B. Corporation",name:"First National Bank"},matchScore:2,suggestion:true},"amenity/bank/Frost Bank":{name:"Frost Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5506152"},addTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},removeTags:{amenity:"bank",brand:"Frost Bank","brand:wikidata":"Q5506152","brand:wikipedia":"en:Frost Bank",name:"Frost Bank"},matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1521346"},addTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},removeTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},matchScore:2,suggestion:true},"amenity/bank/Galicia":{name:"Galicia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717952"},addTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},removeTags:{amenity:"bank",brand:"Galicia","brand:wikidata":"Q5717952","brand:wikipedia":"es:Banco Galicia",name:"Galicia"},matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},removeTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},matchScore:2,suggestion:true},"amenity/bank/Garanti Bankası":{name:"Garanti Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},removeTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},matchScore:2,suggestion:true},"amenity/bank/Getin Bank":{name:"Getin Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9267646"},addTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},removeTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},matchScore:2,suggestion:true},"amenity/bank/Great Western Bank":{name:"Great Western Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5600185"},addTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},removeTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},matchScore:2,suggestion:true},"amenity/bank/Groupama":{name:"Groupama",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3083531"},addTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},removeTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},matchScore:2,suggestion:true},"amenity/bank/HBL Bank":{name:"HBL Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1566843"},addTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},removeTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},matchScore:2,suggestion:true},"amenity/bank/HDFC Bank":{name:"HDFC Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q631047"},addTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},removeTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},matchScore:2,suggestion:true},"amenity/bank/HNB":{name:"HNB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3532080"},addTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},removeTags:{amenity:"bank",brand:"HNB","brand:wikidata":"Q3532080","brand:wikipedia":"en:Hatton National Bank",name:"HNB"},matchScore:2,suggestion:true},"amenity/bank/HSBC":{name:"HSBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q190464"},addTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},removeTags:{amenity:"bank",brand:"HSBC","brand:wikidata":"Q190464","brand:wikipedia":"en:HSBC",name:"HSBC"},matchScore:2,suggestion:true},"amenity/bank/Halifax":{name:"Halifax",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3310164"},addTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},removeTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3593818"},addTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},removeTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},matchScore:2,suggestion:true},"amenity/bank/Handelsbanken":{name:"Handelsbanken",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1421630"},addTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},removeTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5738690"},addTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},removeTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},matchScore:2,suggestion:true},"amenity/bank/Hong Leong Bank":{name:"Hong Leong Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4383943"},addTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},removeTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},matchScore:2,suggestion:true},"amenity/bank/Hrvatska poštanska banka":{name:"Hrvatska poštanska banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5923981"},addTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},removeTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},matchScore:2,suggestion:true},"amenity/bank/Huntington Bank":{name:"Huntington Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q798819"},addTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},removeTags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"},matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q220189"},addTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},removeTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},matchScore:2,suggestion:true},"amenity/bank/ICBC":{name:"ICBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},removeTags:{amenity:"bank",brand:"ICBC","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"ICBC"},matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1653258"},addTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},removeTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},matchScore:2,suggestion:true},"amenity/bank/IDBI Bank":{name:"IDBI Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633485"},addTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},removeTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},matchScore:2,suggestion:true},"amenity/bank/ING":{name:"ING",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q645708"},addTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},removeTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},matchScore:2,suggestion:true},"amenity/bank/ING Bank Śląski":{name:"ING Bank Śląski",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1410383"},addTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},removeTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},matchScore:2,suggestion:true},"amenity/bank/Ibercaja":{name:"Ibercaja",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5907815"},addTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},removeTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},matchScore:2,suggestion:true},"amenity/bank/Indian Bank":{name:"Indian Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003789"},addTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},removeTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003611"},addTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},removeTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2835558"},addTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},removeTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},matchScore:2,suggestion:true},"amenity/bank/Intesa Sanpaolo":{name:"Intesa Sanpaolo",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1343118"},addTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},removeTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},matchScore:2,suggestion:true},"amenity/bank/Itaú":{name:"Itaú",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2423252"},addTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},removeTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},matchScore:2,suggestion:true},"amenity/bank/JS Bank":{name:"JS Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6108986"},addTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},removeTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},matchScore:2,suggestion:true},"amenity/bank/Janata Bank Limited জনতা ব্যাংক লিমিটেড":{name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3347028"},addTags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"},removeTags:{amenity:"bank",brand:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"Janata Bank Limited জনতা ব্যাংক লিমিটেড"},matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q136672"},addTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},removeTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},matchScore:2,suggestion:true},"amenity/bank/K&H Bank":{name:"K&H Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6393834"},addTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},removeTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},matchScore:2,suggestion:true},"amenity/bank/KBC":{name:"KBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q941020"},addTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},removeTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},matchScore:2,suggestion:true},"amenity/bank/KBZ Bank":{name:"KBZ Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6360949"},addTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},removeTags:{amenity:"bank",brand:"KBZ Bank","brand:wikidata":"Q6360949","brand:wikipedia":"en:Kanbawza Bank",name:"KBZ Bank"},matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2042632"},addTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},removeTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},matchScore:2,suggestion:true},"amenity/bank/Kasa Stefczyka":{name:"Kasa Stefczyka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q57624461"},addTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},removeTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},matchScore:2,suggestion:true},"amenity/bank/Key Bank":{name:"Key Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1740314"},addTags:{amenity:"bank",brand:"Key Bank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"Key Bank"},removeTags:{amenity:"bank",brand:"Key Bank","brand:wikidata":"Q1740314","brand:wikipedia":"en:KeyBank",name:"Key Bank"},matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1541079"},addTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},removeTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},matchScore:2,suggestion:true},"amenity/bank/Kotak Mahindra Bank":{name:"Kotak Mahindra Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2040404"},addTags:{amenity:"bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"},removeTags:{amenity:"bank","brand:wikidata":"Q2040404","brand:wikipedia":"en:Kotak Mahindra Bank",name:"Kotak Mahindra Bank"},matchScore:2,suggestion:true},"amenity/bank/Kreissparkasse":{name:"Kreissparkasse",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},removeTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},matchScore:2,suggestion:true},"amenity/bank/Kutxabank":{name:"Kutxabank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5139377"},addTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},removeTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},matchScore:2,suggestion:true},"amenity/bank/LCL":{name:"LCL",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q779722"},addTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},removeTags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"},matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3206431"},addTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},removeTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},matchScore:2,suggestion:true},"amenity/bank/La Caixa":{name:"La Caixa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287753"},addTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},removeTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},matchScore:2,suggestion:true},"amenity/bank/Laboral Kutxa":{name:"Laboral Kutxa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12052386"},addTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},removeTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},matchScore:2,suggestion:true},"amenity/bank/Landbank":{name:"Landbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6483872"},addTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},removeTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},matchScore:2,suggestion:true},"amenity/bank/Liberbank":{name:"Liberbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2891018"},addTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},removeTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},matchScore:2,suggestion:true},"amenity/bank/Lloyds Bank":{name:"Lloyds Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1152847"},addTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},removeTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},matchScore:2,suggestion:true},"amenity/bank/M&T Bank":{name:"M&T Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3272257"},addTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},removeTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},matchScore:2,suggestion:true},"amenity/bank/MCB":{name:"MCB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15982510"},addTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},removeTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},matchScore:2,suggestion:true},"amenity/bank/MONETA Money Bank":{name:"MONETA Money Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q24282966"},addTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},removeTags:{amenity:"bank",brand:"MONETA Money Bank","brand:wikidata":"Q24282966","brand:wikipedia":"cs:Moneta Money Bank",name:"MONETA Money Bank"},matchScore:2,suggestion:true},"amenity/bank/Macro":{name:"Macro",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2335199"},addTags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"},removeTags:{amenity:"bank",brand:"Macro","brand:wikidata":"Q2335199","brand:wikipedia":"en:Banco Macro",name:"Macro"},matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1364018"},addTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},removeTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},matchScore:2,suggestion:true},"amenity/bank/Meezan Bank":{name:"Meezan Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6807934"},addTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},removeTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},matchScore:2,suggestion:true},"amenity/bank/Mercantil":{name:"Mercantil",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6818004"},addTags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"},removeTags:{amenity:"bank",brand:"Mercantil","brand:wikidata":"Q6818004","brand:wikipedia":"en:Mercantil Servicios Financieros",name:"Mercantil"},matchScore:2,suggestion:true},"amenity/bank/Mibanco":{name:"Mibanco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5558589"},addTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},removeTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},matchScore:2,suggestion:true},"amenity/bank/Millennium Bank":{name:"Millennium Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855947"},addTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},removeTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},matchScore:2,suggestion:true},"amenity/bank/Millennium bcp":{name:"Millennium bcp",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},removeTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},matchScore:2,suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q46730"},addTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},removeTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},matchScore:2,suggestion:true},"amenity/bank/Montepio":{name:"Montepio",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1946091"},addTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},removeTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1430985"},addTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},removeTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},matchScore:2,suggestion:true},"amenity/bank/NatWest":{name:"NatWest",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2740021"},addTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},removeTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},matchScore:2,suggestion:true},"amenity/bank/Nationwide":{name:"Nationwide",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q846735"},addTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},removeTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},matchScore:2,suggestion:true},"amenity/bank/Navy Federal Credit Union":{name:"Navy Federal Credit Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6982632"},addTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},removeTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},matchScore:2,suggestion:true},"amenity/bank/Nedbank":{name:"Nedbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2751701"},addTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},removeTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},matchScore:2,suggestion:true},"amenity/bank/Nordea":{name:"Nordea",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1123823"},addTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},removeTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},matchScore:2,suggestion:true},"amenity/bank/Novo Banco":{name:"Novo Banco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17488861"},addTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},removeTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},matchScore:2,suggestion:true},"amenity/bank/OLB":{name:"OLB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q879591"},addTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},removeTags:{amenity:"bank",brand:"OLB","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"OLB"},matchScore:2,suggestion:true},"amenity/bank/OTP":{name:"OTP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q912778"},addTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},removeTags:{amenity:"bank",brand:"OTP","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"OTP"},matchScore:2,suggestion:true},"amenity/bank/Oberbank":{name:"Oberbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2009139"},addTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},removeTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},matchScore:2,suggestion:true},"amenity/bank/Occidental de Descuento":{name:"Occidental de Descuento",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854108"},addTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},removeTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q879591"},addTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},removeTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},matchScore:2,suggestion:true},"amenity/bank/One Network Bank":{name:"One Network Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7093019"},addTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},removeTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q367008"},addTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},removeTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/PBZ":{name:"PBZ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7246343"},addTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},removeTags:{amenity:"bank",brand:"PBZ","brand:wikidata":"Q7246343","brand:wikipedia":"en:Privredna banka Zagreb",name:"PBZ"},matchScore:2,suggestion:true},"amenity/bank/PKO BP":{name:"PKO BP",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q578832"},addTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"en:PKO Bank Polski",name:"PKO BP"},removeTags:{amenity:"bank",brand:"PKO BP","brand:wikidata":"Q578832","brand:wikipedia":"en:PKO Bank Polski",name:"PKO BP"},matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q38928"},addTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},removeTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},matchScore:2,suggestion:true},"amenity/bank/PSBank":{name:"PSBank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7185203"},addTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},removeTags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"},matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12502751"},addTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},removeTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882078"},addTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},removeTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},matchScore:2,suggestion:true},"amenity/bank/Pekao SA":{name:"Pekao SA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806642"},addTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},removeTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},matchScore:2,suggestion:true},"amenity/bank/People's United Bank":{name:"People's United Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7165802"},addTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},removeTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},matchScore:2,suggestion:true},"amenity/bank/Peoples Bank":{name:"Peoples Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7166050"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},removeTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},matchScore:2,suggestion:true},"amenity/bank/Philippine National Bank":{name:"Philippine National Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1657971"},addTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},removeTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Postbank":{name:"Postbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q708835"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},removeTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},matchScore:2,suggestion:true},"amenity/bank/Prima banka":{name:"Prima banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q13538661"},addTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},removeTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},matchScore:2,suggestion:true},"amenity/bank/Punjab National Bank":{name:"Punjab National Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2743499"},addTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},removeTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},matchScore:2,suggestion:true},"amenity/bank/RBC":{name:"RBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q735261"},addTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},removeTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160126"},addTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},removeTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7339070"},addTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},removeTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},matchScore:2,suggestion:true},"amenity/bank/Rabobank":{name:"Rabobank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q252004"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},removeTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9303218"},addTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},removeTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q917131"},addTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},removeTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},matchScore:2,suggestion:true},"amenity/bank/SEB":{name:"SEB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q975655"},addTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},removeTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},matchScore:2,suggestion:true},"amenity/bank/SGBCI":{name:"SGBCI",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3488360"},addTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},removeTags:{amenity:"bank",brand:"SGBCI","brand:wikidata":"Q3488360","brand:wikipedia":"fr:Société générale de banques en Côte d'Ivoire",name:"SGBCI"},matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1857899"},addTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},removeTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},matchScore:2,suggestion:true},"amenity/bank/Sampath Bank":{name:"Sampath Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7410095"},addTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},removeTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},matchScore:2,suggestion:true},"amenity/bank/Santander":{name:"Santander",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5835668"},addTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},removeTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},matchScore:2,suggestion:true},"amenity/bank/Santander Río":{name:"Santander Río",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3385268"},addTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},removeTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},matchScore:2,suggestion:true},"amenity/bank/Santander Totta":{name:"Santander Totta",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854116"},addTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},removeTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},matchScore:2,suggestion:true},"amenity/bank/Sberbank":{name:"Sberbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q205012"},addTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},removeTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},matchScore:2,suggestion:true},"amenity/bank/Scotiabank":{name:"Scotiabank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q451476"},addTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},removeTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},matchScore:2,suggestion:true},"amenity/bank/Security Bank":{name:"Security Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7444945"},addTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},removeTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3532083"},addTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},removeTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},matchScore:2,suggestion:true},"amenity/bank/Siam Commercial Bank":{name:"Siam Commercial Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2038986"},addTags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"},removeTags:{amenity:"bank",brand:"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"Siam Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q28679754"},addTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},removeTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},matchScore:2,suggestion:true},"amenity/bank/Sicredi":{name:"Sicredi",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3483060"},addTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},removeTags:{amenity:"bank",brand:"Sicredi","brand:wikidata":"Q3483060","brand:wikipedia":"pt:Sistema de Crédito Cooperativo",name:"Sicredi"},matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7541907"},addTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},removeTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},matchScore:2,suggestion:true},"amenity/bank/Société Générale":{name:"Société Générale",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q270363"},addTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},removeTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},matchScore:2,suggestion:true},"amenity/bank/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3350382"},addTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},removeTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},matchScore:2,suggestion:true},"amenity/bank/South Indian Bank":{name:"South Indian Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2044973"},addTags:{amenity:"bank",brand:"South Indian Bank","brand:wikipedia":"en:South Indian Bank","brand:wikidata":"Q2044973",name:"South Indian Bank"},removeTags:{amenity:"bank",brand:"South Indian Bank","brand:wikipedia":"en:South Indian Bank","brand:wikidata":"Q2044973",name:"South Indian Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparda-Bank":{name:"Sparda-Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2307136"},addTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},removeTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparkasse":{name:"Sparkasse",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},removeTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7597999"},addTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},removeTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Bank":{name:"Standard Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1576610"},addTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},removeTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Chartered":{name:"Standard Chartered",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q548278"},addTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},removeTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},matchScore:2,suggestion:true},"amenity/bank/State Bank of India":{name:"State Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1340361"},addTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},removeTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Summit Bank":{name:"Summit Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7637775"},addTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},removeTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q181507"},addTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},removeTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},matchScore:2,suggestion:true},"amenity/bank/Supervielle":{name:"Supervielle",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5718035"},addTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},removeTags:{amenity:"bank",brand:"Supervielle","brand:wikidata":"Q5718035","brand:wikipedia":"es:Banco Supervielle",name:"Supervielle"},matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1145493"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},removeTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004088"},addTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},removeTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669687"},addTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},removeTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669891"},addTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},removeTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1080670"},addTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},removeTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},matchScore:2,suggestion:true},"amenity/bank/TEB":{name:"TEB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7862447"},addTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},removeTags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"},matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7671560"},addTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},removeTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1455437"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},removeTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1718069"},addTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},removeTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},removeTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/UBA":{name:"UBA",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q513457"},addTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},removeTags:{amenity:"bank",brand:"UBA","brand:wikidata":"Q513457","brand:wikipedia":"en:United Bank for Africa",name:"UBA"},matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1476162"},addTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},removeTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887504"},addTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},removeTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},matchScore:2,suggestion:true},"amenity/bank/UBS":{name:"UBS",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q193199"},addTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},removeTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},matchScore:2,suggestion:true},"amenity/bank/UCO Bank":{name:"UCO Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2005310"},addTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},removeTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},matchScore:2,suggestion:true},"amenity/bank/UCPB":{name:"UCPB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887615"},addTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},removeTags:{amenity:"bank",brand:"UCPB","brand:wikidata":"Q7887615","brand:wikipedia":"en:United Coconut Planters Bank",name:"UCPB"},matchScore:2,suggestion:true},"amenity/bank/UOB":{name:"UOB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2064074"},addTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},removeTags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"},matchScore:2,suggestion:true},"amenity/bank/US Bank":{name:"US Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q739084"},addTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},removeTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},matchScore:2,suggestion:true},"amenity/bank/Ulster Bank":{name:"Ulster Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2613366"},addTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},removeTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7881772"},addTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},removeTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},matchScore:2,suggestion:true},"amenity/bank/UniCredit Bank":{name:"UniCredit Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q45568"},addTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},removeTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},matchScore:2,suggestion:true},"amenity/bank/Unicaja Banco":{name:"Unicaja Banco",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2543704"},addTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},removeTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},matchScore:2,suggestion:true},"amenity/bank/Union Bank of India":{name:"Union Bank of India",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004078"},addTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},removeTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},matchScore:2,suggestion:true},"amenity/bank/UnionBank (Philippines)":{name:"UnionBank (Philippines)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7885403"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},removeTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q7885403","brand:wikipedia":"en:Union Bank of the Philippines",name:"UnionBank"},matchScore:2,suggestion:true},"amenity/bank/UnionBank (USA)":{name:"UnionBank (USA)",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1442804"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},removeTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},matchScore:2,suggestion:true},"amenity/bank/Vakıfbank":{name:"Vakıfbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1148521"},addTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},removeTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},matchScore:2,suggestion:true},"amenity/bank/Veneto Banca":{name:"Veneto Banca",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127221"},addTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},removeTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},matchScore:2,suggestion:true},"amenity/bank/Vijaya Bank":{name:"Vijaya Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003171"},addTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},removeTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},matchScore:2,suggestion:true},"amenity/bank/Volksbank":{name:"Volksbank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q695110"},addTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},removeTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},matchScore:2,suggestion:true},"amenity/bank/Volksbank Köln Bonn eG":{name:"Volksbank Köln Bonn eG",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q41680844"},addTags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank"},removeTags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank"},matchScore:2,suggestion:true},"amenity/bank/VÚB":{name:"VÚB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12778981"},addTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},removeTags:{amenity:"bank",brand:"VÚB","brand:wikidata":"Q12778981","brand:wikipedia":"en:Všeobecná úverová banka",name:"VÚB"},matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7971859"},addTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},removeTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},matchScore:2,suggestion:true},"amenity/bank/Wells Fargo":{name:"Wells Fargo",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q744149"},addTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},removeTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},matchScore:2,suggestion:true},"amenity/bank/Western Union":{name:"Western Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q861042"},addTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/bank/Westpac":{name:"Westpac",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2031726"},addTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},removeTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},matchScore:2,suggestion:true},"amenity/bank/Yapı Kredi":{name:"Yapı Kredi",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8049138"},addTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},removeTags:{amenity:"bank",brand:"Yapı Kredi","brand:wikidata":"Q8049138","brand:wikipedia":"en:Yapı ve Kredi Bankası",name:"Yapı Kredi"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8055678"},addTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},removeTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Building Society":{name:"Yorkshire Building Society",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12073381"},addTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},removeTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},matchScore:2,suggestion:true},"amenity/bank/Zagrebačka banka":{name:"Zagrebačka banka",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q140381"},addTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},removeTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},matchScore:2,suggestion:true},"amenity/bank/Zenith Bank":{name:"Zenith Bank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5978240"},addTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},removeTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},matchScore:2,suggestion:true},"amenity/bank/Ziraat Bankası":{name:"Ziraat Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696003"},addTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},removeTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},matchScore:2,suggestion:true},"amenity/bank/mBank":{name:"mBank",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1160928"},addTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},removeTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},matchScore:2,suggestion:true},"amenity/bank/ČSOB":{name:"ČSOB",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q340135"},addTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},removeTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q341100"},addTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},removeTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},matchScore:2,suggestion:true},"amenity/bank/İş Bankası":{name:"İş Bankası",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},removeTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/Εθνική Τράπεζα":{name:"Εθνική Τράπεζα",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1816028"},addTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},removeTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},matchScore:2,suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{name:"Τράπεζα Πειραιώς",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Альфа-Банк":{name:"Альфа-Банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1377835"},addTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},removeTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},matchScore:2,suggestion:true},"amenity/bank/Банка ДСК":{name:"Банка ДСК",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5206146"},addTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},removeTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},matchScore:2,suggestion:true},"amenity/bank/Белагропромбанк":{name:"Белагропромбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1991373"},addTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},removeTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},matchScore:2,suggestion:true},"amenity/bank/Беларусбанк":{name:"Беларусбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1997334"},addTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},removeTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},matchScore:2,suggestion:true},"amenity/bank/Белинвестбанк":{name:"Белинвестбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4081940"},addTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},removeTags:{amenity:"bank",brand:"Белинвестбанк","brand:wikidata":"Q4081940","brand:wikipedia":"ru:Белинвестбанк",name:"Белинвестбанк"},matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4086829"},addTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},removeTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},matchScore:2,suggestion:true},"amenity/bank/ВТБ":{name:"ВТБ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1549389"},addTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},removeTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},matchScore:2,suggestion:true},"amenity/bank/Возрождение":{name:"Возрождение",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4114952"},addTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"en:Возрождение (банк)",name:"Возрождение"},removeTags:{amenity:"bank",brand:"Возрождение","brand:wikidata":"Q4114952","brand:wikipedia":"en:Возрождение (банк)",name:"Возрождение"},matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1924338"},addTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},removeTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},matchScore:2,suggestion:true},"amenity/bank/Казкоммерцбанк":{name:"Казкоммерцбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1168179"},addTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},removeTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},matchScore:2,suggestion:true},"amenity/bank/Московский индустриальный банк":{name:"Московский индустриальный банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304145"},addTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},removeTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},matchScore:2,suggestion:true},"amenity/bank/Мособлбанк":{name:"Мособлбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304446"},addTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},removeTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},matchScore:2,suggestion:true},"amenity/bank/ОТП Банк":{name:"ОТП Банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q912778"},addTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},removeTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},matchScore:2,suggestion:true},"amenity/bank/Обединена Българска Банка":{name:"Обединена Българска Банка",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887555"},addTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},removeTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},matchScore:2,suggestion:true},"amenity/bank/Ощадбанк":{name:"Ощадбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4340839"},addTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},removeTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},matchScore:2,suggestion:true},"amenity/bank/ПУМБ":{name:"ПУМБ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4341156"},addTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},removeTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},matchScore:2,suggestion:true},"amenity/bank/Почта Банк":{name:"Почта Банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q24930461"},addTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},removeTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},matchScore:2,suggestion:true},"amenity/bank/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1515015"},addTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},removeTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},matchScore:2,suggestion:true},"amenity/bank/Приорбанк":{name:"Приорбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3919658"},addTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},removeTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},matchScore:2,suggestion:true},"amenity/bank/Промсвязьбанк":{name:"Промсвязьбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q649100"},addTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},removeTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},matchScore:2,suggestion:true},"amenity/bank/РНКБ":{name:"РНКБ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16912944"},addTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},removeTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389244"},addTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},removeTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{name:"Райффайзен Банк Аваль",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389243"},addTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},removeTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},matchScore:2,suggestion:true},"amenity/bank/Росбанк":{name:"Росбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1119857"},addTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},removeTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3920226"},addTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},removeTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4400854"},addTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},removeTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Сбербанк":{name:"Сбербанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4378147"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},removeTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4426566"},addTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},removeTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},matchScore:2,suggestion:true},"amenity/bank/УкрСиббанк":{name:"УкрСиббанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1976290"},addTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},removeTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},matchScore:2,suggestion:true},"amenity/bank/Укргазбанк":{name:"Укргазбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4470692"},addTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},removeTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},matchScore:2,suggestion:true},"amenity/bank/Укрсоцбанк":{name:"Укрсоцбанк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3547885"},addTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},removeTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},matchScore:2,suggestion:true},"amenity/bank/Уралсиб":{name:"Уралсиб",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4476693"},addTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},removeTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},matchScore:2,suggestion:true},"amenity/bank/Хаан банк":{name:"Хаан банк",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25632240"},addTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},removeTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},matchScore:2,suggestion:true},"amenity/bank/Хоум Кредит":{name:"Хоум Кредит",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4500466"},addTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},removeTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2666775"},addTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},removeTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},matchScore:2,suggestion:true},"amenity/bank/בנק לאומי":{name:"בנק לאומי",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806641"},addTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},removeTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},matchScore:2,suggestion:true},"amenity/bank/بانک آینده":{name:"بانک آینده",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5938144"},addTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},removeTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک اقتصاد نوین":{name:"بانک اقتصاد نوین",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5323768"},addTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},removeTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک ایران زمین":{name:"بانک ایران زمین",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5934423"},addTags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"},removeTags:{amenity:"bank",brand:"بانک ایران زمین","brand:wikidata":"Q5934423","brand:wikipedia":"en:Iran Zamin Bank",name:"بانک ایران زمین"},matchScore:2,suggestion:true},"amenity/bank/بانک رفاه":{name:"بانک رفاه",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7307083"},addTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},removeTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سامان":{name:"بانک سامان",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4117676"},addTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},removeTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سرمایه":{name:"بانک سرمایه",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7424291"},addTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},removeTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سپه":{name:"بانک سپه",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882624"},addTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},removeTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},matchScore:2,suggestion:true},"amenity/bank/بانک سینا":{name:"بانک سینا",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860246"},addTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},removeTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک شهر":{name:"بانک شهر",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5941033"},addTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},removeTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک صادرات":{name:"بانک صادرات",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882608"},addTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},removeTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک قوامین":{name:"بانک قوامین",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860253"},addTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},removeTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک مسکن":{name:"بانک مسکن",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855942"},addTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},removeTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},matchScore:2,suggestion:true},"amenity/bank/بانک ملت":{name:"بانک ملت",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855944"},addTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},removeTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},matchScore:2,suggestion:true},"amenity/bank/بانک ملی ایران":{name:"بانک ملی ایران",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806640"},addTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},removeTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک پارسیان":{name:"بانک پارسیان",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2410404"},addTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},removeTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک پاسارگاد":{name:"بانک پاسارگاد",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855962"},addTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},removeTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},matchScore:2,suggestion:true},"amenity/bank/بانک کشاورزی":{name:"بانک کشاورزی",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6395007"},addTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},removeTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},matchScore:2,suggestion:true},"amenity/bank/پست بانک":{name:"پست بانک",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7233625"},addTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},removeTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{name:"ธนาคารกรุงเทพ",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{name:"ธนาคารกรุงไทย",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q962865"},addTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{name:"ธนาคารกสิกรไทย",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q276557"},addTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},removeTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารออมสิน":{name:"ธนาคารออมสิน",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6579041"},addTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},removeTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2038986"},addTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},removeTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/みずほ銀行":{name:"みずほ銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882956"},addTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},removeTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},matchScore:2,suggestion:true},"amenity/bank/りそな銀行":{name:"りそな銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11281447"},addTags:{amenity:"bank",brand:"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行"},removeTags:{amenity:"bank",brand:"りそな銀行","brand:wikidata":"Q11281447","brand:wikipedia":"ja:りそな銀行",name:"りそな銀行"},matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2660418"},addTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},removeTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},matchScore:2,suggestion:true},"amenity/bank/三菱東京UFJ銀行":{name:"三菱東京UFJ銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q988284"},addTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},removeTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},matchScore:2,suggestion:true},"amenity/bank/上海商業儲蓄銀行":{name:"上海商業儲蓄銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4207208"},addTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},removeTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/中信银行":{name:"中信银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q38960"},addTags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"},removeTags:{amenity:"bank",brand:"中信银行","brand:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"},matchScore:2,suggestion:true},"amenity/bank/中国农业银行":{name:"中国农业银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26298"},addTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},removeTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国工商银行":{name:"中国工商银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国建设银行":{name:"中国建设银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},removeTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/中国邮政储蓄银行":{name:"中国邮政储蓄银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q986744"},addTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},removeTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},removeTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中國信託商業銀行":{name:"中國信託商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5100191"},addTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},removeTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},matchScore:2,suggestion:true},"amenity/bank/交通银行":{name:"交通银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806680"},addTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},removeTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},matchScore:2,suggestion:true},"amenity/bank/京城商業銀行":{name:"京城商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10883132"},addTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},removeTags:{amenity:"bank",brand:"京城商業銀行","brand:wikidata":"Q10883132","brand:wikipedia":"zh:京城商業銀行",name:"京城商業銀行"},matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11374844"},addTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},removeTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},matchScore:2,suggestion:true},"amenity/bank/京都銀行":{name:"京都銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11375713"},addTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},removeTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},matchScore:2,suggestion:true},"amenity/bank/元大商業銀行":{name:"元大商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10889602"},addTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},removeTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/兆豐國際商業銀行":{name:"兆豐國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q709757"},addTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},removeTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/农业银行":{name:"农业银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26298"},addTags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"},removeTags:{amenity:"bank",brand:"农业银行","brand:wikidata":"Q26298","brand:wikipedia":"zh:中国农业银行",name:"农业银行"},matchScore:2,suggestion:true},"amenity/bank/北洋銀行":{name:"北洋銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11402354"},addTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},removeTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},matchScore:2,suggestion:true},"amenity/bank/北海道銀行":{name:"北海道銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5878076"},addTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},removeTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},matchScore:2,suggestion:true},"amenity/bank/台中商業銀行":{name:"台中商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6136958"},addTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},removeTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},matchScore:2,suggestion:true},"amenity/bank/台北富邦商業銀行":{name:"台北富邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697293"},addTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},removeTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},matchScore:2,suggestion:true},"amenity/bank/台新國際商業銀行":{name:"台新國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7676420"},addTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},removeTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},matchScore:2,suggestion:true},"amenity/bank/合作金庫商業銀行":{name:"合作金庫商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q701540"},addTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},removeTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},matchScore:2,suggestion:true},"amenity/bank/國泰世華商業銀行":{name:"國泰世華商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q702656"},addTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},removeTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},matchScore:2,suggestion:true},"amenity/bank/大眾商業銀行":{name:"大眾商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10937047"},addTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},removeTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/安泰商業銀行":{name:"安泰商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10946952"},addTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},removeTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/工商银行":{name:"工商银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/建设银行":{name:"建设银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"},removeTags:{amenity:"bank",brand:"建设银行","brand:wikidata":"Q26299","brand:wikipedia":"zh:中国建设银行",name:"建设银行"},matchScore:2,suggestion:true},"amenity/bank/彰化商業銀行":{name:"彰化商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5071627"},addTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},removeTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},matchScore:2,suggestion:true},"amenity/bank/招商银行":{name:"招商银行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1073327"},addTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},removeTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},matchScore:2,suggestion:true},"amenity/bank/板信商業銀行":{name:"板信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11104946"},addTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},removeTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},matchScore:2,suggestion:true},"amenity/bank/横浜銀行":{name:"横浜銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2744340"},addTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},removeTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},matchScore:2,suggestion:true},"amenity/bank/永豐商業銀行":{name:"永豐商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855976"},addTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},removeTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},matchScore:2,suggestion:true},"amenity/bank/玉山商業銀行":{name:"玉山商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5321663"},addTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},removeTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/第一商業銀行":{name:"第一商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11602128"},addTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},removeTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/聯邦商業銀行":{name:"聯邦商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15927195"},addTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},removeTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣中小企業銀行":{name:"臺灣中小企業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15913812"},addTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},removeTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣土地銀行":{name:"臺灣土地銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q717592"},addTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣新光商業銀行":{name:"臺灣新光商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15909616"},addTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},removeTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣銀行":{name:"臺灣銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q706533"},addTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/華南商業銀行":{name:"華南商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11620043"},addTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},removeTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/遠東國際商業銀行":{name:"遠東國際商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15911143"},addTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},removeTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},matchScore:2,suggestion:true},"amenity/bank/陽信商業銀行":{name:"陽信商業銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11658759"},addTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},removeTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/静岡銀行":{name:"静岡銀行",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7499501"},addTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},removeTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},matchScore:2,suggestion:true},"amenity/bank/국민은행":{name:"국민은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q496606"},addTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},removeTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},matchScore:2,suggestion:true},"amenity/bank/기업은행":{name:"기업은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q483855"},addTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},removeTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},matchScore:2,suggestion:true},"amenity/bank/신한은행":{name:"신한은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487230"},addTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},removeTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},matchScore:2,suggestion:true},"amenity/bank/우리은행":{name:"우리은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q494369"},addTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},removeTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},matchScore:2,suggestion:true},"amenity/bank/하나은행":{name:"하나은행",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q484047"},addTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},removeTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},matchScore:2,suggestion:true},"amenity/bicycle_rental/Call a Bike":{name:"Call a Bike",icon:"maki-bicycle",geometry:["point","vertex","area"],tags:{amenity:"bicycle_rental","brand:wikidata":"Q1060525"},addTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},removeTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},matchScore:2,suggestion:true},"amenity/bureau_de_change/Travelex":{name:"Travelex",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"bureau_de_change","brand:wikidata":"Q2337964"},addTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},removeTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},matchScore:2,suggestion:true},"amenity/cafe/85度C":{name:"85度C",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q4644852"},addTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},removeTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},matchScore:2,suggestion:true},"amenity/cafe/Barista":{name:"Barista",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q644735"},addTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},removeTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},matchScore:2,suggestion:true},"amenity/cafe/Cafe Coffee Day":{name:"Cafe Coffee Day",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5017235"},addTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},removeTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},matchScore:2,suggestion:true},"amenity/cafe/Caffè Nero":{name:"Caffè Nero",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q675808"},addTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},removeTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},matchScore:2,suggestion:true},"amenity/cafe/Café Amazon":{name:"Café Amazon",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},removeTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/Café Martínez":{name:"Café Martínez",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q16540032"},addTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",name:"Café Martínez"},removeTags:{amenity:"cafe",brand:"Café Martínez","brand:wikidata":"Q16540032","brand:wikipedia":"es:Café Martínez",name:"Café Martínez"},matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5039494"},addTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},removeTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Chatime":{name:"Chatime",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q16829306"},addTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},removeTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Fellows":{name:"Coffee Fellows",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q23461429"},addTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},removeTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},matchScore:2,suggestion:true},"amenity/cafe/Coffee House":{name:"Coffee House",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11855430"},addTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},removeTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Island":{name:"Coffee Island",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q60867333"},addTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",name:"Coffee Island"},removeTags:{amenity:"cafe",brand:"Coffee Island","brand:wikidata":"Q60867333","brand:wikipedia":"en:Coffee Island",name:"Coffee Island"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5140932"},addTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},removeTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},matchScore:2,suggestion:true},"amenity/cafe/Costa":{name:"Costa",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q608845"},addTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},removeTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},matchScore:2,suggestion:true},"amenity/cafe/Country Style":{name:"Country Style",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5177435"},addTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},removeTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},matchScore:2,suggestion:true},"amenity/cafe/Dutch Bros. Coffee":{name:"Dutch Bros. Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5317253"},addTags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee"},removeTags:{amenity:"cafe",brand:"Dutch Bros. Coffee","brand:wikidata":"Q5317253","brand:wikipedia":"en:Dutch Bros. Coffee",cuisine:"coffee_shop",name:"Dutch Bros. Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Espresso House":{name:"Espresso House",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q10489162"},addTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},removeTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},matchScore:2,suggestion:true},"amenity/cafe/Havanna":{name:"Havanna",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2900869"},addTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},removeTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},matchScore:2,suggestion:true},"amenity/cafe/Insomnia":{name:"Insomnia",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q6038271"},addTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",name:"Insomnia"},removeTags:{amenity:"cafe",brand:"Insomnia","brand:wikidata":"Q6038271","brand:wikipedia":"en:Insomnia Coffee Company",name:"Insomnia"},matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q26221514"},addTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},removeTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},matchScore:2,suggestion:true},"amenity/cafe/Le Pain Quotidien":{name:"Le Pain Quotidien",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2046903"},addTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},removeTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},matchScore:2,suggestion:true},"amenity/cafe/Mado":{name:"Mado",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q17116336"},addTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",name:"Mado"},removeTags:{amenity:"cafe",brand:"Mado","brand:wikidata":"Q17116336","brand:wikipedia":"en:Mado (food company)",name:"Mado"},matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3114287"},addTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé","operator:wikidata":"Q38076","operator:wikipedia":"en:McDonald's"},removeTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé","operator:wikidata":"Q38076","operator:wikipedia":"en:McDonald's"},matchScore:2,suggestion:true},"amenity/cafe/Patisserie Valerie":{name:"Patisserie Valerie",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q22101966"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"cake",name:"Patisserie Valerie"},removeTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",cuisine:"cake",name:"Patisserie Valerie"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1094101"},addTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},removeTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Pret A Manger":{name:"Pret A Manger",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2109109"},addTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},removeTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},matchScore:2,suggestion:true},"amenity/cafe/Pumpkin":{name:"Pumpkin",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q27825961"},addTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",name:"Pumpkin"},removeTags:{amenity:"cafe",brand:"Pumpkin","brand:wikidata":"Q27825961","brand:wikipedia":"en:Pumpkin Café Shop",name:"Pumpkin"},matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q862180"},addTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},removeTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},matchScore:2,suggestion:true},"amenity/cafe/Segafredo":{name:"Segafredo",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q21282762"},addTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},removeTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},matchScore:2,suggestion:true},"amenity/cafe/Starbucks":{name:"Starbucks",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},removeTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1141384"},addTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},removeTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Club":{name:"The Coffee Club",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q7726599"},addTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},removeTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},matchScore:2,suggestion:true},"amenity/cafe/Tim Hortons":{name:"Tim Hortons",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q175106"},addTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},removeTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},matchScore:2,suggestion:true},"amenity/cafe/Traveler's Coffee":{name:"Traveler's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q4051716"},addTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",name:"Traveler's Coffee"},removeTags:{amenity:"cafe",brand:"Traveler's Coffee","brand:wikidata":"Q4051716","brand:wikipedia":"ru:Traveler’s Coffee",name:"Traveler's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2637272"},addTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},removeTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Wild Bean Cafe":{name:"Wild Bean Cafe",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q61804826"},addTags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",name:"Wild Bean Cafe"},removeTags:{amenity:"cafe",brand:"Wild Bean Cafe","brand:wikidata":"Q61804826",name:"Wild Bean Cafe"},matchScore:2,suggestion:true},"amenity/cafe/Старбакс":{name:"Старбакс",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/Шоколадница":{name:"Шоколадница",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q30891188"},addTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},removeTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},matchScore:2,suggestion:true},"amenity/cafe/ארומה":{name:"ארומה",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2909872"},addTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},removeTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},matchScore:2,suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{name:"คาเฟ่ อเมซอน",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},removeTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/エクセルシオール カフェ":{name:"エクセルシオール カフェ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11289828"},addTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},removeTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{name:"カフェ・ド・クリエ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q17219077"},addTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},removeTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ベローチェ":{name:"カフェ・ベローチェ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11294597"},addTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},removeTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},matchScore:2,suggestion:true},"amenity/cafe/コメダ珈琲店":{name:"コメダ珈琲店",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11302679"},addTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},removeTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/サンマルクカフェ":{name:"サンマルクカフェ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11305989"},addTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},removeTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},matchScore:2,suggestion:true},"amenity/cafe/スターバックス":{name:"スターバックス",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/タリーズコーヒー":{name:"タリーズコーヒー",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3541983"},addTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},removeTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{name:"ドトールコーヒーショップ",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11322732"},addTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},removeTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/星巴克":{name:"星巴克",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/스타벅스":{name:"스타벅스",icon:"maki-cafe",geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/car_rental/Alamo":{name:"Alamo",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1429287"},addTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},removeTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},matchScore:2,suggestion:true},"amenity/car_rental/Avis":{name:"Avis",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q791136"},addTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},removeTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},matchScore:2,suggestion:true},"amenity/car_rental/Budget":{name:"Budget",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1001437"},addTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},removeTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},matchScore:2,suggestion:true},"amenity/car_rental/Dollar":{name:"Dollar",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1235661"},addTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},removeTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},matchScore:2,suggestion:true},"amenity/car_rental/Enterprise":{name:"Enterprise",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q17085454"},addTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},removeTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},matchScore:2,suggestion:true},"amenity/car_rental/Europcar":{name:"Europcar",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1376256"},addTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},removeTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},matchScore:2,suggestion:true},"amenity/car_rental/Hertz":{name:"Hertz",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1543874"},addTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},removeTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},matchScore:2,suggestion:true},"amenity/car_rental/Localiza":{name:"Localiza",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q10319490"},addTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},removeTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},matchScore:2,suggestion:true},"amenity/car_rental/Sixt":{name:"Sixt",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q705664"},addTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},removeTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},matchScore:2,suggestion:true},"amenity/car_rental/Thrifty":{name:"Thrifty",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q2429546"},addTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},removeTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},matchScore:2,suggestion:true},"amenity/car_rental/U-Haul":{name:"U-Haul",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q7862902"},addTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},removeTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11123021"},addTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},removeTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/トヨタレンタカー":{name:"トヨタレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11321580"},addTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},removeTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},matchScore:2,suggestion:true},"amenity/car_rental/ニッポンレンタカー":{name:"ニッポンレンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086533"},addTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},removeTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/日産レンタカー":{name:"日産レンタカー",icon:"maki-car-rental",geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086838"},addTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},removeTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},matchScore:2,suggestion:true},"amenity/charging_station/Blink":{name:"Blink",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q61804688"},addTags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q61804688",name:"Blink"},removeTags:{amenity:"charging_station",brand:"Blink","brand:wikidata":"Q61804688",name:"Blink"},matchScore:2,suggestion:true},"amenity/charging_station/ChargePoint":{name:"ChargePoint",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q5176149"},addTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},removeTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},matchScore:2,suggestion:true},"amenity/charging_station/E-WALD":{name:"E-WALD",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q61804335"},addTags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"},removeTags:{amenity:"charging_station",brand:"E-WALD","brand:wikidata":"Q61804335",name:"E-WALD"},matchScore:2,suggestion:true},"amenity/charging_station/Enel":{name:"Enel",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q651222"},addTags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"},removeTags:{amenity:"charging_station",brand:"Enel","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel"},matchScore:2,suggestion:true},"amenity/charging_station/Tesla Supercharger":{name:"Tesla Supercharger",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q17089620"},addTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},removeTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},matchScore:2,suggestion:true},"amenity/charging_station/eVgo":{name:"eVgo",icon:"fas-charging-station",geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q61803820"},addTags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo","operator:wikidata":"Q6955139","operator:wikipedia":"en:NRG Energy"},removeTags:{amenity:"charging_station",brand:"eVgo","brand:wikidata":"Q61803820",name:"eVgo","operator:wikidata":"Q6955139","operator:wikipedia":"en:NRG Energy"},matchScore:2,suggestion:true},"amenity/cinema/Cinema City":{name:"Cinema City",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q543651"},addTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},removeTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},matchScore:2,suggestion:true},"amenity/cinema/Cinemark":{name:"Cinemark",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q707530"},addTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},removeTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},matchScore:2,suggestion:true},"amenity/cinema/Cinemex":{name:"Cinemex",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q3333072"},addTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},removeTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},matchScore:2,suggestion:true},"amenity/cinema/Cineplanet":{name:"Cineplanet",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5769680"},addTags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",operator:"Grupo Intercorp","operator:wikidata":"Q23008916","operator:wikipedia":"es:Intercorp",name:"Cinepolis"},removeTags:{amenity:"cinema",brand:"Cineplanet","brand:wikidata":"Q5769680","brand:wikipedia":"es:Cineplanet",operator:"Grupo Intercorp","operator:wikidata":"Q23008916","operator:wikipedia":"es:Intercorp",name:"Cinepolis"},matchScore:2,suggestion:true},"amenity/cinema/Cinepolis":{name:"Cinepolis",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5686673"},addTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},removeTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},matchScore:2,suggestion:true},"amenity/cinema/Cineworld":{name:"Cineworld",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5120901"},addTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},removeTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},matchScore:2,suggestion:true},"amenity/cinema/Odeon":{name:"Odeon",icon:"maki-cinema",geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q6127470"},addTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},removeTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q2818848"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/A&W (USA)":{name:"A&W (USA)",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q277641"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Arby's":{name:"Arby's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q630866"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's"},removeTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",cuisine:"sandwich",name:"Arby's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/Auntie Anne's":{name:"Auntie Anne's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4822010"},addTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's"},removeTags:{amenity:"fast_food",brand:"Auntie Anne's","brand:wikidata":"Q4822010","brand:wikipedia":"en:Auntie Anne's",cuisine:"pretzel",name:"Auntie Anne's"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Baja Fresh":{name:"Baja Fresh",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q2880019"},addTags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh"},removeTags:{amenity:"fast_food",brand:"Baja Fresh","brand:wikidata":"Q2880019","brand:wikipedia":"en:Baja Fresh",cuisine:"mexican",name:"Baja Fresh"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Bembos":{name:"Bembos",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q466971"},addTags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos"},removeTags:{amenity:"fast_food",brand:"Bembos","brand:wikidata":"Q466971","brand:wikipedia":"en:Bembos",cuisine:"burger",name:"Bembos"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Bob's":{name:"Bob's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1392113"},addTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},removeTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Bojangles'":{name:"Bojangles'",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q891163"},addTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},removeTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4943796"},addTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice"},removeTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",cuisine:"juice",name:"Booster Juice"},matchScore:2,suggestion:true},"amenity/fast_food/Boston Market":{name:"Boston Market",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q603617"},addTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market"},removeTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",cuisine:"american",name:"Boston Market"},matchScore:2,suggestion:true},"amenity/fast_food/Braum's":{name:"Braum's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4958263"},addTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"american",name:"Braum's"},removeTags:{amenity:"fast_food",brand:"Braum's","brand:wikidata":"Q4958263","brand:wikipedia":"en:Braum's",cuisine:"american",name:"Braum's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger King":{name:"Burger King",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},removeTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Burger Machine":{name:"Burger Machine",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q4998549"},addTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},removeTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/BurgerFi":{name:"BurgerFi",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q39045496"},addTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi"},removeTags:{amenity:"fast_food",brand:"BurgerFi","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",cuisine:"burger",name:"BurgerFi"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5036616"},addTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},removeTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1043486"},addTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},removeTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Checkers":{name:"Checkers",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},removeTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chick-fil-A":{name:"Chick-fil-A",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q491516"},addTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},removeTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Chicken Express":{name:"Chicken Express",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q5096235"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express"},removeTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",cuisine:"chicken",name:"Chicken Express"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/China Wok":{name:"China Wok",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5766542"},addTags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok"},removeTags:{amenity:"fast_food",brand:"China Wok","brand:wikidata":"Q5766542","brand:wikipedia":"es:China Wok",cuisine:"chinese",name:"China Wok"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Chipotle":{name:"Chipotle",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q465751"},addTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},removeTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/Chowking":{name:"Chowking",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1076816"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking"},removeTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",cuisine:"asian",name:"Chowking"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Church's Chicken":{name:"Church's Chicken",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q1089932"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken"},removeTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",cuisine:"chicken",name:"Church's Chicken"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/Cinnabon":{name:"Cinnabon",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1092539"},addTags:{brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",name:"Cinnabon",amenity:"fast_food",cuisine:"dessert"},removeTags:{brand:"Cinnabon","brand:website":"https://www.cinnabon.com/","brand:wikidata":"Q1092539","brand:wikipedia":"en:Cinnabon",name:"Cinnabon",amenity:"fast_food",cuisine:"dessert"},matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5986105"},addTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},removeTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},matchScore:2,suggestion:true},"amenity/fast_food/Cook Out":{name:"Cook Out",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5166992"},addTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out"},removeTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",cuisine:"american",name:"Cook Out"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Culver's":{name:"Culver's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1143589"},addTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's"},removeTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",cuisine:"burger",name:"Culver's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/DQ Grill & Chill":{name:"DQ Grill & Chill",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1141226"},addTags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"burger",name:"DQ Grill & Chill",operator:"Dairy Queen"},removeTags:{amenity:"fast_food",brand:"DQ Grill & Chill","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"burger",name:"DQ Grill & Chill",operator:"Dairy Queen"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Dairy Queen":{name:"Dairy Queen",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1141226"},addTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},removeTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},matchScore:2,suggestion:true},"amenity/fast_food/Daylight Donuts":{name:"Daylight Donuts",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q48970508"},addTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},removeTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Del Taco":{name:"Del Taco",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q1183818"},addTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},removeTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q839466"},addTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},removeTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q847743"},addTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},removeTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/Einstein Bros. Bagels":{name:"Einstein Bros. Bagels",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5349788"},addTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},removeTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/El Pollo Loco":{name:"El Pollo Loco",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q2353849"},addTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},removeTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/Extreme Pita":{name:"Extreme Pita",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5422367"},addTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},removeTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},matchScore:2,suggestion:true},"amenity/fast_food/Fazoli's":{name:"Fazoli's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1399195"},addTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},removeTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Firehouse Subs":{name:"Firehouse Subs",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q5451873"},addTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},removeTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Five Guys":{name:"Five Guys",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1131810"},addTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},removeTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Freddy's":{name:"Freddy's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q5496837"},addTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"burger",name:"Freddy's"},removeTags:{amenity:"fast_food",brand:"Freddy's","brand:wikidata":"Q5496837","brand:wikipedia":"en:Freddy's Frozen Custard & Steakburgers",cuisine:"burger",name:"Freddy's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Freebirds":{name:"Freebirds",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q5500367"},addTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds"},removeTags:{amenity:"fast_food",brand:"Freebirds","brand:wikidata":"Q5500367","brand:wikipedia":"en:Freebirds World Burrito",cuisine:"mexican",name:"Freebirds"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Gabriel Pizza":{name:"Gabriel Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q5515791"},addTags:{brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",name:"Gabriel Pizza",amenity:"fast_food",cuisine:"pizza"},removeTags:{brand:"Gabriel Pizza","brand:wikidata":"Q5515791","brand:wikipedia":"en:Gabriel Pizza",name:"Gabriel Pizza",amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Greenwich":{name:"Greenwich",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2691308"},addTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich"},removeTags:{amenity:"fast_food",brand:"Greenwich","brand:wikidata":"Q2691308","brand:wikipedia":"en:Greenwich Pizza",cuisine:"pizza",name:"Greenwich"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2504930"},addTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},removeTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1571798"},addTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},removeTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hardee's":{name:"Hardee's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1585088"},addTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},removeTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Harvey's":{name:"Harvey's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1466184"},addTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},removeTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hesburger":{name:"Hesburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1276832"},addTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},removeTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Hot Dog on a Stick":{name:"Hot Dog on a Stick",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5909922"},addTags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick"},removeTags:{amenity:"fast_food",brand:"Hot Dog on a Stick","brand:wikidata":"Q5909922","brand:wikipedia":"en:Hot Dog on a Stick",cuisine:"hot_dog",name:"Hot Dog on a Stick"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q3036373"},addTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},removeTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1205312"},addTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},removeTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Jack in the Box":{name:"Jack in the Box",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1538507"},addTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},removeTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q3088784"},addTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},removeTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q6184897"},addTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},removeTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Jimmy John's":{name:"Jimmy John's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q1689380"},addTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},removeTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Jollibee":{name:"Jollibee",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q37614"},addTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},removeTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/KFC":{name:"KFC",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},removeTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Kochlöffel":{name:"Kochlöffel",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q315539"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel"},removeTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",cuisine:"burger",name:"Kochlöffel"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Kotipizza":{name:"Kotipizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1628625"},addTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},removeTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Krispy Kreme":{name:"Krispy Kreme",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1192805"},addTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},removeTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Krystal":{name:"Krystal",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q472195"},addTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal"},removeTags:{amenity:"fast_food",brand:"Krystal","brand:wikidata":"Q472195","brand:wikipedia":"en:Krystal (restaurant)",cuisine:"burger",name:"Krystal"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Little Caesars":{name:"Little Caesars",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1393809"},addTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},removeTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1535221"},addTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},removeTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Lotteria":{name:"Lotteria",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},removeTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6748573"},addTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},removeTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Max":{name:"Max",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1912172"},addTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max"},removeTags:{amenity:"fast_food",brand:"Max","brand:wikidata":"Q1912172","brand:wikipedia":"en:Max Hamburgers",cuisine:"burger",name:"Max"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/McDonald's":{name:"McDonald's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},removeTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q6889938"},addTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},removeTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Mr. Sub":{name:"Mr. Sub",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q6929225"},addTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},removeTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/New York Pizza":{name:"New York Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2639128"},addTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza"},removeTags:{amenity:"fast_food",brand:"New York Pizza","brand:wikidata":"Q2639128","brand:wikipedia":"nl:New York Pizza",cuisine:"pizza",name:"New York Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q74866"},addTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},removeTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/O'Tacos":{name:"O'Tacos",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q28494040"},addTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},removeTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Pal's":{name:"Pal's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7126094"},addTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's"},removeTags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Panago":{name:"Panago",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q17111672"},addTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},removeTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1358690"},addTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},removeTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Panera Bread":{name:"Panera Bread",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q7130852"},addTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},removeTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa John's":{name:"Papa John's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},removeTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q7132349"},addTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},removeTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Philly Pretzel Factory":{name:"Philly Pretzel Factory",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q60097339"},addTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory"},removeTags:{amenity:"fast_food",brand:"Philly Pretzel Factory","brand:wikidata":"Q60097339",cuisine:"pretzel",name:"Philly Pretzel Factory"},matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7757289"},addTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},removeTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Nova":{name:"Pizza Nova",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q7199971"},addTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},removeTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q1194143"},addTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},removeTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Pollo Campero":{name:"Pollo Campero",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q942741"},addTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},removeTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Popeye's":{name:"Popeye's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q1330910"},addTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},removeTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Potbelly":{name:"Potbelly",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q7234777"},addTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},removeTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Qdoba":{name:"Qdoba",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q1363885"},addTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},removeTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Quick":{name:"Quick",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q286494"},addTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},removeTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Quiznos":{name:"Quiznos",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q1936229"},addTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},removeTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Raising Cane's":{name:"Raising Cane's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q7285144"},addTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's"},removeTags:{amenity:"fast_food",brand:"Raising Cane's","brand:wikidata":"Q7285144","brand:wikipedia":"en:Raising Cane's Chicken Fingers",cuisine:"chicken",name:"Raising Cane's"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Rally's":{name:"Rally's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},removeTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Red Rooster":{name:"Red Rooster",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q376466"},addTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},removeTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Sbarro":{name:"Sbarro",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2589409"},addTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},removeTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Schlotzsky's":{name:"Schlotzsky's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q2244796"},addTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's"},removeTags:{amenity:"fast_food",brand:"Schlotzsky's","brand:wikidata":"Q2244796","brand:wikipedia":"en:Schlotzsky's",cuisine:"sandwich",name:"Schlotzsky's"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Shake Shack":{name:"Shake Shack",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1058722"},addTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack"},removeTags:{amenity:"fast_food",brand:"Shake Shack","brand:wikidata":"Q1058722","brand:wikipedia":"en:Shake Shack",cuisine:"burger",name:"Shake Shack"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Sibylla":{name:"Sibylla",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q488643"},addTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla"},removeTags:{amenity:"fast_food",brand:"Sibylla","brand:wikidata":"Q488643","brand:wikipedia":"en:Sibylla (fast food)",cuisine:"burger",name:"Sibylla"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Smashburger":{name:"Smashburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q17061332"},addTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},removeTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5491421"},addTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},removeTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Sonic":{name:"Sonic",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7561808"},addTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},removeTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Steers":{name:"Steers",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q56599145"},addTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},removeTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Subway":{name:"Subway",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},removeTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Supermac's":{name:"Supermac's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q7643750"},addTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's"},removeTags:{amenity:"fast_food",brand:"Supermac's","brand:wikidata":"Q7643750","brand:wikipedia":"en:Supermac's",cuisine:"burger",name:"Supermac's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/TCBY":{name:"TCBY",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7669631"},addTags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY"},removeTags:{amenity:"fast_food",brand:"TCBY","brand:wikidata":"Q7669631","brand:wikipedia":"en:TCBY",cuisine:"frozen_yogurt",name:"TCBY"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q752941"},addTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell"},removeTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"tex-mex",name:"Taco Bell"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Bueno":{name:"Taco Bueno",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673958"},addTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},removeTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Cabana":{name:"Taco Cabana",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q12070488"},addTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},removeTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Del Mar":{name:"Taco Del Mar",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673972"},addTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},removeTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco John's":{name:"Taco John's",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673962"},addTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},removeTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/mexican/Taco Time":{name:"Taco Time",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"mexican","brand:wikidata":"Q7673969"},addTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},removeTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Telepizza":{name:"Telepizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2699863"},addTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},removeTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Thai Express":{name:"Thai Express",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q7709119"},addTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},removeTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/The Pizza Company":{name:"The Pizza Company",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2413520"},addTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},removeTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Veggie Grill":{name:"Veggie Grill",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q18636427"},addTags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill","diet:vegan":"only",cuisine:"american",name:"Veggie Grill"},removeTags:{amenity:"fast_food",brand:"Veggie Grill","brand:wikidata":"Q18636427","brand:wikipedia":"en:Veggie Grill","diet:vegan":"only",cuisine:"american",name:"Veggie Grill"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Wendy's":{name:"Wendy's",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q550258"},addTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},removeTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Whataburger":{name:"Whataburger",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q376627"},addTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},removeTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/White Castle":{name:"White Castle",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1244034"},addTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},removeTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q324679"},addTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},removeTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Wimpy":{name:"Wimpy",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q2811992"},addTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},removeTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/Zaxby's":{name:"Zaxby's",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q8067525"},addTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},removeTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},removeTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4241838"},addTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},removeTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},matchScore:2,suggestion:true},"amenity/fast_food/burger/Макдоналдс":{name:"Макдоналдс",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/Папа Джонс":{name:"Папа Джонс",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},removeTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4439856"},addTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s"},removeTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s"},matchScore:2,suggestion:true},"amenity/fast_food/Суши Wok":{name:"Суши Wok",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q25444754"},addTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok"},removeTags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok"},matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q4455593"},addTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},removeTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},matchScore:2,suggestion:true},"amenity/fast_food/burger/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q12061542"},addTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11263916"},addTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},removeTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},matchScore:2,suggestion:true},"amenity/fast_food/かつや":{name:"かつや",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q2855257"},addTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},removeTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},matchScore:2,suggestion:true},"amenity/fast_food/くら寿司":{name:"くら寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6445491"},addTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},removeTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},matchScore:2,suggestion:true},"amenity/fast_food/すき家":{name:"すき家",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q6137375"},addTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},removeTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},matchScore:2,suggestion:true},"amenity/fast_food/なか卯":{name:"なか卯",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11274132"},addTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},removeTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},matchScore:2,suggestion:true},"amenity/fast_food/はま寿司":{name:"はま寿司",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q17220385"},addTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},removeTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},matchScore:2,suggestion:true},"amenity/fast_food/ほっかほっか亭":{name:"ほっかほっか亭",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q5878035"},addTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},removeTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},matchScore:2,suggestion:true},"amenity/fast_food/ほっともっと":{name:"ほっともっと",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q10850949"},addTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},removeTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},matchScore:2,suggestion:true},"amenity/fast_food/オリジン弁当":{name:"オリジン弁当",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11292632"},addTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},removeTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},matchScore:2,suggestion:true},"amenity/fast_food/chicken/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"fas-drumstick-bite",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"chicken","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},reference:{key:"cuisine",value:"chicken"},matchScore:2,suggestion:true},"amenity/fast_food/sandwich/サブウェイ":{name:"サブウェイ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"sandwich","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},removeTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},reference:{key:"cuisine",value:"sandwich"},matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11257037"},addTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},removeTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},matchScore:2,suggestion:true},"amenity/fast_food/pizza/ピザハット":{name:"ピザハット",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},removeTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/fast_food/burger/マクドナルド":{name:"マクドナルド",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/ミスタードーナツ":{name:"ミスタードーナツ",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q1065819"},addTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},removeTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},matchScore:2,suggestion:true},"amenity/fast_food/burger/モスバーガー":{name:"モスバーガー",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/ロッテリア":{name:"ロッテリア",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q776272"},addTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},removeTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},matchScore:2,suggestion:true},"amenity/fast_food/富士そば":{name:"富士そば",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11414722"},addTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},removeTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},matchScore:2,suggestion:true},"amenity/fast_food/幸楽苑":{name:"幸楽苑",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q11484003"},addTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},removeTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},matchScore:2,suggestion:true},"amenity/fast_food/burger/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q848773"},addTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},removeTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},matchScore:2,suggestion:true},"amenity/fast_food/肯德基":{name:"肯德基",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/burger/麥當勞":{name:"麥當勞",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/麦当劳":{name:"麦当劳",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fast_food/burger/롯데리아":{name:"롯데리아",icon:"maki-fast-food",geometry:["point","area"],tags:{amenity:"fast_food",cuisine:"burger","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},reference:{key:"cuisine",value:"burger"},matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4545742"},addTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},removeTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},matchScore:2,suggestion:true},"amenity/fuel/7-Eleven":{name:"7-Eleven",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q259340"},addTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},removeTags:{amenity:"fuel",brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven"},matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10397504"},addTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},removeTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},matchScore:2,suggestion:true},"amenity/fuel/ADNOC":{name:"ADNOC",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q166729"},addTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},removeTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},matchScore:2,suggestion:true},"amenity/fuel/Afriquia":{name:"Afriquia",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2829178"},addTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},removeTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},matchScore:2,suggestion:true},"amenity/fuel/Agip":{name:"Agip",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q377915"},addTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},removeTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},matchScore:2,suggestion:true},"amenity/fuel/Agrola":{name:"Agrola",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q397351"},addTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},removeTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},matchScore:2,suggestion:true},"amenity/fuel/Api":{name:"Api",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q466043"},addTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},removeTags:{amenity:"fuel",brand:"Api","brand:wikidata":"Q466043","brand:wikipedia":"en:American Petroleum Institute",name:"Api"},matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565734"},addTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},removeTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},matchScore:2,suggestion:true},"amenity/fuel/Arco":{name:"Arco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q304769"},addTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},removeTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},matchScore:2,suggestion:true},"amenity/fuel/Asda":{name:"Asda",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q297410"},addTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},removeTags:{amenity:"fuel",brand:"Asda","brand:wikidata":"Q297410","brand:wikipedia":"en:Asda",name:"Asda"},matchScore:2,suggestion:true},"amenity/fuel/Auchan":{name:"Auchan",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q758603"},addTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},removeTags:{amenity:"fuel",brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan"},matchScore:2,suggestion:true},"amenity/fuel/Avanti":{name:"Avanti",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q168238"},addTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},removeTags:{amenity:"fuel",brand:"Avanti","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"Avanti"},matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q300147"},addTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},removeTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},matchScore:2,suggestion:true},"amenity/fuel/Avin":{name:"Avin",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q19903165"},addTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},removeTags:{amenity:"fuel",brand:"Avin","brand:wikidata":"Q19903165","brand:wikipedia":"en:Avin International",name:"Avin"},matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q152057"},addTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},removeTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},matchScore:2,suggestion:true},"amenity/fuel/Bangchak":{name:"Bangchak",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6579719"},addTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},removeTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q854826"},addTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},removeTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Bliska":{name:"Bliska",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4016378"},addTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},removeTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},matchScore:2,suggestion:true},"amenity/fuel/CAMPSA":{name:"CAMPSA",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1031623"},addTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},removeTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},matchScore:2,suggestion:true},"amenity/fuel/CEPSA":{name:"CEPSA",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q608819"},addTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},removeTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277470"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},matchScore:2,suggestion:true},"amenity/fuel/Canadian Tire Gas+":{name:"Canadian Tire Gas+",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1032400"},addTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},removeTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},matchScore:2,suggestion:true},"amenity/fuel/Carrefour Market":{name:"Carrefour Market",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q217599"},addTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},removeTags:{amenity:"fuel",brand:"Carrefour Market","brand:wikidata":"Q217599","brand:wikipedia":"en:Carrefour",name:"Carrefour Market"},matchScore:2,suggestion:true},"amenity/fuel/Casey's General Store":{name:"Casey's General Store",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2940968"},addTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},removeTags:{amenity:"fuel",brand:"Casey's General Store","brand:wikidata":"Q2940968","brand:wikipedia":"en:Casey's General Stores",name:"Casey's General Store"},matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5011381"},addTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},removeTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},matchScore:2,suggestion:true},"amenity/fuel/Ceypetco":{name:"Ceypetco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5065795"},addTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},removeTags:{amenity:"fuel",brand:"Ceypetco","brand:wikidata":"Q5065795","brand:wikipedia":"en:Ceylon Petroleum Corporation",name:"Ceypetco"},matchScore:2,suggestion:true},"amenity/fuel/Chevron":{name:"Chevron",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q319642"},addTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},removeTags:{amenity:"fuel",brand:"Chevron","brand:wikidata":"Q319642","brand:wikipedia":"en:Chevron Corporation",name:"Chevron"},matchScore:2,suggestion:true},"amenity/fuel/Circle K":{name:"Circle K",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3268010"},addTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},removeTags:{amenity:"fuel",brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K"},matchScore:2,suggestion:true},"amenity/fuel/Citgo":{name:"Citgo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2974437"},addTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},removeTags:{amenity:"fuel",brand:"Citgo","brand:wikidata":"Q2974437","brand:wikipedia":"en:Citgo",name:"Citgo"},matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5127157"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},removeTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},matchScore:2,suggestion:true},"amenity/fuel/Co-op":{name:"Co-op",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5440676"},addTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},removeTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},matchScore:2,suggestion:true},"amenity/fuel/Coles Express":{name:"Coles Express",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5144653"},addTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},removeTags:{amenity:"fuel",brand:"Coles Express","brand:wikidata":"Q5144653","brand:wikipedia":"en:Coles Express",name:"Coles Express"},matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1126518"},addTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},removeTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},matchScore:2,suggestion:true},"amenity/fuel/Copec":{name:"Copec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q11681461"},addTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},removeTags:{amenity:"fuel",brand:"Copec","brand:wikidata":"Q11681461","brand:wikipedia":"en:Empresas Copec",name:"Copec"},matchScore:2,suggestion:true},"amenity/fuel/Cosmo":{name:"Cosmo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2498318"},addTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},removeTags:{amenity:"fuel",brand:"Cosmo","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"Cosmo"},matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q715583"},addTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},removeTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},matchScore:2,suggestion:true},"amenity/fuel/Couche-Tard":{name:"Couche-Tard",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2836957"},addTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},removeTags:{amenity:"fuel",brand:"Couche-Tard","brand:wikidata":"Q2836957","brand:wikipedia":"en:Alimentation Couche-Tard",name:"Couche-Tard"},matchScore:2,suggestion:true},"amenity/fuel/Crevier":{name:"Crevier",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743451"},addTags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"},removeTags:{amenity:"fuel",brand:"Crevier","brand:wikidata":"Q61743451",name:"Crevier"},matchScore:2,suggestion:true},"amenity/fuel/Cumberland Farms":{name:"Cumberland Farms",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1143685"},addTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},removeTags:{amenity:"fuel",brand:"Cumberland Farms","brand:wikidata":"Q1143685","brand:wikipedia":"en:Cumberland Farms",name:"Cumberland Farms"},matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q16973722"},addTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},removeTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},matchScore:2,suggestion:true},"amenity/fuel/Domo":{name:"Domo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5291326"},addTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},removeTags:{amenity:"fuel",brand:"Domo","brand:wikidata":"Q5291326","brand:wikipedia":"en:Domo Gasoline",name:"Domo"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3045934"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Greece)":{name:"EKO (Greece)",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q903198"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/ENEOS":{name:"ENEOS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},removeTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},matchScore:2,suggestion:true},"amenity/fuel/Elan":{name:"Elan",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57980752"},addTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},removeTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},matchScore:2,suggestion:true},"amenity/fuel/Engen":{name:"Engen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3054251"},addTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},removeTags:{amenity:"fuel",brand:"Engen","brand:wikidata":"Q3054251","brand:wikipedia":"en:Engen Petroleum",name:"Engen"},matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565594"},addTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},removeTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},matchScore:2,suggestion:true},"amenity/fuel/Erg":{name:"Erg",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q739503"},addTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},removeTags:{amenity:"fuel",brand:"Erg","brand:wikidata":"Q739503","brand:wikipedia":"it:ERG (azienda)",name:"Erg"},matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},removeTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},matchScore:2,suggestion:true},"amenity/fuel/Esso Express":{name:"Esso Express",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2350336"},addTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},removeTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},matchScore:2,suggestion:true},"amenity/fuel/Exxon":{name:"Exxon",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4781944"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},removeTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},matchScore:2,suggestion:true},"amenity/fuel/Fas Gas":{name:"Fas Gas",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743505"},addTags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"},removeTags:{amenity:"fuel",brand:"Fas Gas","brand:wikidata":"Q61743505","brand:wikipedia":"en:Parkland Fuel",name:"Fas Gas"},matchScore:2,suggestion:true},"amenity/fuel/Firezone":{name:"Firezone",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q14628080"},addTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},removeTags:{amenity:"fuel",brand:"Firezone","brand:wikidata":"Q14628080","brand:wikipedia":"nl:Firezone",name:"Firezone"},matchScore:2,suggestion:true},"amenity/fuel/Flying J":{name:"Flying J",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1434601"},addTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Flying J"},removeTags:{amenity:"fuel",brand:"Flying J","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Flying J"},matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},removeTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},matchScore:2,suggestion:true},"amenity/fuel/GALP":{name:"GALP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1492739"},addTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},removeTags:{amenity:"fuel",brand:"GALP","brand:wikidata":"Q1492739","brand:wikipedia":"en:Galp Energia",name:"GALP"},matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q102673"},addTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},removeTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},matchScore:2,suggestion:true},"amenity/fuel/GetGo":{name:"GetGo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5553766"},addTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},removeTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},matchScore:2,suggestion:true},"amenity/fuel/Goil":{name:"Goil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5555383"},addTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},removeTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},matchScore:2,suggestion:true},"amenity/fuel/Gulf":{name:"Gulf",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1296860"},addTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},removeTags:{amenity:"fuel",brand:"Gulf","brand:wikidata":"Q1296860","brand:wikipedia":"en:Gulf Oil",name:"Gulf"},matchScore:2,suggestion:true},"amenity/fuel/Gull":{name:"Gull",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5617739"},addTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},removeTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},matchScore:2,suggestion:true},"amenity/fuel/H-E-B Fuel":{name:"H-E-B Fuel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q830621"},addTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},removeTags:{amenity:"fuel",brand:"H-E-B Fuel","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B Fuel"},matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1563517"},addTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},removeTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},matchScore:2,suggestion:true},"amenity/fuel/Harnois":{name:"Harnois",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743558"},addTags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"},removeTags:{amenity:"fuel",brand:"Harnois","brand:wikidata":"Q61743558",name:"Harnois"},matchScore:2,suggestion:true},"amenity/fuel/Hess":{name:"Hess",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1615684"},addTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},removeTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},matchScore:2,suggestion:true},"amenity/fuel/Hindustan Petroleum":{name:"Hindustan Petroleum",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1619375"},addTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},removeTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Hofer":{name:"Hofer",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q15815751"},addTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},removeTags:{amenity:"fuel",brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer"},matchScore:2,suggestion:true},"amenity/fuel/Holiday":{name:"Holiday",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5880490"},addTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},removeTags:{amenity:"fuel",brand:"Holiday","brand:wikidata":"Q5880490","brand:wikipedia":"en:Holiday Stationstores",name:"Holiday"},matchScore:2,suggestion:true},"amenity/fuel/IP":{name:"IP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q646807"},addTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},removeTags:{amenity:"fuel",brand:"IP","brand:wikidata":"Q646807","brand:wikipedia":"en:Anonima Petroli Italiana",name:"IP"},matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1289348"},addTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},removeTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},matchScore:2,suggestion:true},"amenity/fuel/Ingo":{name:"Ingo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17048617"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},removeTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},matchScore:2,suggestion:true},"amenity/fuel/Intermarché":{name:"Intermarché",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3153200"},addTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},removeTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},matchScore:2,suggestion:true},"amenity/fuel/Ipiranga":{name:"Ipiranga",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2081136"},addTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},removeTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},matchScore:2,suggestion:true},"amenity/fuel/Irving":{name:"Irving",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1673286"},addTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},removeTags:{amenity:"fuel",brand:"Irving","brand:wikidata":"Q1673286","brand:wikipedia":"en:Irving Oil",name:"Irving"},matchScore:2,suggestion:true},"amenity/fuel/JA-SS":{name:"JA-SS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q11225213"},addTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},removeTags:{amenity:"fuel",brand:"JA-SS","brand:wikidata":"Q11225213","brand:wikipedia":"ja:JA-SS",name:"JA-SS"},matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q568940"},addTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},removeTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},matchScore:2,suggestion:true},"amenity/fuel/Kobil":{name:"Kobil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q22906119"},addTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},removeTags:{amenity:"fuel",brand:"Kobil","brand:wikidata":"Q22906119","brand:wikipedia":"en:KenolKobil",name:"Kobil"},matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q153417"},addTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},removeTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},matchScore:2,suggestion:true},"amenity/fuel/Kum & Go":{name:"Kum & Go",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6443340"},addTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},removeTags:{amenity:"fuel",brand:"Kum & Go","brand:wikidata":"Q6443340","brand:wikipedia":"en:Kum & Go",name:"Kum & Go"},matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6450420"},addTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},removeTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},matchScore:2,suggestion:true},"amenity/fuel/Lotos":{name:"Lotos",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1256909"},addTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"},removeTags:{amenity:"fuel",brand:"Lotos","brand:wikidata":"Q1256909","brand:wikipedia":"en:Grupa Lotos",name:"Lotos"},matchScore:2,suggestion:true},"amenity/fuel/Love's":{name:"Love's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1872496"},addTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},removeTags:{amenity:"fuel",brand:"Love's","brand:wikidata":"Q1872496","brand:wikipedia":"en:Love's Travel Stops & Country Stores",name:"Love's"},matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q329347"},addTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},removeTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},matchScore:2,suggestion:true},"amenity/fuel/MOL":{name:"MOL",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q549181"},addTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},removeTags:{amenity:"fuel",brand:"MOL","brand:wikidata":"Q549181","brand:wikipedia":"en:MOL (company)",name:"MOL"},matchScore:2,suggestion:true},"amenity/fuel/MRS":{name:"MRS",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q56274919"},addTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},removeTags:{amenity:"fuel",brand:"MRS","brand:wikidata":"Q56274919","brand:wikipedia":"en:MRS Oil Nigeria Plc",name:"MRS"},matchScore:2,suggestion:true},"amenity/fuel/Mac's":{name:"Mac's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4043527"},addTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},removeTags:{amenity:"fuel",brand:"Mac's","brand:wikidata":"Q4043527","brand:wikipedia":"en:Mac's Convenience Stores",name:"Mac's"},matchScore:2,suggestion:true},"amenity/fuel/MacEwen":{name:"MacEwen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61740335"},addTags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"},removeTags:{amenity:"fuel",brand:"MacEwen","brand:wikidata":"Q61740335",name:"MacEwen"},matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q458363"},addTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},removeTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},matchScore:2,suggestion:true},"amenity/fuel/Maverik":{name:"Maverik",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q16974822"},addTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},removeTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3302837"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},removeTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},matchScore:2,suggestion:true},"amenity/fuel/Migrol":{name:"Migrol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1747771"},addTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},removeTags:{amenity:"fuel",brand:"Migrol","brand:wikidata":"Q1747771","brand:wikipedia":"de:Migrol",name:"Migrol"},matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3088656"},addTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},removeTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},matchScore:2,suggestion:true},"amenity/fuel/Morrisons":{name:"Morrisons",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q922344"},addTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},removeTags:{amenity:"fuel",brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons"},matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q19604459"},addTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},removeTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},matchScore:2,suggestion:true},"amenity/fuel/NP":{name:"NP",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7842382"},addTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},removeTags:{amenity:"fuel",brand:"NP","brand:wikidata":"Q7842382","brand:wikipedia":"en:Trinidad & Tobago National Petroleum Marketing Company Limited",name:"NP"},matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q616376"},addTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},removeTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},matchScore:2,suggestion:true},"amenity/fuel/OIL!":{name:"OIL!",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2007561"},addTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},removeTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},matchScore:2,suggestion:true},"amenity/fuel/OK":{name:"OK",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12329785"},addTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},removeTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},matchScore:2,suggestion:true},"amenity/fuel/OKQ8":{name:"OKQ8",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1634762"},addTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},removeTags:{amenity:"fuel",brand:"OKQ8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"OKQ8"},matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q168238"},addTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},removeTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},matchScore:2,suggestion:true},"amenity/fuel/Oilibya":{name:"Oilibya",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7081491"},addTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},removeTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},matchScore:2,suggestion:true},"amenity/fuel/Opet":{name:"Opet",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072824"},addTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},removeTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},matchScore:2,suggestion:true},"amenity/fuel/Orlen":{name:"Orlen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q971649"},addTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},removeTags:{amenity:"fuel",brand:"Orlen","brand:wikidata":"Q971649","brand:wikipedia":"en:PKN Orlen",name:"Orlen"},matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},matchScore:2,suggestion:true},"amenity/fuel/PSO":{name:"PSO",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2741455"},addTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},removeTags:{amenity:"fuel",brand:"PSO","brand:wikidata":"Q2741455","brand:wikipedia":"en:Pakistan State Oil",name:"PSO"},matchScore:2,suggestion:true},"amenity/fuel/PTT":{name:"PTT",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1810389"},addTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},removeTags:{amenity:"fuel",brand:"PTT","brand:wikidata":"Q1810389","brand:wikipedia":"en:PTT Public Company Limited",name:"PTT"},matchScore:2,suggestion:true},"amenity/fuel/PV Oil":{name:"PV Oil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2089536"},addTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},removeTags:{amenity:"fuel",brand:"PV Oil","brand:wikidata":"Q2089536","brand:wikipedia":"en:Petrovietnam",name:"PV Oil"},matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7122637"},addTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},removeTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},matchScore:2,suggestion:true},"amenity/fuel/Pemex":{name:"Pemex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q871308"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},removeTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1641044"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},removeTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},matchScore:2,suggestion:true},"amenity/fuel/Petro-Canada":{name:"Petro-Canada",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1208279"},addTags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"},removeTags:{amenity:"fuel",brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada"},matchScore:2,suggestion:true},"amenity/fuel/Petro-T":{name:"Petro-T",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q61743540"},addTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},removeTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2506390"},addTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},removeTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},matchScore:2,suggestion:true},"amenity/fuel/Petrochina":{name:"Petrochina",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},removeTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},matchScore:2,suggestion:true},"amenity/fuel/Petroecuador":{name:"Petroecuador",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1812822"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},removeTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1278087"},addTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},removeTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},matchScore:2,suggestion:true},"amenity/fuel/Petrolimex":{name:"Petrolimex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10831598"},addTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},removeTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},matchScore:2,suggestion:true},"amenity/fuel/Petrolina":{name:"Petrolina",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17013948"},addTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},removeTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},matchScore:2,suggestion:true},"amenity/fuel/Petrom":{name:"Petrom",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1755034"},addTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},removeTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},matchScore:2,suggestion:true},"amenity/fuel/Petron":{name:"Petron",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7179011"},addTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},removeTags:{amenity:"fuel",brand:"Petron","brand:wikidata":"Q7179011","brand:wikipedia":"en:Petron Corporation",name:"Petron"},matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q221692"},addTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},removeTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},matchScore:2,suggestion:true},"amenity/fuel/Petronor":{name:"Petronor",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1726547"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},removeTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},matchScore:2,suggestion:true},"amenity/fuel/Phillips 66":{name:"Phillips 66",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1656230"},addTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},removeTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},matchScore:2,suggestion:true},"amenity/fuel/Phoenix":{name:"Phoenix",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7186949"},addTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},removeTags:{amenity:"fuel",brand:"Phoenix","brand:wikidata":"Q7186949","brand:wikipedia":"en:Phoenix Petroleum",name:"Phoenix"},matchScore:2,suggestion:true},"amenity/fuel/Pioneer":{name:"Pioneer",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7196684"},addTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},removeTags:{amenity:"fuel",brand:"Pioneer","brand:wikidata":"Q7196684","brand:wikipedia":"en:Pioneer Energy",name:"Pioneer"},matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q598835"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},removeTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},matchScore:2,suggestion:true},"amenity/fuel/Puma":{name:"Puma",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7259769"},addTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},removeTags:{amenity:"fuel",brand:"Puma","brand:wikidata":"Q7259769","brand:wikipedia":"en:Puma Energy",name:"Puma"},matchScore:2,suggestion:true},"amenity/fuel/Q8":{name:"Q8",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1634762"},addTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},removeTags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"},matchScore:2,suggestion:true},"amenity/fuel/Q8 Easy":{name:"Q8 Easy",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1806948"},addTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},removeTags:{amenity:"fuel",brand:"Q8 Easy","brand:wikidata":"Q1806948","brand:wikipedia":"nl:Q8 Easy",name:"Q8 Easy"},matchScore:2,suggestion:true},"amenity/fuel/QT":{name:"QT",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7271953"},addTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},removeTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},matchScore:2,suggestion:true},"amenity/fuel/Qstar":{name:"Qstar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10647961"},addTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},removeTags:{amenity:"fuel",brand:"Qstar","brand:wikidata":"Q10647961","brand:wikipedia":"sv:Qstar",name:"Qstar"},matchScore:2,suggestion:true},"amenity/fuel/QuikTrip":{name:"QuikTrip",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7271953"},addTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},removeTags:{amenity:"fuel",brand:"QuikTrip","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QuikTrip"},matchScore:2,suggestion:true},"amenity/fuel/Race Trac":{name:"Race Trac",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q735942"},addTags:{amenity:"fuel",brand:"Race Trac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"Race Trac"},removeTags:{amenity:"fuel",brand:"Race Trac","brand:wikidata":"Q735942","brand:wikipedia":"en:RaceTrac",name:"Race Trac"},matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q174747"},addTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},removeTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},matchScore:2,suggestion:true},"amenity/fuel/Rompetrol":{name:"Rompetrol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1788862"},addTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},removeTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},matchScore:2,suggestion:true},"amenity/fuel/Royal Farms":{name:"Royal Farms",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7374169"},addTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},removeTags:{amenity:"fuel",brand:"Royal Farms","brand:wikidata":"Q7374169","brand:wikipedia":"en:Royal Farms",name:"Royal Farms"},matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3446514"},addTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},removeTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},matchScore:2,suggestion:true},"amenity/fuel/Safeway":{name:"Safeway",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1508234"},addTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},removeTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},matchScore:2,suggestion:true},"amenity/fuel/Sainsbury's":{name:"Sainsbury's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q152096"},addTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},removeTags:{amenity:"fuel",brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's"},matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1972120"},addTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},matchScore:2,suggestion:true},"amenity/fuel/Sasol":{name:"Sasol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q905998"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},removeTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7389549"},addTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},removeTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},matchScore:2,suggestion:true},"amenity/fuel/Sheetz":{name:"Sheetz",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7492551"},addTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},removeTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},matchScore:2,suggestion:true},"amenity/fuel/Shell":{name:"Shell",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q154950"},addTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},removeTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},matchScore:2,suggestion:true},"amenity/fuel/Shell Express":{name:"Shell Express",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2289188"},addTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},removeTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},matchScore:2,suggestion:true},"amenity/fuel/Sinclair":{name:"Sinclair",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1290900"},addTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},removeTags:{amenity:"fuel",brand:"Sinclair","brand:wikidata":"Q1290900","brand:wikipedia":"en:Sinclair Oil Corporation",name:"Sinclair"},matchScore:2,suggestion:true},"amenity/fuel/Sinopec":{name:"Sinopec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"Sinopec"},removeTags:{amenity:"fuel",brand:"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1587563"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},removeTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1622293"},addTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},removeTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},matchScore:2,suggestion:true},"amenity/fuel/Sokimex":{name:"Sokimex",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1149575"},addTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},removeTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},matchScore:2,suggestion:true},"amenity/fuel/Speedway":{name:"Speedway",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7575683"},addTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},removeTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},matchScore:2,suggestion:true},"amenity/fuel/Sprint":{name:"Sprint",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57588452"},addTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},removeTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},matchScore:2,suggestion:true},"amenity/fuel/St1":{name:"St1",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7592214"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},removeTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2031095"},addTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},removeTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},matchScore:2,suggestion:true},"amenity/fuel/Statoil":{name:"Statoil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1776022"},addTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},removeTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},matchScore:2,suggestion:true},"amenity/fuel/Stewart's":{name:"Stewart's",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7615690"},addTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},removeTags:{amenity:"fuel",brand:"Stewart's","brand:wikidata":"Q7615690","brand:wikipedia":"en:Stewart's Shops",name:"Stewart's"},matchScore:2,suggestion:true},"amenity/fuel/Sunoco":{name:"Sunoco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1423218"},addTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},removeTags:{amenity:"fuel",brand:"Sunoco","brand:wikidata":"Q1423218","brand:wikipedia":"en:Sunoco",name:"Sunoco"},matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2529029"},addTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},removeTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},matchScore:2,suggestion:true},"amenity/fuel/Tamoil":{name:"Tamoil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q706793"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},removeTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},matchScore:2,suggestion:true},"amenity/fuel/Tango":{name:"Tango",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2423920"},addTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},removeTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10690640"},addTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},removeTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},matchScore:2,suggestion:true},"amenity/fuel/Teboil":{name:"Teboil",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7692079"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},removeTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},matchScore:2,suggestion:true},"amenity/fuel/Terpel":{name:"Terpel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7703003"},addTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},removeTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},matchScore:2,suggestion:true},"amenity/fuel/Tesco":{name:"Tesco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17145596"},addTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},removeTags:{amenity:"fuel",brand:"Tesco","brand:wikidata":"Q17145596","brand:wikipedia":"en:Tesco Corporation",name:"Tesco"},matchScore:2,suggestion:true},"amenity/fuel/Texaco":{name:"Texaco",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q775060"},addTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},removeTags:{amenity:"fuel",brand:"Texaco","brand:wikidata":"Q775060","brand:wikipedia":"en:Texaco",name:"Texaco"},matchScore:2,suggestion:true},"amenity/fuel/Tinq":{name:"Tinq",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2132028"},addTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},removeTags:{amenity:"fuel",brand:"Tinq","brand:wikidata":"Q2132028","brand:wikipedia":"nl:Tinq",name:"Tinq"},matchScore:2,suggestion:true},"amenity/fuel/Topaz":{name:"Topaz",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7824764"},addTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},removeTags:{amenity:"fuel",brand:"Topaz","brand:wikidata":"Q7824764","brand:wikipedia":"en:Topaz Energy",name:"Topaz"},matchScore:2,suggestion:true},"amenity/fuel/Total":{name:"Total",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q154037"},addTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},removeTags:{amenity:"fuel",brand:"Total","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total"},matchScore:2,suggestion:true},"amenity/fuel/TotalErg":{name:"TotalErg",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3995933"},addTags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"},removeTags:{amenity:"fuel",brand:"TotalErg","brand:wikidata":"Q3995933","brand:wikipedia":"it:TotalErg",name:"TotalErg"},matchScore:2,suggestion:true},"amenity/fuel/Turkey Hill":{name:"Turkey Hill",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q42376970"},addTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},removeTags:{amenity:"fuel",brand:"Turkey Hill","brand:wikidata":"Q42376970","brand:wikipedia":"en:Turkey Hill Minit Markets",name:"Turkey Hill"},matchScore:2,suggestion:true},"amenity/fuel/Turmöl":{name:"Turmöl",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1473279"},addTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},removeTags:{amenity:"fuel",brand:"Turmöl","brand:wikidata":"Q1473279","brand:wikipedia":"de:Turmöl",name:"Turmöl"},matchScore:2,suggestion:true},"amenity/fuel/UDF Fuel":{name:"UDF Fuel",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7887677"},addTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},removeTags:{amenity:"fuel",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"UDF Fuel",short_name:"UDF"},matchScore:2,suggestion:true},"amenity/fuel/Ultramar":{name:"Ultramar",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3548078"},addTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},removeTags:{amenity:"fuel",brand:"Ultramar","brand:wikidata":"Q3548078","brand:wikipedia":"en:Ultramar",name:"Ultramar"},matchScore:2,suggestion:true},"amenity/fuel/United":{name:"United",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q28224393"},addTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},removeTags:{amenity:"fuel",brand:"United","brand:wikidata":"Q28224393","brand:wikipedia":"en:United Petroleum",name:"United"},matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3362746"},addTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},removeTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},matchScore:2,suggestion:true},"amenity/fuel/Valero":{name:"Valero",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1283291"},addTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},removeTags:{amenity:"fuel",brand:"Valero","brand:wikidata":"Q1283291","brand:wikipedia":"en:Valero Energy",name:"Valero"},matchScore:2,suggestion:true},"amenity/fuel/Viada":{name:"Viada",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12663942"},addTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},removeTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12072939"},addTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},removeTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},matchScore:2,suggestion:true},"amenity/fuel/Wawa":{name:"Wawa",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5936320"},addTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},removeTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},matchScore:2,suggestion:true},"amenity/fuel/Westfalen":{name:"Westfalen",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1411209"},addTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},removeTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},matchScore:2,suggestion:true},"amenity/fuel/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5023980"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},matchScore:2,suggestion:true},"amenity/fuel/YPF":{name:"YPF",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2006989"},addTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},removeTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},matchScore:2,suggestion:true},"amenity/fuel/Z":{name:"Z",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q8063337"},addTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},removeTags:{amenity:"fuel",brand:"Z","brand:wikidata":"Q8063337","brand:wikipedia":"en:Z Energy",name:"Z"},matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},removeTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},matchScore:2,suggestion:true},"amenity/fuel/din-X":{name:"din-X",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10472858"},addTags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"},removeTags:{amenity:"fuel",brand:"din-X","brand:wikidata":"Q10472858","brand:wikipedia":"sv:Din-X",name:"din-X"},matchScore:2,suggestion:true},"amenity/fuel/АЗС":{name:"АЗС",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12122687"},addTags:{amenity:"fuel",brand:"АЗС","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"АЗС"},removeTags:{amenity:"fuel",brand:"АЗС","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"АЗС"},matchScore:2,suggestion:true},"amenity/fuel/Авіас":{name:"Авіас",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12122687"},addTags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"},removeTags:{amenity:"fuel",brand:"Авіас","brand:wikidata":"Q12122687","brand:wikipedia":"uk:Мережа АЗС Приват",name:"Авіас"},matchScore:2,suggestion:true},"amenity/fuel/БРСМ-Нафта":{name:"БРСМ-Нафта",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q56356523"},addTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},removeTags:{amenity:"fuel",brand:"БРСМ-Нафта","brand:wikidata":"Q56356523","brand:wikipedia":"uk:БРСМ-Нафта",name:"БРСМ-Нафта"},matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q809985"},addTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},removeTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},matchScore:2,suggestion:true},"amenity/fuel/Белоруснефть":{name:"Белоруснефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4082693"},addTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},removeTags:{amenity:"fuel",brand:"Белоруснефть","brand:wikidata":"Q4082693","brand:wikipedia":"ru:Белоруснефть",name:"Белоруснефть"},matchScore:2,suggestion:true},"amenity/fuel/Газпромнефть":{name:"Газпромнефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1461799"},addTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},removeTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},matchScore:2,suggestion:true},"amenity/fuel/КазМунайГаз":{name:"КазМунайГаз",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1417227"},addTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},removeTags:{amenity:"fuel",brand:"КазМунайГаз","brand:wikidata":"Q1417227","brand:wikipedia":"en:KazMunayGas",name:"КазМунайГаз"},matchScore:2,suggestion:true},"amenity/fuel/Лукойл":{name:"Лукойл",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q329347"},addTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},removeTags:{amenity:"fuel",brand:"Лукойл","brand:wikidata":"Q329347","brand:wikipedia":"ru:Лукойл",name:"Лукойл"},matchScore:2,suggestion:true},"amenity/fuel/Макпетрол":{name:"Макпетрол",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1886438"},addTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},removeTags:{amenity:"fuel",brand:"Макпетрол","brand:wikidata":"Q1886438","brand:wikipedia":"en:Makpetrol",name:"Макпетрол"},matchScore:2,suggestion:true},"amenity/fuel/НК Альянс":{name:"НК Альянс",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4063700"},addTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},removeTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072617"},addTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},removeTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},matchScore:2,suggestion:true},"amenity/fuel/ПТК":{name:"ПТК",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4360193"},addTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},removeTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},matchScore:2,suggestion:true},"amenity/fuel/Петрол":{name:"Петрол",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q24315"},addTags:{amenity:"fuel",brand:"Петрол","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол"},removeTags:{amenity:"fuel",brand:"Петрол","brand:wikidata":"Q24315","brand:wikipedia":"en:Petrol AD",name:"Петрол"},matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1141123"},addTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},removeTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},matchScore:2,suggestion:true},"amenity/fuel/Сургутнефтегаз":{name:"Сургутнефтегаз",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q680776"},addTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},removeTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},matchScore:2,suggestion:true},"amenity/fuel/ТНК":{name:"ТНК",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2298901"},addTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},removeTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},matchScore:2,suggestion:true},"amenity/fuel/Татнефть":{name:"Татнефть",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1616858"},addTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},removeTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},matchScore:2,suggestion:true},"amenity/fuel/Укрнафта":{name:"Укрнафта",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2447961"},addTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},removeTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},matchScore:2,suggestion:true},"amenity/fuel/סונול":{name:"סונול",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3701622"},addTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},removeTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},matchScore:2,suggestion:true},"amenity/fuel/บางจาก":{name:"บางจาก",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6579719"},addTags:{amenity:"fuel",brand:"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก"},removeTags:{amenity:"fuel",brand:"บางจาก","brand:wikidata":"Q6579719","brand:wikipedia":"th:บางจาก คอร์ปอเรชัน",name:"บางจาก"},matchScore:2,suggestion:true},"amenity/fuel/ป.ต.ท.":{name:"ป.ต.ท.",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1810389"},addTags:{amenity:"fuel",brand:"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท."},removeTags:{amenity:"fuel",brand:"ป.ต.ท.","brand:wikidata":"Q1810389","brand:wikipedia":"th:ปตท.",name:"ป.ต.ท."},matchScore:2,suggestion:true},"amenity/fuel/เชลล์":{name:"เชลล์",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q18109"},addTags:{amenity:"fuel",brand:"เชลล์","brand:wikidata":"Q18109","brand:wikipedia":"th:เชลล์",name:"เชลล์"},removeTags:{amenity:"fuel",brand:"เชลล์","brand:wikidata":"Q18109","brand:wikipedia":"th:เชลล์",name:"เชลล์"},matchScore:2,suggestion:true},"amenity/fuel/เอสโซ่":{name:"เอสโซ่",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エッソ":{name:"エッソ",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エネオス":{name:"エネオス",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},removeTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},matchScore:2,suggestion:true},"amenity/fuel/コスモ石油":{name:"コスモ石油",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2498318"},addTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},removeTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},matchScore:2,suggestion:true},"amenity/fuel/中国石化":{name:"中国石化",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},removeTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/中国石化 Sinopec":{name:"中国石化 Sinopec",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"中国石化 Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"zh:中国石化",name:"中国石化 Sinopec"},removeTags:{amenity:"fuel",brand:"中国石化 Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"zh:中国石化",name:"中国石化 Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},removeTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},matchScore:2,suggestion:true},"amenity/fuel/出光":{name:"出光",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2216770"},addTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},removeTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},matchScore:2,suggestion:true},"amenity/fuel/台灣中油":{name:"台灣中油",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q21527177"},addTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},removeTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},matchScore:2,suggestion:true},"amenity/fuel/昭和シェル":{name:"昭和シェル",icon:"maki-fuel",geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277115"},addTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},removeTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},matchScore:2,suggestion:true},"amenity/ice_cream/Baskin-Robbins":{name:"Baskin-Robbins",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q584601"},addTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},removeTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},matchScore:2,suggestion:true},"amenity/ice_cream/Ben & Jerry's":{name:"Ben & Jerry's",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q816412"},addTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},removeTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},matchScore:2,suggestion:true},"amenity/ice_cream/Cold Stone Creamery":{name:"Cold Stone Creamery",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q1094923"},addTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},removeTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},matchScore:2,suggestion:true},"amenity/ice_cream/D'Onofrio":{name:"D'Onofrio",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q5203166"},addTags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"},removeTags:{amenity:"ice_cream",brand:"D'Onofrio","brand:wikidata":"Q5203166","brand:wikipedia":"es:D'Onofrio",cuisine:"ice_cream",name:"D'Onofrio"},matchScore:2,suggestion:true},"amenity/ice_cream/Freddo":{name:"Freddo",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q28823999"},addTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},removeTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},matchScore:2,suggestion:true},"amenity/ice_cream/Grido":{name:"Grido",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q5885724"},addTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},removeTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},matchScore:2,suggestion:true},"amenity/ice_cream/Rita's Italian Ice":{name:"Rita's Italian Ice",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q7336456"},addTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},removeTags:{amenity:"ice_cream",brand:"Rita's Italian Ice","brand:wikidata":"Q7336456","brand:wikipedia":"en:Rita's Italian Ice",cuisine:"ice_cream",name:"Rita's Italian Ice"},matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"maki-ice-cream",geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q16952110"},addTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},removeTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},matchScore:2,suggestion:true},"amenity/money_transfer/Express Union":{name:"Express Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q3062276"},addTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},removeTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},matchScore:2,suggestion:true},"amenity/money_transfer/Western Union":{name:"Western Union",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q861042"},addTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/payment_centre/Abitab":{name:"Abitab",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"payment_centre","brand:wikidata":"Q16488129"},addTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},removeTags:{amenity:"payment_centre",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",geometry:["point","area"],tags:{amenity:"payment_centre","brand:wikidata":"Q6100413"},addTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},removeTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},matchScore:2,suggestion:true},"amenity/payment_terminal/Qiwi":{name:"Qiwi",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q4047736"},addTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},removeTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},matchScore:2,suggestion:true},"amenity/payment_terminal/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q1515015"},addTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},removeTags:{amenity:"payment_terminal",brand:"ПриватБанк","brand:wikidata":"Q1515015","brand:wikipedia":"en:PrivatBank",name:"ПриватБанк"},matchScore:2,suggestion:true},"amenity/payment_terminal/Элекснет":{name:"Элекснет",icon:"maki-bank",geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q4530795"},addTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},removeTags:{amenity:"payment_terminal",brand:"Элекснет","brand:wikidata":"Q4530795","brand:wikipedia":"ru:Элекснет",name:"Элекснет"},matchScore:2,suggestion:true},"amenity/pharmacy/36,6":{name:"36,6",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q226889"},addTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},removeTags:{amenity:"pharmacy",brand:"36,6","brand:wikidata":"Q226889","brand:wikipedia":"ru:36,6 (аптечная сеть)",healthcare:"pharmacy",name:"36,6"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10416114"},addTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},removeTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Bartell Drugs":{name:"Bartell Drugs",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4865152"},addTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},removeTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Benavides":{name:"Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435613"},addTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},removeTags:{amenity:"pharmacy",brand:"Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Benavides"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Boots":{name:"Boots",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6123139"},addTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},removeTags:{amenity:"pharmacy",brand:"Boots","brand:wikidata":"Q6123139","brand:wikipedia":"en:Boots UK",healthcare:"pharmacy",name:"Boots"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Brookshire Brothers Pharmacy":{name:"Brookshire Brothers Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4975084"},addTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Brookshire Brothers Pharmacy","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",healthcare:"pharmacy",name:"Brookshire Brothers Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/CVS":{name:"CVS",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2078880"},addTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},removeTags:{amenity:"pharmacy",brand:"CVS","brand:wikidata":"Q2078880","brand:wikipedia":"en:CVS Pharmacy",healthcare:"pharmacy",name:"CVS"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Catena":{name:"Catena",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q24035728"},addTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},removeTags:{amenity:"pharmacy",brand:"Catena","brand:wikidata":"Q24035728","brand:wikipedia":"ro:Farmacia Catena",healthcare:"pharmacy",name:"Catena"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q48782120"},addTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},removeTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Costco Pharmacy":{name:"Costco Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q715583"},addTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Cruz Verde":{name:"Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856071"},addTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},removeTags:{amenity:"pharmacy",brand:"Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Dr. Max":{name:"Dr. Max",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q56317371"},addTags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"},removeTags:{amenity:"pharmacy",brand:"Dr. Max","brand:wikidata":"Q56317371","brand:wikipedia":"fr:Dr.Max",healthcare:"pharmacy",name:"Dr. Max"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Droga Raia":{name:"Droga Raia",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10357101"},addTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},removeTags:{amenity:"pharmacy",brand:"Droga Raia","brand:wikidata":"Q10357101","brand:wikipedia":"pt:RaiaDrogasil",healthcare:"pharmacy",name:"Droga Raia"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5308184"},addTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},removeTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Drogasil":{name:"Drogasil",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5308185"},addTags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil"},removeTags:{amenity:"pharmacy",brand:"Drogasil","brand:wikidata":"Q5308185","brand:wikipedia":"pt:Drogasil",healthcare:"pharmacy",name:"Drogasil"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Duane Reade":{name:"Duane Reade",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5310380"},addTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},removeTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Eurovaistinė":{name:"Eurovaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q267205"},addTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},removeTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Familiprix":{name:"Familiprix",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3064881"},addTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},removeTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Benavides":{name:"Farmacia Benavides",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435613"},addTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},removeTags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435609"},addTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},removeTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Ahumada":{name:"Farmacias Ahumada",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856069"},addTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},removeTags:{amenity:"pharmacy",brand:"Farmacias Ahumada","brand:wikidata":"Q5856069","brand:wikipedia":"es:Farmacias Ahumada",healthcare:"pharmacy",name:"Farmacias Ahumada"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias Cruz Verde":{name:"Farmacias Cruz Verde",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856071"},addTags:{amenity:"pharmacy",brand:"Farmacias Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Farmacias Cruz Verde"},removeTags:{amenity:"pharmacy",brand:"Farmacias Cruz Verde","brand:wikidata":"Q5856071","brand:wikipedia":"es:Farmacias Cruz Verde",healthcare:"pharmacy",name:"Farmacias Cruz Verde"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacias SalcoBrand":{name:"Farmacias SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2877054"},addTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},removeTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacity":{name:"Farmacity",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856076"},addTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},removeTags:{amenity:"pharmacy",brand:"Farmacity","brand:wikidata":"Q5856076","brand:wikipedia":"es:Farmacity",healthcare:"pharmacy",name:"Farmacity"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmahorro":{name:"Farmahorro",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q20015002"},addTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},removeTags:{amenity:"pharmacy",brand:"Farmahorro","brand:wikidata":"Q20015002","brand:wikipedia":"es:Farmahorro",healthcare:"pharmacy",name:"Farmahorro"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmatodo":{name:"Farmatodo",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5856092"},addTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},removeTags:{amenity:"pharmacy",brand:"Farmatodo","brand:wikidata":"Q5856092","brand:wikipedia":"es:Farmatodo",healthcare:"pharmacy",name:"Farmatodo"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q15857801"},addTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},removeTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Guardian":{name:"Guardian",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q13646560"},addTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Guardian"},removeTags:{amenity:"pharmacy",brand:"Guardian","brand:wikidata":"Q13646560","brand:wikipedia":"en:Mannings",healthcare:"pharmacy",name:"Guardian"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/H-E-B Pharmacy":{name:"H-E-B Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q830621"},addTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},removeTags:{amenity:"pharmacy",brand:"H-E-B Pharmacy","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",healthcare:"pharmacy",name:"H-E-B Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Hy-Vee Pharmacy":{name:"Hy-Vee Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1639719"},addTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Hy-Vee Pharmacy","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",healthcare:"pharmacy",name:"Hy-Vee Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Inkafarma":{name:"Inkafarma",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10997748"},addTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},removeTags:{amenity:"pharmacy",brand:"Inkafarma","brand:wikidata":"Q10997748","brand:wikipedia":"es:Inkafarma",healthcare:"pharmacy",name:"Inkafarma"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3117457"},addTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},removeTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kimia Farma":{name:"Kimia Farma",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11264892"},addTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},removeTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6414090"},addTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},removeTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{name:"Lloyds Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6662870"},addTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3258955"},addTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},removeTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Mercury Drug":{name:"Mercury Drug",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6818610"},addTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},removeTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Mēness aptieka":{name:"Mēness aptieka",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q57583051"},addTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},removeTags:{amenity:"pharmacy",brand:"Mēness aptieka","brand:wikidata":"Q57583051",healthcare:"pharmacy",name:"Mēness aptieka"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7124466"},addTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},removeTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmacie Principale":{name:"Pharmacie Principale",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1547749"},addTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:PP Holding Group",healthcare:"pharmacy",name:"Pharmacie Principale"},removeTags:{amenity:"pharmacy",brand:"Pharmacie Principale","brand:wikidata":"Q1547749","brand:wikipedia":"fr:PP Holding Group",healthcare:"pharmacy",name:"Pharmacie Principale"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},removeTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave":{name:"Pharmasave",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q17093822"},addTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},removeTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Rexall":{name:"Rexall",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7319360"},addTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},removeTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Rite Aid":{name:"Rite Aid",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3433273"},addTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},removeTags:{amenity:"pharmacy",brand:"Rite Aid","brand:wikidata":"Q3433273","brand:wikipedia":"en:Rite Aid",healthcare:"pharmacy",name:"Rite Aid"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/SalcoBrand":{name:"SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q2877054"},addTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},removeTags:{amenity:"pharmacy",brand:"SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Sensiblu":{name:"Sensiblu",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q12740640"},addTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},removeTags:{amenity:"pharmacy",brand:"Sensiblu","brand:wikidata":"Q12740640","brand:wikipedia":"ro:Sensiblu",healthcare:"pharmacy",name:"Sensiblu"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},removeTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/South Star Drug":{name:"South Star Drug",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7568544"},addTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},removeTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Superdrug":{name:"Superdrug",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7643261"},addTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},removeTags:{amenity:"pharmacy",brand:"Superdrug","brand:wikidata":"Q7643261","brand:wikipedia":"en:Superdrug",healthcare:"pharmacy",name:"Superdrug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q683265"},addTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},removeTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walgreens":{name:"Walgreens",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1591889"},addTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},removeTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{name:"Walmart Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q483551"},addTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Watsons":{name:"Watsons",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7974785"},addTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},removeTags:{amenity:"pharmacy",brand:"Watsons","brand:wikidata":"Q7974785","brand:wikipedia":"en:Watsons",healthcare:"pharmacy",name:"Watsons"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7726524"},addTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Ригла":{name:"Ригла",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4394431"},addTags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"},removeTags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/くすりの福太郎":{name:"くすりの福太郎",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q17214460"},addTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎"},removeTags:{amenity:"pharmacy",brand:"くすりの福太郎","brand:wikidata":"Q17214460","brand:wikipedia":"ja:くすりの福太郎",healthcare:"pharmacy",name:"くすりの福太郎"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア":{name:"ウエルシア",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11288684"},addTags:{amenity:"pharmacy",brand:"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア"},removeTags:{amenity:"pharmacy",brand:"ウエルシア","brand:wikidata":"Q11288684","brand:wikipedia":"ja:ウエルシアホールディングス",healthcare:"pharmacy",name:"ウエルシア"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ウエルシア薬局":{name:"ウエルシア薬局",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11288687"},addTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局"},removeTags:{amenity:"pharmacy",brand:"ウエルシア薬局","brand:wikidata":"Q11288687","brand:wikipedia":"ja:ウエルシア薬局",healthcare:"pharmacy",name:"ウエルシア薬局"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/カワチ薬品":{name:"カワチ薬品",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11295397"},addTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品"},removeTags:{amenity:"pharmacy",brand:"カワチ薬品","brand:wikidata":"Q11295397","brand:wikipedia":"ja:カワチ薬品",healthcare:"pharmacy",name:"カワチ薬品"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/キリン堂":{name:"キリン堂",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11297751"},addTags:{amenity:"pharmacy",brand:"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂"},removeTags:{amenity:"pharmacy",brand:"キリン堂","brand:wikidata":"Q11297751","brand:wikipedia":"ja:キリン堂",healthcare:"pharmacy",name:"キリン堂"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/クリエイト":{name:"クリエイト",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11299163"},addTags:{amenity:"pharmacy",brand:"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト"},removeTags:{amenity:"pharmacy",brand:"クリエイト","brand:wikidata":"Q11299163","brand:wikipedia":"ja:クリエイトSDホールディングス",healthcare:"pharmacy",name:"クリエイト"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ココカラファイン":{name:"ココカラファイン",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11301948"},addTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン"},removeTags:{amenity:"pharmacy",brand:"ココカラファイン","brand:wikidata":"Q11301948","brand:wikipedia":"ja:ココカラファイン",healthcare:"pharmacy",name:"ココカラファイン"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/サンドラッグ":{name:"サンドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11305867"},addTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ"},removeTags:{amenity:"pharmacy",brand:"サンドラッグ","brand:wikidata":"Q11305867","brand:wikipedia":"ja:サンドラッグ",healthcare:"pharmacy",name:"サンドラッグ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/セイジョー":{name:"セイジョー",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11314133"},addTags:{amenity:"pharmacy",brand:"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー"},removeTags:{amenity:"pharmacy",brand:"セイジョー","brand:wikidata":"Q11314133","brand:wikipedia":"ja:セイジョー",healthcare:"pharmacy",name:"セイジョー"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/ダイコクドラッグ":{name:"ダイコクドラッグ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11316754"},addTags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ"},removeTags:{amenity:"pharmacy",brand:"ダイコクドラッグ","brand:wikidata":"Q11316754","brand:wikipedia":"ja:ダイコク",healthcare:"pharmacy",name:"ダイコクドラッグ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/マツモトキヨシ":{name:"マツモトキヨシ",icon:"maki-pharmacy",geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q8014776"},addTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ"},removeTags:{amenity:"pharmacy",brand:"マツモトキヨシ","brand:wikidata":"Q8014776","brand:wikipedia":"ja:マツモトキヨシ",healthcare:"pharmacy",name:"マツモトキヨシ"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"temaki-post_box",geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q157645"},addTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_box/USPS":{name:"USPS",icon:"temaki-post_box",geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q668687"},addTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},removeTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1142936"},addTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},removeTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},matchScore:2,suggestion:true},"amenity/post_office/CTT":{name:"CTT",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q909429"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},removeTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1032001"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},removeTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q3375004"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},removeTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q4036566"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},removeTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172893"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},removeTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172894"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},removeTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},matchScore:2,suggestion:true},"amenity/post_office/DHL":{name:"DHL",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q489815"},addTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},removeTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},matchScore:2,suggestion:true},"amenity/post_office/DPD Paketshop":{name:"DPD Paketshop",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q541030"},addTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},removeTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q157645"},addTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_office/Fancourier":{name:"Fancourier",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q12727984"},addTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},removeTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},matchScore:2,suggestion:true},"amenity/post_office/FedEx":{name:"FedEx",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q459477"},addTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},removeTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},matchScore:2,suggestion:true},"amenity/post_office/Hermes Paketshop":{name:"Hermes Paketshop",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1613532"},addTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},removeTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/LBC":{name:"LBC",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q17075584"},addTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},removeTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},matchScore:2,suggestion:true},"amenity/post_office/La Poste":{name:"La Poste",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q373724"},addTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},removeTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},matchScore:2,suggestion:true},"amenity/post_office/MRW":{name:"MRW",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q23767821"},addTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},removeTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},matchScore:2,suggestion:true},"amenity/post_office/Oficina de Correos":{name:"Oficina de Correos",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q776605"},addTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},removeTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},matchScore:2,suggestion:true},"amenity/post_office/Poczta Polska":{name:"Poczta Polska",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q168833"},addTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},removeTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},matchScore:2,suggestion:true},"amenity/post_office/Poste Italiane":{name:"Poste Italiane",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q495026"},addTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},removeTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},matchScore:2,suggestion:true},"amenity/post_office/Serpost":{name:"Serpost",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q19521863"},addTags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"en:Servicios Postales del Perú",name:"Serpost"},removeTags:{amenity:"post_office",brand:"Serpost","brand:wikidata":"Q19521863","brand:wikipedia":"en:Servicios Postales del Perú",name:"Serpost"},matchScore:2,suggestion:true},"amenity/post_office/Slovenská pošta":{name:"Slovenská pošta",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1191849"},addTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},removeTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},matchScore:2,suggestion:true},"amenity/post_office/The UPS Store":{name:"The UPS Store",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q7771029"},addTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},removeTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},matchScore:2,suggestion:true},"amenity/post_office/US Post Office":{name:"US Post Office",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q668687"},addTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},removeTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1275135"},addTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},removeTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},matchScore:2,suggestion:true},"amenity/post_office/Белпочта":{name:"Белпочта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q2662336"},addTags:{amenity:"post_office",brand:"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"en:Belposhta",name:"Белпочта"},removeTags:{amenity:"post_office",brand:"Белпочта","brand:wikidata":"Q2662336","brand:wikipedia":"en:Belposhta",name:"Белпочта"},matchScore:2,suggestion:true},"amenity/post_office/Казпочта":{name:"Казпочта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q746263"},addTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},removeTags:{amenity:"post_office",brand:"Казпочта","brand:wikidata":"Q746263","brand:wikipedia":"ru:Казпочта",name:"Казпочта"},matchScore:2,suggestion:true},"amenity/post_office/Нова Пошта №1":{name:"Нова Пошта №1",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q12133863"},addTags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"},removeTags:{amenity:"post_office",brand:"Нова Пошта №1","brand:wikidata":"Q12133863","brand:wikipedia":"uk:Нова пошта",name:"Нова Пошта №1"},matchScore:2,suggestion:true},"amenity/post_office/Почта России":{name:"Почта России",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1502763"},addTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},removeTags:{amenity:"post_office",brand:"Почта России","brand:wikidata":"Q1502763","brand:wikipedia":"ru:Почта России",name:"Почта России"},matchScore:2,suggestion:true},"amenity/post_office/Укрпошта":{name:"Укрпошта",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q2470783"},addTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},removeTags:{amenity:"post_office",brand:"Укрпошта","brand:wikidata":"Q2470783","brand:wikipedia":"en:Ukrposhta",name:"Укрпошта"},matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1066476"},addTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},removeTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},matchScore:2,suggestion:true},"amenity/public_bookcase/Little Free Library":{name:"Little Free Library",icon:"maki-library",geometry:["point","area"],tags:{amenity:"public_bookcase","brand:wikidata":"Q6650101"},addTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},removeTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},matchScore:2,suggestion:true},"amenity/restaurant/100 Montaditos":{name:"100 Montaditos",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8355805"},addTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},removeTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},matchScore:2,suggestion:true},"amenity/restaurant/italian/ASK Italian":{name:"ASK Italian",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q4807056"},addTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikipedia":"en:ASK Italian","brand:wikidata":"Q4807056",cuisine:"italian",name:"ASK Italian"},removeTags:{amenity:"restaurant",brand:"ASK Italian","brand:wikipedia":"en:ASK Italian","brand:wikidata":"Q4807056",cuisine:"italian",name:"ASK Italian"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Applebee’s Neighborhood Grill & Bar":{name:"Applebee’s Neighborhood Grill & Bar",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q621532"},addTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},removeTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q786790"},addTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},removeTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},matchScore:2,suggestion:true},"amenity/restaurant/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4883362"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},removeTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},matchScore:2,suggestion:true},"amenity/restaurant/Big Boy":{name:"Big Boy",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy"},removeTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",cuisine:"burger",name:"Big Boy"},matchScore:2,suggestion:true},"amenity/restaurant/american/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4920343"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},removeTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",cuisine:"american",name:"Black Bear Diner"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4932386"},addTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"},removeTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932386","brand:wikipedia":"en:Bob Evans Restaurants",cuisine:"american",name:"Bob Evans"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q4941599"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},removeTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",cuisine:"seafood",name:"Bonefish Grill"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q894578"},addTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},removeTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q944655"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},removeTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",cuisine:"steak_house",name:"Buffalo Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q509255"},addTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},removeTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",cuisine:"wings",name:"Buffalo Wild Wings"},matchScore:2,suggestion:true},"amenity/restaurant/mexican/Cafe Rio":{name:"Cafe Rio",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"mexican","brand:wikidata":"Q5017108"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},removeTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",cuisine:"mexican",name:"Cafe Rio"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q15109854"},addTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},removeTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q25111797"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},removeTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",cuisine:"italian",name:"Carluccio's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5045999"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},removeTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",cuisine:"italian",name:"Carrabba's Italian Grill"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Cheesecake Factory":{name:"Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"american",name:"Cheesecake Factory"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1072948"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's"},removeTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",cuisine:"tex-mex",name:"Chili's"},matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5101775"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},removeTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",cuisine:"tex-mex",name:"Chiquito"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q2438391"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},removeTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q2972189"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},removeTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/american/Claim Jumper":{name:"Claim Jumper",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5125081"},addTags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",operator:"Landry's","operator:wikidata":"Q3217105","operator:wikipedia":"en:Landry's, Inc.",name:"Claim Jumper"},removeTags:{amenity:"restaurant",brand:"Claim Jumper","brand:wikidata":"Q5125081","brand:wikipedia":"en:Claim Jumper",cuisine:"american",operator:"Landry's","operator:wikidata":"Q3217105","operator:wikipedia":"en:Landry's, Inc.",name:"Claim Jumper"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/french/Courtepaille":{name:"Courtepaille",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q3116688"},addTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},removeTags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/american/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4492609"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel"},removeTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",cuisine:"american",name:"Cracker Barrel"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Denny's":{name:"Denny's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1189695"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},removeTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",cuisine:"american",name:"Denny's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q19880747"},addTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},removeTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",cuisine:"barbecue",name:"Dickey's Barbecue Pit"},matchScore:2,suggestion:true},"amenity/restaurant/italian/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5329375"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},removeTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",cuisine:"italian",name:"East Side Mario's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5433448"},addTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},removeTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",cuisine:"barbecue",name:"Famous Dave's"},matchScore:2,suggestion:true},"amenity/restaurant/french/Flunch":{name:"Flunch",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q629326"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},removeTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",cuisine:"french",name:"Flunch"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/american/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5864366"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},removeTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",cuisine:"american",name:"Foster's Hollywood"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q5490892"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},removeTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",cuisine:"italian",name:"Frankie & Benny's"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/Freshii":{name:"Freshii",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5503051"},addTags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"},removeTags:{amenity:"restaurant",brand:"Freshii","brand:wikidata":"Q5503051","brand:wikipedia":"en:Freshii",cuisine:"salad",name:"Freshii"},matchScore:2,suggestion:true},"amenity/restaurant/american/Friendly's":{name:"Friendly's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1464513"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},removeTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",cuisine:"american",name:"Friendly's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5507056"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},removeTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",cuisine:"burger",name:"Fuddruckers"},matchScore:2,suggestion:true},"amenity/restaurant/american/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4039560"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},removeTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5588445"},addTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},removeTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",cuisine:"burger",name:"Gourmet Burger Kitchen"},matchScore:2,suggestion:true},"amenity/restaurant/american/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q918151"},addTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"},removeTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",cuisine:"american",name:"Hard Rock Cafe"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Harvester":{name:"Harvester",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5676915"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},removeTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",cuisine:"american",name:"Harvester"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3136174"},addTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"},removeTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",cuisine:"steak_house",name:"Hippopotamus"},matchScore:2,suggestion:true},"amenity/restaurant/Hooters":{name:"Hooters",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1025921"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},removeTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",cuisine:"burger",name:"Hooters"},matchScore:2,suggestion:true},"amenity/restaurant/american/Huddle House":{name:"Huddle House",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q5928324"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},removeTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",cuisine:"american",name:"Huddle House"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1185675"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"pancake",name:"IHOP"},removeTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",cuisine:"pancake",name:"IHOP"},matchScore:2,suggestion:true},"amenity/restaurant/american/IL Патио":{name:"IL Патио",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q4397763"},addTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},removeTags:{amenity:"restaurant",brand:"IL Патио","brand:wikidata":"Q4397763","brand:wikipedia":"en:Росинтер",cuisine:"american",name:"IL Патио"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q16997641"},addTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"},removeTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",cuisine:"sandwich",name:"Jason's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q16997713"},addTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},removeTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q6208210"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},removeTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",cuisine:"seafood",name:"Joe's Crab Shack"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/american/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q6386459"},addTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"},removeTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",cuisine:"american",name:"Kelsey's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Kudu":{name:"Kudu",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6441777"},addTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},removeTags:{amenity:"restaurant",brand:"Kudu","brand:wikidata":"Q6441777","brand:wikipedia":"en:Kudu (restaurant)",cuisine:"sandwich",name:"Kudu"},matchScore:2,suggestion:true},"amenity/restaurant/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6666872"},addTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"america",name:"Logan's Roadhouse"},removeTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",cuisine:"america",name:"Logan's Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3259007"},addTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"},removeTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",cuisine:"steak_house",name:"LongHorn Steakhouse"},matchScore:2,suggestion:true},"amenity/restaurant/Loving Hut":{name:"Loving Hut",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3491655"},addTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},removeTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},matchScore:2,suggestion:true},"amenity/restaurant/Léon de Bruxelles":{name:"Léon de Bruxelles",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q21041507"},addTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},removeTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",cuisine:"friture",name:"Léon de Bruxelles"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q19903469"},addTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},removeTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q6757382"},addTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},removeTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q6794477"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"},removeTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",cuisine:"asian",name:"Max's Restaurant"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q17020829"},addTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"},removeTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",cuisine:"sandwich",name:"McAlister's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q17021360"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},removeTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",cuisine:"pizza",name:"Mellow Mushroom"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Mimi's Cafe":{name:"Mimi's Cafe",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q17022081"},addTags:{amenity:"restaurant",brand:"Mimi's Cafe",cuisine:"french","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",name:"Mimi's Cafe"},removeTags:{amenity:"restaurant",brand:"Mimi's Cafe",cuisine:"french","brand:wikidata":"Q17022081","brand:wikipedia":"en:Mimi's Cafe",name:"Mimi's Cafe"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3472954"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"},removeTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",cuisine:"chicken;portuguese",name:"Nando's"},matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7049673"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},removeTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"},matchScore:2,suggestion:true},"amenity/restaurant/american/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7071703"},addTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"},removeTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",cuisine:"american",name:"O'Charley's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Old Chicago":{name:"Old Chicago",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q5180522"},addTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",cuisine:"pizza",name:"Old Chicago"},removeTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",cuisine:"pizza",name:"Old Chicago"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/american/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q25402475"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},removeTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",cuisine:"american",name:"Old Wild West"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q3045312"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},removeTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",cuisine:"italian",name:"Olive Garden"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1064893"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"},removeTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",name:"Outback Steakhouse"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/asian/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q5360181"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's"},removeTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",cuisine:"asian",name:"P.F. Chang's"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/Pardos Chicken":{name:"Pardos Chicken",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q17624435"},addTags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"},removeTags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q7160898"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},removeTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Perkins":{name:"Perkins",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7169056"},addTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins"},removeTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q39054369"},addTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},removeTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q191615"},addTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},removeTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q7199978"},addTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},removeTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q662845"},addTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},removeTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/french/Poivre Rouge":{name:"Poivre Rouge",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"french","brand:wikidata":"Q7316076"},addTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},removeTags:{amenity:"restaurant",brand:"Poivre Rouge","brand:wikidata":"Q7316076","brand:wikipedia":"fr:Poivre Rouge (restauration)",cuisine:"french",name:"Poivre Rouge"},reference:{key:"cuisine",value:"french"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Prezzo":{name:"Prezzo",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q7242489"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},removeTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/seafood/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant-seafood",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"seafood","brand:wikidata":"Q846301"},addTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},removeTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},reference:{key:"cuisine",value:"seafood"},matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7304886"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin"},removeTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",cuisine:"burger",name:"Red Robin"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q7371139"},addTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},removeTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7376400"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"america",name:"Ruby Tuesday"},removeTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",cuisine:"america",name:"Ruby Tuesday"},matchScore:2,suggestion:true},"amenity/restaurant/pizza/Shakey's":{name:"Shakey's",icon:"maki-restaurant-pizza",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"pizza","brand:wikidata":"Q6134929"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},removeTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",cuisine:"pizza",name:"Shakey's"},reference:{key:"cuisine",value:"pizza"},matchScore:2,suggestion:true},"amenity/restaurant/american/Shari's":{name:"Shari's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7489612"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},removeTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",cuisine:"american",name:"Shari's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/american/Shoney's":{name:"Shoney's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7500392"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},removeTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",cuisine:"american",name:"Shoney's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1848822"},addTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},removeTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},matchScore:2,suggestion:true},"amenity/restaurant/american/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q151224"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"american",name:"Skyline Chili"},removeTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",cuisine:"american",name:"Skyline Chili"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7545728"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},removeTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",cuisine:"pancake",name:"Smitty's"},matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7581546"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},removeTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",cuisine:"steak_house",name:"Spur"},matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7605233"},addTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},removeTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},matchScore:2,suggestion:true},"amenity/restaurant/Sunset Grill":{name:"Sunset Grill",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7641264"},addTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},removeTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Swiss Chalet":{name:"Swiss Chalet",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2372909"},addTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"},removeTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",cuisine:"chicken",name:"Swiss Chalet"},matchScore:2,suggestion:true},"amenity/restaurant/american/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1524184"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},removeTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",cuisine:"american",name:"TGI Friday's"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7707945"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},removeTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",cuisine:"steak_house",name:"Texas Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"cake",name:"The Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",cuisine:"cake",name:"The Cheesecake Factory"},matchScore:2,suggestion:true},"amenity/restaurant/The Keg":{name:"The Keg",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7744066"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},removeTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",cuisine:"steak_house",name:"The Keg"},matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7811777"},addTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},removeTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},matchScore:2,suggestion:true},"amenity/restaurant/mexican/Toks":{name:"Toks",icon:"fas-pepper-hot",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"mexican","brand:wikidata":"Q48835586"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},removeTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",cuisine:"mexican",name:"Toks"},reference:{key:"cuisine",value:"mexican"},matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2213883"},addTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},removeTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",cuisine:"barbecue",name:"Tony Roma's"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Vapiano":{name:"Vapiano",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q506252"},addTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},removeTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/american/Village Inn":{name:"Village Inn",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q7930659"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},removeTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",cuisine:"american",name:"Village Inn"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q12599540"},addTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},removeTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},matchScore:2,suggestion:true},"amenity/restaurant/american/Waffle House":{name:"Waffle House",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"american","brand:wikidata":"Q1701206"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House"},removeTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",cuisine:"american",name:"Waffle House"},reference:{key:"cuisine",value:"american"},matchScore:2,suggestion:true},"amenity/restaurant/asian/Wagamama":{name:"Wagamama",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"asian","brand:wikidata":"Q503715"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},removeTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",cuisine:"asian",name:"Wagamama"},reference:{key:"cuisine",value:"asian"},matchScore:2,suggestion:true},"amenity/restaurant/japanese/Wasabi":{name:"Wasabi",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"japanese","brand:wikidata":"Q23891278"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},removeTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",cuisine:"japanese",name:"Wasabi"},reference:{key:"cuisine",value:"japanese"},matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7995414"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},removeTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"},matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8025339"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},removeTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"},matchScore:2,suggestion:true},"amenity/restaurant/sushi/YO! Sushi":{name:"YO! Sushi",icon:"fas-fish",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"sushi","brand:wikidata":"Q3105441"},addTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},removeTags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"},reference:{key:"cuisine",value:"sushi"},matchScore:2,suggestion:true},"amenity/restaurant/italian/Zizzi":{name:"Zizzi",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"italian","brand:wikidata":"Q8072944"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},removeTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"},reference:{key:"cuisine",value:"italian"},matchScore:2,suggestion:true},"amenity/restaurant/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11275674"},addTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},removeTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},matchScore:2,suggestion:true},"amenity/restaurant/びっくりドンキー":{name:"びっくりドンキー",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11276815"},addTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},removeTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},matchScore:2,suggestion:true},"amenity/restaurant/やよい軒":{name:"やよい軒",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11280577"},addTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},removeTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},matchScore:2,suggestion:true},"amenity/restaurant/ガスト":{name:"ガスト",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},removeTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},matchScore:2,suggestion:true},"amenity/restaurant/ココス":{name:"ココス",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11301951"},addTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},removeTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},matchScore:2,suggestion:true},"amenity/restaurant/サイゼリヤ":{name:"サイゼリヤ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q886564"},addTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},removeTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},matchScore:2,suggestion:true},"amenity/restaurant/ジョイフル":{name:"ジョイフル",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310517"},addTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},removeTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},matchScore:2,suggestion:true},"amenity/restaurant/ジョナサン":{name:"ジョナサン",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310628"},addTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},removeTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},matchScore:2,suggestion:true},"amenity/restaurant/ジョリーパスタ":{name:"ジョリーパスタ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q10852718"},addTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},removeTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},matchScore:2,suggestion:true},"amenity/restaurant/デニーズ":{name:"デニーズ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11320661"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},removeTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},matchScore:2,suggestion:true},"amenity/restaurant/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11328598"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},removeTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},matchScore:2,suggestion:true},"amenity/restaurant/ビッグボーイ":{name:"ビッグボーイ",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},removeTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},matchScore:2,suggestion:true},"amenity/restaurant/リンガーハット":{name:"リンガーハット",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7334856"},addTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},removeTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},matchScore:2,suggestion:true},"amenity/restaurant/ロイヤルホスト":{name:"ロイヤルホスト",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11120884"},addTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},removeTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},matchScore:2,suggestion:true},"amenity/restaurant/noodle/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"noodle","brand:wikidata":"Q10877253"},addTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},removeTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},reference:{key:"cuisine",value:"noodle"},matchScore:2,suggestion:true},"amenity/restaurant/八方雲集":{name:"八方雲集",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q28417381"},addTags:{amenity:"restaurant",brand:"八方雲集","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集",name:"八方雲集"},removeTags:{amenity:"restaurant",brand:"八方雲集","brand:wikidata":"Q28417381","brand:wikipedia":"zh:八方雲集",name:"八方雲集"},matchScore:2,suggestion:true},"amenity/restaurant/和食さと":{name:"和食さと",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11304897"},addTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},removeTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},matchScore:2,suggestion:true},"amenity/restaurant/夢庵":{name:"夢庵",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},removeTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},matchScore:2,suggestion:true},"amenity/restaurant/japanese/大戸屋":{name:"大戸屋",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"japanese","brand:wikidata":"Q11435522"},addTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},removeTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},reference:{key:"cuisine",value:"japanese"},matchScore:2,suggestion:true},"amenity/restaurant/大阪王将":{name:"大阪王将",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q48743717"},addTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},removeTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},matchScore:2,suggestion:true},"amenity/restaurant/天下一品":{name:"天下一品",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11442172"},addTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},removeTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},matchScore:2,suggestion:true},"amenity/restaurant/安楽亭":{name:"安楽亭",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11450866"},addTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},removeTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},matchScore:2,suggestion:true},"amenity/restaurant/noodle/日高屋":{name:"日高屋",icon:"maki-restaurant-noodle",geometry:["point","area"],tags:{amenity:"restaurant",cuisine:"noodle","brand:wikidata":"Q11326050"},addTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},removeTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},reference:{key:"cuisine",value:"noodle"},matchScore:2,suggestion:true},"amenity/restaurant/永和豆漿":{name:"永和豆漿",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11131335"},addTags:{amenity:"restaurant",brand:"永和豆漿","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆浆",name:"永和豆漿"},removeTags:{amenity:"restaurant",brand:"永和豆漿","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆浆",name:"永和豆漿"},matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11349387"},addTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},removeTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},matchScore:2,suggestion:true},"amenity/restaurant/餃子の王将":{name:"餃子の王将",icon:"maki-restaurant",geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11666805"},addTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},removeTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in","brand:wikidata":"Q489815"},addTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/public_transport_tickets/KKM":{name:"KKM",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"public_transport_tickets","brand:wikidata":"Q57515549"},addTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},removeTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},reference:{key:"vending",value:"public_transport_tickets"},matchScore:2,suggestion:true},"amenity/vending_machine/parcel_pickup_dropoff/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in","brand:wikidata":"Q3182097"},addTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q7305489"},addTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},removeTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},matchScore:2,suggestion:true},"amenity/vending_machine/Robidog":{name:"Robidog",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q2159689"},addTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog"},removeTags:{amenity:"vending_machine",brand:"Robidog","brand:wikidata":"Q2159689","brand:wikipedia":"de:Robidog",name:"Robidog"},matchScore:2,suggestion:true},"amenity/vending_machine/Tobaccoland":{name:"Tobaccoland",icon:"temaki-vending_machine",geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q1439872"},addTags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland"},removeTags:{amenity:"vending_machine",brand:"Tobaccoland","brand:wikidata":"Q1439872","brand:wikipedia":"de:Tobaccoland Automatengesellschaft",name:"Tobaccoland"},matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"temaki-veterinary_care",geometry:["point","area"],tags:{amenity:"veterinary","brand:wikidata":"Q2882416"},addTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},removeTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},matchScore:2,suggestion:true},"leisure/fitness_centre/24 Hour Fitness":{name:"24 Hour Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4631849"},addTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},removeTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Anytime Fitness":{name:"Anytime Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4778364"},addTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},removeTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Curves":{name:"Curves",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q5196080"},addTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},removeTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},matchScore:2,suggestion:true},"leisure/fitness_centre/Gold's Gym":{name:"Gold's Gym",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q1536234"},addTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},removeTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},matchScore:2,suggestion:true},"leisure/fitness_centre/LA Fitness":{name:"LA Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q6457180"},addTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},removeTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Planet Fitness":{name:"Planet Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7201095"},addTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},removeTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/PureGym":{name:"PureGym",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q18345898"},addTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},removeTags:{brand:"PureGym","brand:wikidata":"Q18345898","brand:wikipedia":"en:PureGym",leisure:"fitness_centre",name:"PureGym"},matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7547254"},addTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},removeTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/YMCA":{name:"YMCA",icon:"fas-dumbbell",geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q157169"},addTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},removeTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},matchScore:2,suggestion:true},"shop/alcohol/Alko":{name:"Alko",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1849187"},addTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},removeTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BC Liquor Store":{name:"BC Liquor Store",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q43079557"},addTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},removeTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BWS":{name:"BWS",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q4836848"},addTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},removeTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Bargain Booze":{name:"Bargain Booze",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16971315"},addTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},removeTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BevMo!":{name:"BevMo!",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q4899308"},addTags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"},removeTags:{brand:"BevMo!","brand:wikidata":"Q4899308","brand:wikipedia":"en:BevMo!",name:"BevMo!",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Dan Murphy's":{name:"Dan Murphy's",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q5214075"},addTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},removeTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Gall & Gall":{name:"Gall & Gall",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q13639185"},addTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},removeTags:{brand:"Gall & Gall","brand:wikidata":"Q13639185","brand:wikipedia":"nl:Gall & Gall",name:"Gall & Gall",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q845263"},addTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},removeTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Liquorland":{name:"Liquorland",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q2283837"},addTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},removeTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Nicolas":{name:"Nicolas",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3340012"},addTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},removeTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/SAQ":{name:"SAQ",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3488077"},addTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},removeTags:{brand:"SAQ","brand:wikidata":"Q3488077","brand:wikipedia":"en:Société des alcools du Québec",name:"SAQ",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Spec's":{name:"Spec's",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7574415"},addTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},removeTags:{brand:"Spec's","brand:wikidata":"Q7574415","brand:wikipedia":"en:Spec's Wine, Spirits & Finer Foods",name:"Spec's",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1476113"},addTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},removeTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/The Beer Store":{name:"The Beer Store",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16243674"},addTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},removeTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Total Wine":{name:"Total Wine",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7828084"},addTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"},removeTags:{brand:"Total Wine","brand:wikidata":"Q7828084","brand:wikipedia":"en:Total Wine & More",name:"Total Wine",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Vinmonopolet":{name:"Vinmonopolet",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1740534"},addTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},removeTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Virginia ABC":{name:"Virginia ABC",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q7934236"},addTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},removeTags:{brand:"Virginia ABC","brand:wikidata":"Q7934236","brand:wikipedia":"en:Virginia Alcoholic Beverage Control Authority",name:"Virginia ABC",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q24933790"},addTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},removeTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Лион":{name:"Лион",icon:"maki-alcohol-shop",geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3241775"},addTags:{brand:"Лион","brand:wikidata":"Q3241775","brand:wikipedia":"en:Lion (Australasian company)",name:"Лион",shop:"alcohol"},removeTags:{brand:"Лион","brand:wikidata":"Q3241775","brand:wikipedia":"en:Lion (Australasian company)",name:"Лион",shop:"alcohol"},matchScore:2,suggestion:true},"shop/baby_goods/Babies R Us":{name:"Babies R Us",icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q696334"},addTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},removeTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/baby_goods/BabyOne":{name:"BabyOne",icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q57540408"},addTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},removeTags:{brand:"BabyOne","brand:wikidata":"Q57540408",name:"BabyOne",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"maki-shop",geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q136738"},addTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},removeTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/bakery/Anker":{name:"Anker",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q557116"},addTags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"},removeTags:{brand:"Anker","brand:wikidata":"Q557116","brand:wikipedia":"de:Ankerbrot",name:"Anker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Backwerk":{name:"Backwerk",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q798298"},addTags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"},removeTags:{brand:"BackWerk","brand:wikidata":"Q798298","brand:wikipedia":"de:BackWerk",name:"Backwerk",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Bakers Delight":{name:"Bakers Delight",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q4849261"},addTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},removeTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Bakker Bart":{name:"Bakker Bart",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2177445"},addTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},removeTags:{brand:"Bakker Bart","brand:wikidata":"Q2177445","brand:wikipedia":"nl:Bakker Bart",name:"Bakker Bart",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Banette":{name:"Banette",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2882405"},addTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},removeTags:{brand:"Banette","brand:wikidata":"Q2882405","brand:wikipedia":"fr:Banette (entreprise)",name:"Banette",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Bäckerei Fuchs":{name:"Bäckerei Fuchs",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q42825993"},addTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},removeTags:{brand:"Bäckerei Fuchs","brand:wikidata":"Q42825993","brand:wikipedia":"de:Harald Fuchs Bäckerei – Konditorei",name:"Bäckerei Fuchs",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q5167971"},addTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},removeTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Der Beck":{name:"Der Beck",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1192443"},addTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},removeTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ditsch":{name:"Ditsch",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q911573"},addTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},removeTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Fornetti":{name:"Fornetti",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1003020"},addTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},removeTags:{brand:"Fornetti","brand:wikidata":"Q1003020","brand:wikipedia":"en:Fornetti",name:"Fornetti",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Goldilocks":{name:"Goldilocks",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q5580198"},addTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},removeTags:{brand:"Goldilocks","brand:wikidata":"Q5580198","brand:wikipedia":"en:Goldilocks Bakeshop",name:"Goldilocks",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3403981"},addTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},removeTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Hofpfisterei":{name:"Hofpfisterei",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1623217"},addTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},removeTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ihle":{name:"Ihle",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q881821"},addTags:{brand:"Ihle","brand:wikidata":"Q881821","brand:wikipedia":"en:Ihle",name:"Ihle",shop:"bakery"},removeTags:{brand:"Ihle","brand:wikidata":"Q881821","brand:wikipedia":"en:Ihle",name:"Ihle",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/K&U Bäckerei":{name:"K&U Bäckerei",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1719433"},addTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},removeTags:{brand:"K&U Bäckerei","brand:wikidata":"Q1719433","brand:wikipedia":"de:K & U Bäckerei",name:"K&U Bäckerei",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1723381"},addTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},removeTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/La Mie Câline":{name:"La Mie Câline",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3210704"},addTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},removeTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Le Crobag":{name:"Le Crobag",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1558025"},addTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},removeTags:{brand:"Le Crobag","brand:wikidata":"Q1558025","brand:wikipedia":"de:Le Crobag",name:"Le Crobag",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516591"},addTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},removeTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Musmanni":{name:"Musmanni",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q19382082"},addTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},removeTags:{brand:"Musmanni","brand:wikidata":"Q19382082","brand:wikipedia":"no:Musmanni",name:"Musmanni",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Paul":{name:"Paul",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3370417"},addTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},removeTags:{brand:"Paul","brand:wikidata":"Q3370417","brand:wikipedia":"en:Paul (bakery)",name:"Paul",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q7304789"},addTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},removeTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ronde des Pains":{name:"Ronde des Pains",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3441707"},addTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},removeTags:{brand:"Ronde des Pains","brand:wikidata":"Q3441707","brand:wikipedia":"fr:Ronde des Pains",name:"Ronde des Pains",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Sehne":{name:"Sehne",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1314761"},addTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},removeTags:{brand:"Sehne","brand:wikidata":"Q1314761","brand:wikipedia":"de:Sehne Backwaren",name:"Sehne",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516278"},addTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},removeTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ströck":{name:"Ströck",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q2357607"},addTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},removeTags:{brand:"Ströck","brand:wikidata":"Q2357607","brand:wikipedia":"de:Ströck-Brot",name:"Ströck",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Wiener Feinbäcker":{name:"Wiener Feinbäcker",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q15854357"},addTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},removeTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/von Allwörden":{name:"von Allwörden",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q60411349"},addTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},removeTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3535609"},addTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},removeTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},matchScore:2,suggestion:true},"shop/beauty/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q810773"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},removeTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q5413426"},addTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},removeTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Ulta Beauty":{name:"Ulta Beauty",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q7880076"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},removeTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Yves Rocher":{name:"Yves Rocher",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q28496595"},addTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},removeTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},matchScore:2,suggestion:true},"shop/bed/Dreams":{name:"Dreams",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q5306688"},addTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},removeTags:{brand:"Dreams","brand:wikidata":"Q5306688","brand:wikipedia":"en:Dreams (bed retailer)",name:"Dreams",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q18629057"},addTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},removeTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Mattress Firm":{name:"Mattress Firm",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q6791878"},addTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},removeTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleep Number":{name:"Sleep Number",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q7447640"},addTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},removeTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleepy's":{name:"Sleepy's",icon:"maki-lodging",geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q17088336"},addTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},removeTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},matchScore:2,suggestion:true},"shop/beverages/Dursty":{name:"Dursty",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1267518"},addTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},removeTags:{brand:"Dursty","brand:wikidata":"Q1267518","brand:wikipedia":"de:Dursty Getränkemärkte",name:"Dursty",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57450576"},addTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},removeTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Fristo":{name:"Fristo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1465151"},addTags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"},removeTags:{brand:"Fristo","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Fristo Getränkemarkt":{name:"Fristo Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q1465151"},addTags:{brand:"Fristo Getränkemarkt","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo Getränkemarkt",shop:"beverages"},removeTags:{brand:"Fristo Getränkemarkt","brand:wikidata":"Q1465151","brand:wikipedia":"de:Fristo",name:"Fristo Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Getränke Hoffmann":{name:"Getränke Hoffmann",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q19284021"},addTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},removeTags:{brand:"Getränke Hoffmann","brand:wikidata":"Q19284021","brand:wikipedia":"de:Getränke Hoffmann",name:"Getränke Hoffmann",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57557270"},addTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},removeTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Orterer Getränkemarkt":{name:"Orterer Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q23787118"},addTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},removeTags:{brand:"Orterer Getränkemarkt","brand:wikidata":"Q23787118","brand:wikipedia":"de:Orterer Gruppe",name:"Orterer Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57519344"},addTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},removeTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Trinkgut":{name:"Trinkgut",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q2453627"},addTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},removeTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/清心福全":{name:"清心福全",icon:"maki-shop",geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q10391229"},addTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},removeTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},matchScore:2,suggestion:true},"shop/bicycle/Evans Cycles":{name:"Evans Cycles",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q5415901"},addTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},removeTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bicycle/Fri BikeShop":{name:"Fri BikeShop",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q26721030"},addTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},removeTags:{brand:"Fri BikeShop","brand:wikidata":"Q26721030",name:"Fri BikeShop",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bicycle/サイクルベースあさひ":{name:"サイクルベースあさひ",icon:"maki-bicycle",geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q11257202"},addTags:{brand:"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ",shop:"bicycle"},removeTags:{brand:"サイクルベースあさひ","brand:wikidata":"Q11257202","brand:wikipedia":"ja:あさひ (企業)",name:"サイクルベースあさひ",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4897425"},addTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},removeTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Coral":{name:"Coral",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q54621344"},addTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},removeTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Fortuna":{name:"Fortuna",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q25857973"},addTags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"},removeTags:{brand:"Fortuna","brand:wikidata":"Q25857973","brand:wikipedia":"en:Fortuna Entertainment Group",name:"Fortuna",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Ladbrokes":{name:"Ladbrokes",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q1799875"},addTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},removeTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Paddy Power":{name:"Paddy Power",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q3888718"},addTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},removeTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Tipico":{name:"Tipico",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q15851003"},addTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},removeTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/William Hill":{name:"William Hill",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4053147"},addTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},removeTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/ΟΠΑΠ":{name:"ΟΠΑΠ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q2007823"},addTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},removeTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Фонбет":{name:"Фонбет",icon:"maki-shop",geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q49137910"},addTags:{brand:"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет",shop:"bookmaker"},removeTags:{brand:"Фонбет","brand:wikidata":"Q49137910","brand:wikipedia":"ru:Фонбет",name:"Фонбет",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q10403918"},addTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},removeTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},matchScore:2,suggestion:true},"shop/books/Barnes & Noble":{name:"Barnes & Noble",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q795454"},addTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},removeTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},matchScore:2,suggestion:true},"shop/books/Bruna":{name:"Bruna",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3317555"},addTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"nl:Bruna (retail chain)",name:"Bruna",shop:"books"},removeTags:{brand:"Bruna","brand:wikidata":"Q3317555","brand:wikipedia":"nl:Bruna (retail chain)",name:"Bruna",shop:"books"},matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5073540"},addTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},removeTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},matchScore:2,suggestion:true},"shop/books/Empik":{name:"Empik",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3045978"},addTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},removeTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},matchScore:2,suggestion:true},"shop/books/Fnac":{name:"Fnac",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q676585"},addTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},removeTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},matchScore:2,suggestion:true},"shop/books/Half Price Books":{name:"Half Price Books",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5641744"},addTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},removeTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},matchScore:2,suggestion:true},"shop/books/Hugendubel":{name:"Hugendubel",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q1634142"},addTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},removeTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},matchScore:2,suggestion:true},"shop/books/National Book Store":{name:"National Book Store",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q6971094"},addTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},removeTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},matchScore:2,suggestion:true},"shop/books/Standaard Boekhandel":{name:"Standaard Boekhandel",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q3496554"},addTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},removeTags:{brand:"Standaard Boekhandel","brand:wikidata":"Q3496554","brand:wikipedia":"nl:Standaard Boekhandel",name:"Standaard Boekhandel",shop:"books"},matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},matchScore:2,suggestion:true},"shop/books/Thalia":{name:"Thalia",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q2408854"},addTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},removeTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},matchScore:2,suggestion:true},"shop/books/The Works":{name:"The Works",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q7775853"},addTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},removeTags:{brand:"The Works","brand:wikidata":"Q7775853","brand:wikipedia":"en:The Works (retailer)",name:"The Works",shop:"books"},matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q151779"},addTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},removeTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},matchScore:2,suggestion:true},"shop/books/Weltbild":{name:"Weltbild",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q883522"},addTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},removeTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},matchScore:2,suggestion:true},"shop/books/Буквоед":{name:"Буквоед",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q4098549"},addTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},removeTags:{brand:"Буквоед","brand:wikidata":"Q4098549","brand:wikipedia":"ru:Буквоед",name:"Буквоед",shop:"books"},matchScore:2,suggestion:true},"shop/books/Читай-город":{name:"Читай-город",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q4516645"},addTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},removeTags:{brand:"Читай-город","brand:wikidata":"Q4516645","brand:wikipedia":"ru:Читай-город",name:"Читай-город",shop:"books"},matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q893011"},addTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},removeTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},matchScore:2,suggestion:true},"shop/books/新华书店":{name:"新华书店",icon:"maki-shop",geometry:["point","area"],tags:{shop:"books","brand:wikidata":"Q6124193"},addTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},removeTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},matchScore:2,suggestion:true},"shop/butcher/Coqivoire":{name:"Coqivoire",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q60183284"},addTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},removeTags:{brand:"Coqivoire","brand:wikidata":"Q60183284",butcher:"poultry",name:"Coqivoire",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Foani":{name:"Foani",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q60183335"},addTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},removeTags:{brand:"Foani","brand:wikidata":"Q60183335",butcher:"poultry",name:"Foani",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Vinzenzmurr":{name:"Vinzenzmurr",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q2527361"},addTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},removeTags:{brand:"Vinzenzmurr","brand:wikidata":"Q2527361","brand:wikipedia":"de:Vinzenzmurr",name:"Vinzenzmurr",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Великолукский мясокомбинат":{name:"Великолукский мясокомбинат",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q18401767"},addTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},removeTags:{brand:"Великолукский мясокомбинат","brand:wikidata":"Q18401767","brand:wikipedia":"ru:Великолукский мясокомбинат",name:"Великолукский мясокомбинат",shop:"butcher"},matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"fas-bacon",geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q30969660"},addTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},removeTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},matchScore:2,suggestion:true},"shop/car_parts/Advance Auto Parts":{name:"Advance Auto Parts",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4686051"},addTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},removeTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/AutoZone":{name:"AutoZone",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4826087"},addTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},removeTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Halfords":{name:"Halfords",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q3398786"},addTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},removeTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/NAPA Auto Parts":{name:"NAPA Auto Parts",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q6970842"},addTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},removeTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{name:"O'Reilly Auto Parts",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7071951"},addTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},removeTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Repco":{name:"Repco",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q173425"},addTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},removeTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Supercheap Auto":{name:"Supercheap Auto",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7643119"},addTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},removeTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Автомир":{name:"Автомир",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4056321"},addTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},removeTags:{brand:"Автомир","brand:wikidata":"Q4056321","brand:wikipedia":"ru:Автомир (автодилер)",name:"Автомир",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/イエローハット":{name:"イエローハット",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q11285915"},addTags:{brand:"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット",shop:"car_parts"},removeTags:{brand:"イエローハット","brand:wikidata":"Q11285915","brand:wikipedia":"ja:イエローハット",name:"イエローハット",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/オートバックス":{name:"オートバックス",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7886426"},addTags:{brand:"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス",shop:"car_parts"},removeTags:{brand:"オートバックス","brand:wikidata":"Q7886426","brand:wikipedia":"ja:オートバックスセブン",name:"オートバックス",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/タイヤ館":{name:"タイヤ館",icon:"maki-car",geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q11315808"},addTags:{brand:"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館",shop:"car_parts"},removeTags:{brand:"タイヤ館","brand:wikidata":"Q11315808","brand:wikipedia":"ja:タイヤ館",name:"タイヤ館",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q784721"},addTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},removeTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q4654920"},addTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},removeTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Bosch Car Service":{name:"Bosch Car Service",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q234021"},addTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},removeTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Carglass":{name:"Carglass",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q1035997"},addTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},removeTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Feu Vert":{name:"Feu Vert",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3070922"},addTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu Vert (entreprise)",name:"Feu Vert",shop:"car_repair"},removeTags:{brand:"Feu Vert","brand:wikidata":"Q3070922","brand:wikipedia":"fr:Feu Vert (entreprise)",name:"Feu Vert",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q420837"},addTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},removeTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Ford":{name:"Ford",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Goodyear":{name:"Goodyear",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q620875"},addTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},removeTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Grease Monkey":{name:"Grease Monkey",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5598563"},addTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},removeTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Halfords Autocentre":{name:"Halfords Autocentre",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5641894"},addTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},removeTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Jiffy Lube":{name:"Jiffy Lube",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6192247"},addTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},removeTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Kwik Fit":{name:"Kwik Fit",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q958053"},addTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},removeTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Meineke":{name:"Meineke",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6810159"},addTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},removeTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Mekonomen":{name:"Mekonomen",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q10580079"},addTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},removeTags:{brand:"Mekonomen","brand:wikidata":"Q10580079","brand:wikipedia":"sv:Mekonomen",name:"Mekonomen",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3312613"},addTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},removeTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Mr. Lube":{name:"Mr. Lube",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q17104067"},addTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},removeTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Norauto":{name:"Norauto",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3317698"},addTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},removeTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Pep Boys":{name:"Pep Boys",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3375007"},addTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},removeTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Peugeot":{name:"Peugeot",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Point S":{name:"Point S",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3393358"},addTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},removeTags:{brand:"Point S","brand:wikidata":"Q3393358","brand:wikipedia":"fr:Point S",name:"Point S",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Roady":{name:"Roady",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3434112"},addTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},removeTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Safelite AutoGlass":{name:"Safelite AutoGlass",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q28797369"},addTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",name:"Safelite AutoGlass",shop:"car_repair"},removeTags:{brand:"Safelite AutoGlass","brand:wikidata":"Q28797369","brand:wikipedia":"en:Safelite",operator:"Belron","operator:wikidata":"Q785614","operator:wikipedia":"en:Belron",name:"Safelite AutoGlass",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Speedy":{name:"Speedy",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3492969"},addTags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"},removeTags:{brand:"Speedy","brand:wikidata":"Q3492969","brand:wikipedia":"fr:Speedy (entreprise)",name:"Speedy",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Speedy Auto Service":{name:"Speedy Auto Service",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q22318193"},addTags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"},removeTags:{brand:"Speedy Auto Service","brand:wikidata":"Q22318193",name:"Speedy Auto Service",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q7912852"},addTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},removeTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},matchScore:2,suggestion:true},"shop/carpet/Carpetright":{name:"Carpetright",icon:"maki-shop",geometry:["point","area"],tags:{shop:"carpet","brand:wikidata":"Q5045782"},addTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},removeTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},matchScore:2,suggestion:true},"shop/car/Audi":{name:"Audi",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q23317"},addTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},removeTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},matchScore:2,suggestion:true},"shop/car/BMW":{name:"BMW",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q26678"},addTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},removeTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},matchScore:2,suggestion:true},"shop/car/Chevrolet":{name:"Chevrolet",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29570"},addTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},removeTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},matchScore:2,suggestion:true},"shop/car/Dacia":{name:"Dacia",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27460"},addTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},removeTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Fiat":{name:"Fiat",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27597"},addTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},removeTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Ford":{name:"Ford",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},matchScore:2,suggestion:true},"shop/car/Honda":{name:"Honda",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Hyundai":{name:"Hyundai",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q55931"},addTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},removeTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},matchScore:2,suggestion:true},"shop/car/Isuzu":{name:"Isuzu",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29803"},addTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},removeTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},matchScore:2,suggestion:true},"shop/car/Kia":{name:"Kia",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35349"},addTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},removeTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Land Rover":{name:"Land Rover",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35907"},addTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},removeTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},matchScore:2,suggestion:true},"shop/car/Lexus":{name:"Lexus",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35919"},addTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},removeTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mazda":{name:"Mazda",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35996"},addTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},removeTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mercedes-Benz":{name:"Mercedes-Benz",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36008"},addTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},removeTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mitsubishi":{name:"Mitsubishi",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36033"},addTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},removeTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},matchScore:2,suggestion:true},"shop/car/Netz":{name:"Netz",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q11325416"},addTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},removeTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Nissan":{name:"Nissan",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q20165"},addTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},removeTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},matchScore:2,suggestion:true},"shop/car/Opel":{name:"Opel",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40966"},addTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},removeTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},matchScore:2,suggestion:true},"shop/car/Peugeot":{name:"Peugeot",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},matchScore:2,suggestion:true},"shop/car/Porsche":{name:"Porsche",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40993"},addTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},removeTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},matchScore:2,suggestion:true},"shop/car/Renault":{name:"Renault",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},matchScore:2,suggestion:true},"shop/car/Seat":{name:"Seat",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q188217"},addTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},removeTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Skoda":{name:"Skoda",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29637"},addTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},removeTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Subaru":{name:"Subaru",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q172741"},addTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},removeTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},matchScore:2,suggestion:true},"shop/car/Suzuki":{name:"Suzuki",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},matchScore:2,suggestion:true},"shop/car/Tesla":{name:"Tesla",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q478214"},addTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},removeTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},matchScore:2,suggestion:true},"shop/car/Toyota":{name:"Toyota",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volkswagen":{name:"Volkswagen",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q246"},addTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},removeTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volvo":{name:"Volvo",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q215293"},addTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},removeTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},matchScore:2,suggestion:true},"shop/car/ホンダ":{name:"ホンダ",icon:"maki-car",geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},removeTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/catalogue/Argos":{name:"Argos",icon:"maki-shop",geometry:["point","area"],tags:{shop:"catalogue","brand:wikidata":"Q4789707"},addTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},removeTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},matchScore:2,suggestion:true},"shop/charity/Age UK":{name:"Age UK",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4691850"},addTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},removeTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Barnardo's":{name:"Barnardo's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q2884670"},addTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},removeTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Heart Foundation":{name:"British Heart Foundation",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970039"},addTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},removeTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Red Cross":{name:"British Red Cross",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970966"},addTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},removeTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Cancer Research UK":{name:"Cancer Research UK",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q326079"},addTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},removeTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Goodwill":{name:"Goodwill",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q5583655"},addTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},removeTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Mind":{name:"Mind",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q3314763"},addTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},removeTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Myrorna":{name:"Myrorna",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q10592609"},addTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},removeTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Oxfam":{name:"Oxfam",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q267941"},addTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},removeTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/RSPCA":{name:"RSPCA",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q584819"},addTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},removeTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Salvation Army":{name:"Salvation Army",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},removeTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Scope":{name:"Scope",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7434435"},addTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},removeTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Sue Ryder":{name:"Sue Ryder",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7634271"},addTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},removeTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/The Salvation Army":{name:"The Salvation Army",icon:"maki-shop",geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},removeTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/chemist/Bipa":{name:"Bipa",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q864933"},addTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},removeTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Budnikowsky":{name:"Budnikowsky",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q1001516"},addTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},removeTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Drogeria Natura":{name:"Drogeria Natura",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q9212032"},addTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},removeTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Etos":{name:"Etos",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2609459"},addTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},removeTags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2226366"},addTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},removeTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Matas":{name:"Matas",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q6786143"},addTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},removeTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Rossmann":{name:"Rossmann",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q316004"},addTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},removeTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Teta":{name:"Teta",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q20860823"},addTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},removeTags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Trekpleister":{name:"Trekpleister",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2551576"},addTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},removeTags:{brand:"Trekpleister","brand:wikidata":"Q2551576","brand:wikipedia":"nl:Trekpleister (drogisterij)",name:"Trekpleister",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q266572"},addTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},removeTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/康是美":{name:"康是美",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q11063876"},addTags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"},removeTags:{brand:"康是美","brand:wikidata":"Q11063876","brand:wikipedia":"zh:康是美藥妝店",name:"康是美",shop:"chemist"},matchScore:2,suggestion:true},"shop/chocolate/Cacau Show":{name:"Cacau Show",icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q9671713"},addTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},removeTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},matchScore:2,suggestion:true},"shop/chocolate/Leonidas":{name:"Leonidas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q80335"},addTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},removeTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},matchScore:2,suggestion:true},"shop/clothes/Abercrombie & Fitch":{name:"Abercrombie & Fitch",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q319344"},addTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},removeTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},removeTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4674255"},addTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},removeTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Aeropostale":{name:"Aeropostale",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q794565"},addTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},removeTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Apparel":{name:"American Apparel",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q463378"},addTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},removeTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2842931"},addTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},removeTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ann Taylor":{name:"Ann Taylor",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4766699"},addTags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Ann Taylor",shop:"clothes"},removeTags:{brand:"Ann Taylor","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Ann Taylor",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Anthropologie":{name:"Anthropologie",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4773903"},addTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},removeTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ardene":{name:"Ardene",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2860764"},addTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},removeTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Armand Thiery":{name:"Armand Thiery",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2861975"},addTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},removeTags:{brand:"Armand Thiery","brand:wikidata":"Q2861975","brand:wikipedia":"fr:Armand Thiery",name:"Armand Thiery",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Armani Exchange":{name:"Armani Exchange",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q56045740"},addTags:{brand:"Armani Exchange","brand:wikidata":"Q56045740","operator:wikidata":"Q2861975","operator:wikipedia":"en:Armani",name:"Armani Exchange",shop:"clothes"},removeTags:{brand:"Armani Exchange","brand:wikidata":"Q56045740","operator:wikidata":"Q2861975","operator:wikipedia":"en:Armani",name:"Armani Exchange",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q806085"},addTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},removeTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bershka":{name:"Bershka",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q827258"},addTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},removeTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Betty Barclay":{name:"Betty Barclay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q850250"},addTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},removeTags:{brand:"Betty Barclay","brand:wikidata":"Q850250","brand:wikipedia":"de:Betty Barclay",name:"Betty Barclay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Big Star":{name:"Big Star",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q9171569"},addTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},removeTags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bonita":{name:"Bonita",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q945463"},addTags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"},removeTags:{brand:"Bonita","brand:wikidata":"Q945463","brand:wikipedia":"en:Bonia (fashion)",name:"Bonita",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bonobo":{name:"Bonobo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4942546"},addTags:{brand:"Bonobo","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",name:"Bonobo",shop:"clothes"},removeTags:{brand:"Bonobo","brand:wikidata":"Q4942546","brand:wikipedia":"en:Bonobos (apparel)",name:"Bonobo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Brice":{name:"Brice",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2925067"},addTags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"},removeTags:{brand:"Brice","brand:wikidata":"Q2925067","brand:wikipedia":"fr:Brice (enseigne)",name:"Brice",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q929722"},addTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},removeTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burberry":{name:"Burberry",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q390107"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},removeTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4999220"},addTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},removeTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burton":{name:"Burton",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5000795"},addTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},removeTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/C&A":{name:"C&A",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q701338"},addTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},removeTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/COS":{name:"COS",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q60772401"},addTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (Collection Of Style)",name:"COS",shop:"clothes"},removeTags:{brand:"COS","brand:wikidata":"Q60772401","brand:wikipedia":"en:COS (Collection Of Style)",name:"COS",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1068628"},addTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},removeTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calzedonia":{name:"Calzedonia",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1027874"},addTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},removeTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camaïeu":{name:"Camaïeu",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2934647"},addTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},removeTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camp David":{name:"Camp David",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q50540636"},addTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},removeTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Carter's":{name:"Carter's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5047083"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},removeTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Cato":{name:"Cato",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q16956136"},addTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},removeTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2672003"},addTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},removeTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charles Vögele":{name:"Charles Vögele",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1066326"},addTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},removeTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5086126"},addTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},removeTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Chico's":{name:"Chico's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5096393"},addTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},removeTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Christopher & Banks":{name:"Christopher & Banks",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5111816"},addTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},removeTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Colin's":{name:"Colin's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28729658"},addTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},removeTags:{brand:"Colin's","brand:wikidata":"Q28729658",name:"Colin's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1112588"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},removeTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Cubus":{name:"Cubus",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3439593"},addTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},removeTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/David's Bridal":{name:"David's Bridal",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5230388"},addTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},removeTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Desigual":{name:"Desigual",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q83750"},addTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},removeTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Devred":{name:"Devred",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3025542"},addTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},removeTags:{brand:"Devred","brand:wikidata":"Q3025542","brand:wikipedia":"fr:Devred 1902",name:"Devred",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q158285"},addTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},removeTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Diverse":{name:"Diverse",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11694298"},addTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},removeTags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5298588"},addTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},removeTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dress Barn":{name:"Dress Barn",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5307031"},addTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},removeTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dressmann":{name:"Dressmann",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3357081"},addTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},removeTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Eddie Bauer":{name:"Eddie Bauer",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q842174"},addTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},removeTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Engbers":{name:"Engbers",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1290088"},addTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},removeTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ernsting's family":{name:"Ernsting's family",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1361016"},addTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},removeTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Esprit":{name:"Esprit",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q532746"},addTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},removeTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Etam":{name:"Etam",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3059202"},addTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},removeTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Express":{name:"Express",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1384784"},addTags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"},removeTags:{brand:"Express","brand:wikidata":"Q1384784","brand:wikipedia":"en:Express, Inc.",name:"Express",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Fat Face":{name:"Fat Face",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5437186"},addTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},removeTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1060537"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},removeTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gant":{name:"Gant",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1493667"},addTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},removeTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gap":{name:"Gap",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q420822"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},removeTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q873447"},addTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},removeTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gina Laura":{name:"Gina Laura",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2700576"},addTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},removeTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gucci":{name:"Gucci",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q178516"},addTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},removeTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Guess":{name:"Guess",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2470307"},addTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},removeTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gymboree":{name:"Gymboree",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4039771"},addTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},removeTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gémo":{name:"Gémo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3122954"},addTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},removeTags:{brand:"Gémo","brand:wikidata":"Q3122954","brand:wikipedia":"fr:Gémo",name:"Gémo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q188326"},addTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},removeTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1571714"},addTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},removeTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1257477"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},removeTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hot Topic":{name:"Hot Topic",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q9294032"},addTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},removeTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hugo Boss":{name:"Hugo Boss",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q491627"},addTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},removeTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2604175"},addTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},removeTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Intimissimi":{name:"Intimissimi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q305404"},addTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},removeTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/JBC":{name:"JBC",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2671470"},addTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},removeTags:{brand:"JBC","brand:wikidata":"Q2671470","brand:wikipedia":"nl:JBC",name:"JBC",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6077665"},addTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},removeTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jack Wills":{name:"Jack Wills",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6115814"},addTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},removeTags:{brand:"Jack Wills","brand:wikidata":"Q6115814","brand:wikipedia":"en:Jack Wills",name:"Jack Wills",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jeans Fritz":{name:"Jeans Fritz",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1686071"},addTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},removeTags:{brand:"Jeans Fritz","brand:wikidata":"Q1686071","brand:wikipedia":"de:Jeans Fritz",name:"Jeans Fritz",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jennyfer":{name:"Jennyfer",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3177174"},addTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},removeTags:{brand:"Jennyfer","brand:wikidata":"Q3177174","brand:wikipedia":"fr:Jennyfer",name:"Jennyfer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jigsaw":{name:"Jigsaw",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6192383"},addTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},removeTags:{brand:"Jigsaw","brand:wikidata":"Q6192383","brand:wikipedia":"en:Jigsaw (clothing retailer)",name:"Jigsaw",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q25351738"},addTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},removeTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Justice":{name:"Justice",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7857512"},addTags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"},removeTags:{brand:"Justice","brand:wikidata":"Q7857512","brand:wikipedia":"en:Tween Brands",name:"Justice",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/KappAhl":{name:"KappAhl",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4349016"},addTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},removeTags:{brand:"KappAhl","brand:wikidata":"Q4349016","brand:wikipedia":"sv:Kappahl",name:"KappAhl",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q883965"},addTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},removeTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Kiabi":{name:"Kiabi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3196299"},addTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},removeTags:{brand:"Kiabi","brand:wikidata":"Q3196299","brand:wikipedia":"fr:Kiabi",name:"Kiabi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/LC Waikiki":{name:"LC Waikiki",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3205965"},addTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},removeTags:{brand:"LC Waikiki","brand:wikidata":"Q3205965","brand:wikipedia":"fr:LC Waikiki",name:"LC Waikiki",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3212802"},addTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},removeTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lacoste":{name:"Lacoste",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q309031"},addTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},removeTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lane Bryant":{name:"Lane Bryant",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6485350"},addTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},removeTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Levi's":{name:"Levi's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q127962"},addTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},removeTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lindex":{name:"Lindex",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1786717"},addTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},removeTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Loft":{name:"Loft",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4766699"},addTags:{brand:"Loft","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Loft",shop:"clothes"},removeTags:{brand:"Loft","brand:wikidata":"Q4766699","brand:wikipedia":"en:Ann Inc.",name:"Loft",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Louis Vuitton":{name:"Louis Vuitton",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q191485"},addTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},removeTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/M&Co":{name:"M&Co",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6711808"},addTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},removeTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mango":{name:"Mango",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q136503"},addTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},removeTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Marc O'Polo":{name:"Marc O'Polo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1892752"},addTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},removeTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mark's":{name:"Mark's",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6766373"},addTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},removeTags:{brand:"Mark's","brand:wikidata":"Q6766373","brand:wikipedia":"en:Mark's",name:"Mark's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q714491"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"clothes"},removeTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q788231"},addTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},removeTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Matalan":{name:"Matalan",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12061509"},addTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},removeTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Maurices":{name:"Maurices",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6793571"},addTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},removeTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Max Mara":{name:"Max Mara",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1151774"},addTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},removeTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Men's Wearhouse":{name:"Men's Wearhouse",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q57405513"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},removeTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1837290"},addTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},removeTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Michael Kors":{name:"Michael Kors",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q19572998"},addTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},removeTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Monsoon":{name:"Monsoon",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},removeTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mr Price":{name:"Mr Price",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6929120"},addTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},removeTags:{brand:"Mr Price","brand:wikidata":"Q6929120","brand:wikipedia":"en:Mr. Price",name:"Mr Price",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q927272"},addTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},removeTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Naf Naf":{name:"Naf Naf",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3334188"},addTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},removeTags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12063852"},addTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},removeTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q706421"},addTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},removeTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Next":{name:"Next",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q246655"},addTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},removeTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nike":{name:"Nike",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q483915"},addTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},removeTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nordstrom Rack":{name:"Nordstrom Rack",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21463374"},addTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},removeTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/OVS":{name:"OVS",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2042514"},addTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},removeTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Okaïdi":{name:"Okaïdi",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3350027"},addTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},removeTags:{brand:"Okaïdi","brand:wikidata":"Q3350027","brand:wikipedia":"fr:Okaïdi",name:"Okaïdi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2735242"},addTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},removeTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Only":{name:"Only",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q61799370"},addTags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only","operator:wikidata":"Q28172489","operator:wikipedia":"Bestseller (company)",shop:"clothes"},removeTags:{brand:"Only","brand:wikidata":"Q61799370",name:"Only","operator:wikidata":"Q28172489","operator:wikipedia":"Bestseller (company)",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Orchestra":{name:"Orchestra",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28042940"},addTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},removeTags:{brand:"Orchestra","brand:wikidata":"Q28042940","brand:wikipedia":"fr:Orchestra Prémaman",name:"Orchestra",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Orsay":{name:"Orsay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q883245"},addTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},removeTags:{brand:"Orsay","brand:wikidata":"Q883245","brand:wikipedia":"de:Orsay (Modeunternehmen)",name:"Orsay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7112061"},addTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},removeTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Oysho":{name:"Oysho",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3327046"},addTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},removeTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/PacSun":{name:"PacSun",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7121857"},addTags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"},removeTags:{brand:"PacSun","brand:wikidata":"Q7121857","brand:wikipedia":"en:PacSun",name:"PacSun",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Palmers":{name:"Palmers",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1509985"},addTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},removeTags:{brand:"Palmers","brand:wikidata":"Q1509985","brand:wikipedia":"de:Palmers",name:"Palmers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7157762"},addTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},removeTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peek & Cloppenburg":{name:"Peek & Cloppenburg",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2066959"},addTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},removeTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pep":{name:"Pep",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7166182"},addTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},removeTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pepco":{name:"Pepco",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11815580"},addTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},removeTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Petit Bateau":{name:"Petit Bateau",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3377090"},addTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},removeTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Phase Eight":{name:"Phase Eight",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q17020730"},addTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},removeTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1758066"},addTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},removeTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Plato's Closet":{name:"Plato's Closet",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q61779112"},addTags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",operator:"Winmark","operator:wikidata":"Q28048853","operator:wikipedia":"en:Winmark",second_hand:"only",shop:"clothes"},removeTags:{brand:"Plato's Closet","brand:wikidata":"Q61779112",name:"Plato's Closet",operator:"Winmark","operator:wikidata":"Q28048853","operator:wikipedia":"en:Winmark",second_hand:"only",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Primark":{name:"Primark",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q137023"},addTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},removeTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Promod":{name:"Promod",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3407429"},addTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},removeTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pull & Bear":{name:"Pull & Bear",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q691029"},addTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},removeTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Puma":{name:"Puma",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7203029"},addTags:{brand:"Puma","brand:wikidata":"Q7203029","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"},removeTags:{brand:"Puma","brand:wikidata":"Q7203029","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Rainbow":{name:"Rainbow",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7284708"},addTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},removeTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reebok":{name:"Reebok",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q466183"},addTags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"},removeTags:{brand:"Reebok","brand:wikidata":"Q466183","brand:wikipedia":"en:Reebok",name:"Reebok",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7310506"},addTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},removeTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reserved":{name:"Reserved",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21809354"},addTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},removeTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/River Island":{name:"River Island",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2670328"},addTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},removeTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ross":{name:"Ross",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3442791"},addTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},removeTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Sisley":{name:"Sisley",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12054325"},addTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",shop:"clothes"},removeTags:{brand:"Sisley","brand:wikidata":"Q12054325","brand:wikipedia":"cs:Sisley",name:"Sisley",operator:"Benetton Group","operator:wikidata":"Q817139","operator:wikipedia":"en:Benetton Group",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Springfield":{name:"Springfield",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q958209"},addTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},removeTags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stefanel":{name:"Stefanel",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2338087"},addTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},removeTags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3322945"},addTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},removeTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Suburbia":{name:"Suburbia",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6134992"},addTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},removeTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Superdry":{name:"Superdry",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1684445"},addTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},removeTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TJ Maxx":{name:"TJ Maxx",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q10860683"},addTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},removeTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TK Maxx":{name:"TK Maxx",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q23823668"},addTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},removeTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Takko":{name:"Takko",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1371302"},addTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},removeTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Talbots":{name:"Talbots",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7679064"},addTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},removeTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tally Weijl":{name:"Tally Weijl",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q689695"},addTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},removeTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tati":{name:"Tati",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3516026"},addTags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"},removeTags:{brand:"Tati","brand:wikidata":"Q3516026","brand:wikipedia":"fr:Tati (entreprise)",name:"Tati",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tezenis":{name:"Tezenis",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q28056374"},addTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},removeTags:{brand:"Tezenis","brand:wikidata":"Q28056374",name:"Tezenis",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3520257"},addTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},removeTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The North Face":{name:"The North Face",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q152784"},addTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},removeTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The Sting":{name:"The Sting",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2518794"},addTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},removeTags:{brand:"The Sting","brand:wikidata":"Q2518794","brand:wikipedia":"nl:The Sting Companies",name:"The Sting",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1539185"},addTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},removeTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tom Tailor":{name:"Tom Tailor",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q571206"},addTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},removeTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tommy Hilfiger":{name:"Tommy Hilfiger",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q634881"},addTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},removeTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Topshop":{name:"Topshop",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1893576"},addTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},removeTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Torrid":{name:"Torrid",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7827120"},addTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},removeTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Triumph":{name:"Triumph",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q671216"},addTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},removeTags:{brand:"Triumph","brand:wikidata":"Q671216","brand:wikipedia":"en:Triumph International",name:"Triumph",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q24233998"},addTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},removeTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2475146"},addTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},removeTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Uniqlo":{name:"Uniqlo",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},removeTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/United Colors of Benetton":{name:"United Colors of Benetton",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q817139"},addTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},removeTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3552193"},addTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},removeTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Vero Moda":{name:"Vero Moda",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q594721"},addTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},removeTags:{brand:"Vero Moda","brand:wikidata":"Q594721","brand:wikipedia":"en:Bestseller (company)",name:"Vero Moda",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q332477"},addTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},removeTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/WE":{name:"WE",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1987861"},addTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},removeTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7994858"},addTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},removeTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White Stuff":{name:"White Stuff",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7995442"},addTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},removeTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Wibra":{name:"Wibra",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q943405"},addTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},removeTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Winners":{name:"Winners",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q845257"},addTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},removeTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8033997"},addTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},removeTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Yamamay":{name:"Yamamay",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2599214"},addTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},removeTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q147662"},addTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},removeTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zeeman":{name:"Zeeman",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q184399"},addTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},removeTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zumiez":{name:"Zumiez",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8075252"},addTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},removeTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/mister*lady":{name:"mister*lady",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q18640136"},addTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:mister*lady",name:"mister*lady",shop:"clothes"},removeTags:{brand:"mister*lady","brand:wikidata":"Q18640136","brand:wikipedia":"de:mister*lady",name:"mister*lady",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7377762"},addTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},removeTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/s.Oliver":{name:"s.Oliver",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q265056"},addTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},removeTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/しまむら":{name:"しまむら",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7758173"},addTags:{brand:"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら",shop:"clothes"},removeTags:{brand:"しまむら","brand:wikidata":"Q7758173","brand:wikipedia":"ja:しまむら",name:"しまむら",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/はるやま":{name:"はるやま",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11275918"},addTags:{brand:"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま",shop:"clothes"},removeTags:{brand:"はるやま","brand:wikidata":"Q11275918","brand:wikipedia":"ja:はるやま商事",name:"はるやま",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},removeTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/ワークマン":{name:"ワークマン",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11351660"},addTags:{brand:"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン",shop:"clothes"},removeTags:{brand:"ワークマン","brand:wikidata":"Q11351660","brand:wikipedia":"ja:ワークマン",name:"ワークマン",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/洋服の青山":{name:"洋服の青山",icon:"maki-clothing-store",geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11661241"},addTags:{brand:"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山",shop:"clothes"},removeTags:{brand:"洋服の青山","brand:wikidata":"Q11661241","brand:wikipedia":"ja:青山商事",name:"洋服の青山",shop:"clothes"},matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q301301"},addTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},removeTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},matchScore:2,suggestion:true},"shop/coffee/Tchibo":{name:"Tchibo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q564213"},addTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},removeTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},matchScore:2,suggestion:true},"shop/computer/PC World":{name:"PC World",icon:"maki-shop",geometry:["point","area"],tags:{shop:"computer","brand:wikidata":"Q7118727"},addTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},removeTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},matchScore:2,suggestion:true},"shop/confectionery/Adyar Ananda Bhavan":{name:"Adyar Ananda Bhavan",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q15178238"},addTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},removeTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},matchScore:2,suggestion:true},"shop/confectionery/Hemmakvall":{name:"Hemmakvall",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q10521791"},addTags:{amenity:"confectionery","brand:wikipedia":"sv:Hemmakväll","brand:wikidata":"Q10521791",name:"Hemmakväll"},removeTags:{amenity:"confectionery","brand:wikipedia":"sv:Hemmakväll","brand:wikidata":"Q10521791",name:"Hemmakväll"},matchScore:2,suggestion:true},"shop/confectionery/Hussel":{name:"Hussel",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q17123688"},addTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},removeTags:{brand:"Hussel","brand:wikidata":"Q17123688","brand:wikipedia":"de:Hussel",name:"Hussel",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/Jamin":{name:"Jamin",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q2291848"},addTags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"},removeTags:{brand:"Jamin","brand:wikidata":"Q2291848","brand:wikipedia":"nl:Jamin",name:"Jamin",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q683102"},addTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},removeTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/Вацак":{name:"Вацак",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q30966576"},addTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},removeTags:{brand:"Вацак","brand:wikidata":"Q30966576","brand:wikipedia":"uk:Кондитерський Дім «Вацак»",name:"Вацак",shop:"confectionery"},matchScore:2,suggestion:true},"shop/confectionery/シャトレーゼ":{name:"シャトレーゼ",icon:"maki-confectionery",geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q11307696"},addTags:{brand:"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ",shop:"confectionery"},removeTags:{brand:"シャトレーゼ","brand:wikidata":"Q11307696","brand:wikipedia":"ja:シャトレーゼ",name:"シャトレーゼ",shop:"confectionery"},matchScore:2,suggestion:true},"shop/convenience/7-Eleven":{name:"7-Eleven",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},removeTags:{brand:"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2818601"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},removeTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ABC":{name:"ABC",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4650251"},addTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},removeTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Aibė":{name:"Aibė",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1022952"},addTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},removeTags:{brand:"Aibė","brand:wikidata":"Q1022952","brand:wikipedia":"de:Aibė",name:"Aibė",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Albert Heijn to go":{name:"Albert Heijn to go",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1653985"},addTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},removeTags:{brand:"Albert Heijn to go","brand:wikidata":"Q1653985","brand:wikipedia":"en:Albert Heijn",name:"Albert Heijn to go",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Alfamidi":{name:"Alfamidi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q12471462"},addTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},removeTags:{brand:"Alfamidi","brand:wikidata":"Q12471462","brand:wikipedia":"id:Alfamidi",name:"Alfamidi",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q152057"},addTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},removeTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Buc-ee's":{name:"Buc-ee's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4982335"},addTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},removeTags:{brand:"Buc-ee's","brand:wikidata":"Q4982335","brand:wikipedia":"en:Buc-ee's",name:"Buc-ee's",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Circle K":{name:"Circle K",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},removeTags:{brand:"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Co-op":{name:"Co-op",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Coop Pronto":{name:"Coop Pronto",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1129777"},addTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},removeTags:{brand:"Coop Pronto","brand:wikidata":"Q1129777","brand:wikipedia":"de:Coop Mineraloel",name:"Coop Pronto",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},removeTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Four Square":{name:"Four Square",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5475558"},addTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},removeTags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q58022603"},addTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},removeTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Intermarché Contact":{name:"Intermarché Contact",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},removeTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Jacksons":{name:"Jacksons",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q6117880"},addTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},removeTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/K-Market":{name:"K-Market",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11868562"},addTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},removeTags:{brand:"K-Market","brand:wikidata":"Q11868562","brand:wikipedia":"fi:K-Market",name:"K-Market",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q6450420"},addTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},removeTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Lawson":{name:"Lawson",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},removeTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Mace":{name:"Mace",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q17089386"},addTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},removeTags:{brand:"Mace","brand:wikidata":"Q17089386","brand:wikipedia":"en:Mace (shop)",name:"Mace",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q458363"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},removeTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q18431946"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},removeTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16997477"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},removeTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Migrolino":{name:"Migrolino",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q56745088"},addTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},removeTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},removeTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3088656"},addTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},removeTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Nisa":{name:"Nisa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16999069"},addTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},removeTags:{brand:"Nisa","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Nisa Local":{name:"Nisa Local",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16999069"},addTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},removeTags:{brand:"Nisa Local","brand:wikidata":"Q16999069","brand:wikipedia":"en:Nisa (retailer)",name:"Nisa Local",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/OK便利商店":{name:"OK便利商店",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},removeTags:{brand:"OK便利商店","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"zh:OK便利店",name:"OK便利商店","name:en":"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16931259"},addTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},removeTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Oxxo":{name:"Oxxo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Petro-Canada":{name:"Petro-Canada",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1208279"},addTags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"},removeTags:{brand:"Petro-Canada","brand:wikidata":"Q1208279","brand:wikipedia":"en:Petro-Canada",name:"Petro-Canada",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Plaid Pantry":{name:"Plaid Pantry",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7200591"},addTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},removeTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Premier":{name:"Premier",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7240340"},addTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},removeTags:{brand:"Premier","brand:wikidata":"Q7240340","brand:wikipedia":"en:Premier Stores",name:"Premier",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sainsbury's Local":{name:"Sainsbury's Local",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q13218434"},addTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},removeTags:{brand:"Sainsbury's Local","brand:wikidata":"Q13218434","brand:wikipedia":"en:Sainsbury's Local",name:"Sainsbury's Local",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7492551"},addTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},removeTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Shell Select":{name:"Shell Select",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q154950"},addTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},removeTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Siwa":{name:"Siwa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11893827"},addTags:{brand:"Siwa","brand:wikidata":"Q11893827",name:"Siwa",shop:"convenience"},removeTags:{brand:"Siwa","brand:wikidata":"Q11893827",name:"Siwa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Spar":{name:"Spar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Spar Express":{name:"Spar Express",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar Express",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7575683"},addTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},removeTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Społem":{name:"Społem",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11826043"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"},removeTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Stripes":{name:"Stripes",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7624135"},addTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},removeTags:{brand:"Stripes","brand:wikidata":"Q7624135","brand:wikipedia":"en:Stripes Convenience Stores",name:"Stripes",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Tiger Mart":{name:"Tiger Mart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q57643977"},addTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},removeTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/United Dairy Farmers":{name:"United Dairy Farmers",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7887677"},addTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},removeTags:{amenity:"ice_cream",brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience",short_name:"UDF"},matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2529029"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},removeTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/VinMart+":{name:"VinMart+",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q60245505"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},removeTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5936320"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},removeTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Weltladen":{name:"Weltladen",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1640782"},addTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},removeTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5023980"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},removeTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/abc":{name:"abc",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11683985"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},removeTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q306960"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},removeTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2589061"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},removeTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ВкусВилл":{name:"ВкусВилл",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q57271676"},addTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:ВкусВилл",name:"ВкусВилл",shop:"convenience"},removeTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:ВкусВилл",name:"ВкусВилл",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Доброном":{name:"Доброном",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2565040"},addTags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"},removeTags:{brand:"Доброном","brand:wikidata":"Q2565040","brand:wikipedia":"be:Eurotorg",name:"Доброном",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1783878"},addTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},removeTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Магнит":{name:"Магнит",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Сельпо":{name:"Сельпо",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4419434"},addTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},removeTags:{brand:"Сельпо","brand:wikidata":"Q4419434","brand:wikipedia":"ru:Сильпо",name:"Сельпо",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サンクス":{name:"サンクス",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16141064"},addTags:{brand:"サンクス","brand:en":"Sunkus","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus",shop:"convenience"},removeTags:{brand:"サンクス","brand:en":"Sunkus","brand:wikidata":"Q16141064","brand:wikipedia":"ja:サークルKサンクス",name:"サンクス","name:en":"Sunkus",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},removeTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/スリーエフ":{name:"スリーエフ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11313419"},addTags:{brand:"スリーエフ","brand:en":"Three F","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F",shop:"convenience"},removeTags:{brand:"スリーエフ","brand:en":"Three F","brand:wikidata":"Q11313419","brand:wikipedia":"ja:スリーエフ",name:"スリーエフ","name:en":"Three F",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314123"},addTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},removeTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セブン-イレブン":{name:"セブン-イレブン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セーブオン":{name:"セーブオン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314868"},addTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},removeTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/デイリーヤマザキ":{name:"デイリーヤマザキ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5209392"},addTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},removeTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ナチュラルローソン":{name:"ナチュラルローソン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11323850"},addTags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson",shop:"convenience"},removeTags:{brand:"ナチュラルローソン","brand:en":"NATURAL LAWSON","brand:wikidata":"Q11323850","brand:wikipedia":"ja:ナチュラルローソン",name:"ナチュラルローソン","name:en":"Natural Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ファミリーマート":{name:"ファミリーマート",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ポプラ":{name:"ポプラ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7229380"},addTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},removeTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ミニストップ":{name:"ミニストップ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},removeTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11345131"},addTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},removeTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},removeTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11350960"},addTags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100",shop:"convenience"},removeTags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/全家":{name:"全家",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/全家便利商店":{name:"全家便利商店",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q10891564"},addTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},removeTags:{brand:"全家便利商店","brand:wikidata":"Q10891564","brand:wikipedia":"zh:全家便利商店",name:"全家便利商店",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/萊爾富":{name:"萊爾富",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11326216"},addTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},removeTags:{brand:"萊爾富","brand:wikidata":"Q11326216","brand:wikipedia":"zh:萊爾富",name:"萊爾富",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"maki-shop",geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/copyshop/FedEx Office":{name:"FedEx Office",icon:"fas-print",geometry:["point","area"],tags:{shop:"copyshop","brand:wikidata":"Q474379"},addTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},removeTags:{brand:"FedEx Office","brand:wikidata":"Q474379","brand:wikipedia":"en:FedEx Office",name:"FedEx Office",shop:"copyshop"},matchScore:2,suggestion:true},"shop/cosmetics/KIKO Milano":{name:"KIKO Milano",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q3812045"},addTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},removeTags:{brand:"KIKO Milano","brand:wikidata":"Q3812045","brand:wikipedia":"it:KIKO",name:"KIKO Milano",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q1585448"},addTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},removeTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Nocibé":{name:"Nocibé",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q3342592"},addTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},removeTags:{brand:"Nocibé","brand:wikidata":"Q3342592","brand:wikipedia":"fr:Nocibé",name:"Nocibé",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Origins":{name:"Origins",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q6643229"},addTags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"},removeTags:{brand:"Origins","brand:wikidata":"Q6643229","brand:wikipedia":"en:Origins (cosmetics)",name:"Origins",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q2408041"},addTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},removeTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/The Body Shop":{name:"The Body Shop",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q837851"},addTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},removeTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Л'Этуаль":{name:"Л'Этуаль",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q18400706"},addTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},removeTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Магнит Косметик":{name:"Магнит Косметик",icon:"maki-shop",geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q940518"},addTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},removeTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/country_store/Rural King":{name:"Rural King",icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q7380525"},addTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},removeTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},matchScore:2,suggestion:true},"shop/country_store/Tractor Supply Company":{name:"Tractor Supply Company",icon:"maki-shop",geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q15109925"},addTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},removeTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},matchScore:2,suggestion:true},"shop/craft/Hobby Lobby":{name:"Hobby Lobby",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q5874938"},addTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},removeTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Hobbycraft":{name:"Hobbycraft",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q16984508"},addTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},removeTags:{brand:"Hobbycraft","brand:wikidata":"Q16984508","brand:wikipedia":"en:Hobbycraft",name:"Hobbycraft",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Jo-Ann":{name:"Jo-Ann",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q6203968"},addTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},removeTags:{brand:"Jo-Ann","brand:wikidata":"Q6203968","brand:wikipedia":"en:Jo-Ann Stores",name:"Jo-Ann",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"maki-shop",geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q6835667"},addTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},removeTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},matchScore:2,suggestion:true},"shop/department_store/Belk":{name:"Belk",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q127428"},addTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},removeTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big Lots":{name:"Big Lots",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4905973"},addTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},removeTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big W":{name:"Big W",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4906646"},addTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},removeTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Canadian Tire":{name:"Canadian Tire",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1032400"},addTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},removeTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Coppel":{name:"Coppel",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2497795"},addTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},removeTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Debenhams":{name:"Debenhams",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1181484"},addTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},removeTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Dillard's":{name:"Dillard's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q844805"},addTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},removeTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/El Corte Inglés":{name:"El Corte Inglés",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q623133"},addTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},removeTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Falabella":{name:"Falabella",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q5135229"},addTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},removeTags:{brand:"Falabella","brand:wikidata":"Q5135229","brand:wikipedia":"en:Falabella (retail store)",name:"Falabella",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q322598"},addTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},removeTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Giant Tiger":{name:"Giant Tiger",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q5558429"},addTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},removeTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/HEMA":{name:"HEMA",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q903805"},addTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},removeTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Harvey Norman":{name:"Harvey Norman",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4040441"},addTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},removeTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/JCPenney":{name:"JCPenney",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q920037"},addTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},removeTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Karstadt":{name:"Karstadt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q182910"},addTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},removeTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kmart (Australia)":{name:"Kmart (Australia)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6421682"},addTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},removeTags:{brand:"Kmart","brand:wikidata":"Q6421682","brand:wikipedia":"en:Kmart Australia",name:"Kmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kmart (USA)":{name:"Kmart (USA)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1753080"},addTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},removeTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kohl's":{name:"Kohl's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q967265"},addTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},removeTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Lojas Americanas":{name:"Lojas Americanas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3064093"},addTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},removeTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Macy's":{name:"Macy's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q629269"},addTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},removeTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q714491"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},removeTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marshalls":{name:"Marshalls",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q15903261"},addTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},removeTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Myer":{name:"Myer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1110323"},addTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},removeTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Neiman Marcus":{name:"Neiman Marcus",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q743497"},addTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},removeTags:{brand:"Neiman Marcus","brand:wikidata":"Q743497","brand:wikipedia":"en:Neiman Marcus",name:"Neiman Marcus",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q174310"},addTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},removeTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Oechsle":{name:"Oechsle",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6049096"},addTags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"},removeTags:{brand:"Oechsle","brand:wikidata":"Q6049096","brand:wikipedia":"es:Oechsle",name:"Oechsle",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/París":{name:"París",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q20812805"},addTags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",shop:"department_store"},removeTags:{brand:"París","brand:wikidata":"Q20812805","brand:wikipedia":"en:París (retail store)",name:"París",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Ripley":{name:"Ripley",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3433040"},addTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},removeTags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Saks Fifth Avenue":{name:"Saks Fifth Avenue",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2723882"},addTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},removeTags:{brand:"Saks Fifth Avenue","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Fifth Avenue",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Saks Off 5th":{name:"Saks Off 5th",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2723882"},addTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},removeTags:{brand:"Saks Off 5th","brand:wikidata":"Q2723882","brand:wikipedia":"en:Saks Fifth Avenue",name:"Saks Off 5th",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6499202"},addTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},removeTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7501155"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},removeTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (Australia)":{name:"Target (Australia)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7685854"},addTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (USA)":{name:"Target (USA)",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1046951"},addTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/The Warehouse":{name:"The Warehouse",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3566291"},addTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},removeTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Walmart":{name:"Walmart",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Woolworth":{name:"Woolworth",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q183538"},addTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},removeTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Åhléns":{name:"Åhléns",icon:"maki-shop",geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q270851"},addTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},removeTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},matchScore:2,suggestion:true},"shop/doityourself/Ace Hardware":{name:"Ace Hardware",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4672981"},addTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},removeTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/B&Q":{name:"B&Q",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q707602"},addTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},removeTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bauhaus":{name:"Bauhaus",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q672043"},addTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},removeTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Biltema":{name:"Biltema",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3355552"},addTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},removeTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico":{name:"Brico",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2510786"},addTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},removeTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico Dépôt":{name:"Brico Dépôt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2889702"},addTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},removeTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricoman":{name:"Bricoman",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925142"},addTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},removeTags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925147"},addTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},removeTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricorama":{name:"Bricorama",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925146"},addTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},removeTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bunnings Warehouse":{name:"Bunnings Warehouse",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4997829"},addTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},removeTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Castorama":{name:"Castorama",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q966971"},addTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},removeTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Clas Ohlson":{name:"Clas Ohlson",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3356220"},addTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},removeTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Easy":{name:"Easy",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q5331091"},addTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},removeTags:{brand:"Easy","brand:wikidata":"Q5331091","brand:wikipedia":"en:Easy (store)",name:"Easy",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2294120"},addTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},removeTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Globus Baumarkt":{name:"Globus Baumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q457503"},addTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},removeTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hagebaumarkt":{name:"Hagebaumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1568279"},addTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},removeTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hammer":{name:"Hammer",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q52159668"},addTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},removeTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hellweg":{name:"Hellweg",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1603084"},addTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},removeTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Building Centre":{name:"Home Building Centre",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3139611"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"},removeTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Building Centre",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Depot":{name:"Home Depot",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q864407"},addTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},removeTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Hardware Building Centre":{name:"Home Hardware Building Centre",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3139611"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"},removeTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware Building Centre",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Homebase":{name:"Homebase",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q9293447"},addTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},removeTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hornbach":{name:"Hornbach",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q685926"},addTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},removeTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hubo":{name:"Hubo",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3142153"},addTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},removeTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Jewson":{name:"Jewson",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q6190226"},addTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},removeTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Karwei":{name:"Karwei",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2097480"},addTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},removeTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Lagerhaus":{name:"Lagerhaus",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q10553211"},addTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"doityourself"},removeTags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Lowe's":{name:"Lowe's",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1373493"},addTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},removeTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Menards":{name:"Menards",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1639897"},addTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},removeTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Mr.Bricolage":{name:"Mr.Bricolage",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3141657"},addTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},removeTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/OBI":{name:"OBI",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q300518"},addTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},removeTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Point P":{name:"Point P",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3393350"},addTags:{brand:"Point P","brand:wikidata":"Q3393350","brand:wikipedia":"fr:Saint-Gobain Distribution Bâtiment France",name:"Point P",shop:"doityourself"},removeTags:{brand:"Point P","brand:wikidata":"Q3393350","brand:wikipedia":"fr:Saint-Gobain Distribution Bâtiment France",name:"Point P",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q680214"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},removeTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Praxis":{name:"Praxis",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2741995"},addTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},removeTags:{brand:"Praxis","brand:wikidata":"Q2741995","brand:wikipedia":"nl:Praxis (winkel)",name:"Praxis",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Promart":{name:"Promart",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q17626095"},addTags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"},removeTags:{brand:"Promart","brand:wikidata":"Q17626095","brand:wikipedia":"en:Promart",name:"Promart",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3415283"},addTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},removeTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Screwfix":{name:"Screwfix",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7439115"},addTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},removeTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Sodimac":{name:"Sodimac",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7553274"},addTags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"},removeTags:{brand:"Sodimac","brand:wikidata":"Q7553274","brand:wikipedia":"es:Sodimac",name:"Sodimac",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Sonderpreis Baumarkt":{name:"Sonderpreis Baumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q811530"},addTags:{brand:"Sonderpreis Baumarkt","brand:wikidata":"Q811530","brand:wikipedia":"de:Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"},removeTags:{brand:"Sonderpreis Baumarkt","brand:wikidata":"Q811530","brand:wikipedia":"de:Baumarkt",name:"Sonderpreis Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Tekzen":{name:"Tekzen",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q25475379"},addTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},removeTags:{brand:"Tekzen","brand:wikidata":"Q25475379","brand:wikipedia":"tr:Tekzen",name:"Tekzen",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2442970"},addTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},removeTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Travis Perkins":{name:"Travis Perkins",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2450664"},addTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},removeTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Weldom":{name:"Weldom",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q16683226"},addTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},removeTags:{brand:"Weldom","brand:wikidata":"Q16683226","brand:wikipedia":"fr:Weldom",name:"Weldom",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7998350"},addTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},removeTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/jem & fix":{name:"jem & fix",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q12319200"},addTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:jem & fix",name:"jem & fix",shop:"doityourself"},removeTags:{brand:"jem & fix","brand:wikidata":"Q12319200","brand:wikipedia":"da:jem & fix",name:"jem & fix",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/カインズホーム":{name:"カインズホーム",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11293852"},addTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home",shop:"doityourself"},removeTags:{brand:"カインズホーム","brand:en":"Cainz Home","brand:wikidata":"Q11293852","brand:wikipedia":"ja:カインズ",name:"カインズホーム","name:en":"Cainz Home",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11302690"},addTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},removeTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コーナン":{name:"コーナン",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11303403"},addTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},removeTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},matchScore:2,suggestion:true},"shop/dry_cleaning/ホワイト急便":{name:"ホワイト急便",icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning","brand:wikidata":"Q11505557"},addTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin",shop:"dry_cleaning"},removeTags:{brand:"ホワイト急便","brand:en":"White Kyuubin","brand:wikidata":"Q11505557","brand:wikipedia":"ja:日本さわやかグループ",name:"ホワイト急便","name:en":"White Kyuubin",shop:"dry_cleaning"},matchScore:2,suggestion:true},"shop/dry_cleaning/白洋舎":{name:"白洋舎",icon:"maki-shop",geometry:["point","area"],tags:{shop:"dry_cleaning","brand:wikidata":"Q11579995"},addTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},removeTags:{brand:"白洋舎","brand:en":"Hakuyosha","brand:wikidata":"Q11579995","brand:wikipedia":"ja:白洋舎",name:"白洋舎","name:en":"Hakuyosha",shop:"dry_cleaning"},matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q421253"},addTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},removeTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Batteries Plus Bulbs":{name:"Batteries Plus Bulbs",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17005157"},addTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},removeTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Best Buy":{name:"Best Buy",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q533415"},addTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},removeTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Boulanger":{name:"Boulanger",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2921695"},addTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},removeTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/CeX":{name:"CeX",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q5055676"},addTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},removeTags:{brand:"CeX","brand:wikidata":"Q5055676","brand:wikipedia":"en:CeX (company)",name:"CeX",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3246464"},addTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},removeTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys PC World":{name:"Currys PC World",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7118727"},addTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},removeTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Darty":{name:"Darty",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3117381"},addTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},removeTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Elgiganten":{name:"Elgiganten",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17050121"},addTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},removeTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Euronics":{name:"Euronics",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q184860"},addTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},removeTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Expert":{name:"Expert",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q680990"},addTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},removeTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Hartlauer":{name:"Hartlauer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1587223"},addTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},removeTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Interdiscount":{name:"Interdiscount",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1665980"},addTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},removeTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/JB Hi-Fi":{name:"JB Hi-Fi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3310113"},addTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},removeTags:{brand:"JB Hi-Fi","brand:wikidata":"Q3310113","brand:wikipedia":"en:JB Hi-Fi",name:"JB Hi-Fi",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6419332"},addTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},removeTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Komputronik":{name:"Komputronik",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11742085"},addTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},removeTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/La Curacao":{name:"La Curacao",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q5194599"},addTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},removeTags:{brand:"La Curacao","brand:wikidata":"Q5194599","brand:wikipedia":"en:Curacao (retail store)",name:"La Curacao",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6754124"},addTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},removeTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Media Expert":{name:"Media Expert",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11776794"},addTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},removeTags:{brand:"Media Expert","brand:wikidata":"Q11776794","brand:wikipedia":"pl:Media Expert",name:"Media Expert",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2381223"},addTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},removeTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Musimundo":{name:"Musimundo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6034719"},addTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},removeTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Neonet":{name:"Neonet",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11790622"},addTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},removeTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/RTV Euro AGD":{name:"RTV Euro AGD",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7277895"},addTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},removeTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/RadioShack":{name:"RadioShack",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1195490"},addTags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"},removeTags:{brand:"RadioShack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"RadioShack",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Samsung":{name:"Samsung",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q20718"},addTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},removeTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Saturn":{name:"Saturn",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2543504"},addTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},removeTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Sony":{name:"Sony",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q41187"},addTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},removeTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Teknikmagasinet":{name:"Teknikmagasinet",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3357520"},addTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},removeTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/The Source":{name:"The Source",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3212934"},addTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},removeTags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q4004687"},addTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},removeTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Worten":{name:"Worten",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10394039"},addTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},removeTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/М.Видео":{name:"М.Видео",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6558800"},addTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},removeTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Фокстрот":{name:"Фокстрот",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q16721578"},addTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},removeTags:{brand:"Фокстрот","brand:wikidata":"Q16721578","brand:wikipedia":"uk:Фокстрот (торгова мережа)",name:"Фокстрот",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Эльдорадо":{name:"Эльдорадо",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q4531492"},addTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},removeTags:{brand:"Эльдорадо","brand:wikidata":"Q4531492","brand:wikipedia":"ru:Эльдорадо (сеть магазинов)",name:"Эльдорадо",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/エディオン":{name:"エディオン",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11290252"},addTags:{brand:"エディオン","brand:en":"EDION","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION",shop:"electronics"},removeTags:{brand:"エディオン","brand:en":"EDION","brand:wikidata":"Q11290252","brand:wikipedia":"ja:エディオン",name:"エディオン","name:en":"EDION",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/ケーズデンキ":{name:"ケーズデンキ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6322472"},addTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki",shop:"electronics"},removeTags:{brand:"ケーズデンキ","brand:en":"K's Denki","brand:wikidata":"Q6322472","brand:wikipedia":"ja:ケーズホールディングス",name:"ケーズデンキ","name:en":"K's Denki",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11302052"},addTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},removeTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/ヤマダ電機":{name:"ヤマダ電機",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1096390"},addTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},removeTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/全國電子":{name:"全國電子",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10891540"},addTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},removeTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/燦坤3C":{name:"燦坤3C",icon:"maki-shop",geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11569285"},addTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},removeTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},matchScore:2,suggestion:true},"shop/erotic/Orion":{name:"Orion",icon:"maki-shop",geometry:["point","area"],tags:{shop:"erotic","brand:wikidata":"Q1609577"},addTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},removeTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},matchScore:2,suggestion:true},"shop/fabric/Mondial Tissus":{name:"Mondial Tissus",icon:"maki-shop",geometry:["point","area"],tags:{shop:"fabric","brand:wikidata":"Q17635288"},addTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},removeTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},matchScore:2,suggestion:true},"shop/florist/Blume 2000":{name:"Blume 2000",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886166"},addTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},removeTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Blumen Risse":{name:"Blumen Risse",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886177"},addTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},removeTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Interflora":{name:"Interflora",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q692179"},addTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},removeTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Monceau Fleurs":{name:"Monceau Fleurs",icon:"maki-florist",geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q17629431"},addTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},removeTags:{brand:"Monceau Fleurs","brand:wikidata":"Q17629431","brand:wikipedia":"fr:Emova Group",name:"Monceau Fleurs",shop:"florist"},matchScore:2,suggestion:true},"shop/frozen_food/Picard":{name:"Picard",icon:"maki-shop",geometry:["point","area"],tags:{shop:"frozen_food","brand:wikidata":"Q3382454"},addTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},removeTags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"},matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",geometry:["point","area"],tags:{shop:"funeral_directors","brand:wikidata":"Q7726521"},addTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},removeTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},matchScore:2,suggestion:true},"shop/furniture/Aaron's":{name:"Aaron's",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q10397787"},addTags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"},removeTags:{brand:"Aaron's","brand:wikidata":"Q10397787","brand:wikipedia":"en:Aaron's, Inc.",name:"Aaron's",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Ashley HomeStore":{name:"Ashley HomeStore",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q4805437"},addTags:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",shop:"furniture"},removeTags:{brand:"Ashley HomeStore","brand:wikidata":"Q4805437","brand:wikipedia":"en:Ashley HomeStore",name:"Ashley Furniture",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Black Red White":{name:"Black Red White",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q4921546"},addTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},removeTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Bodzio":{name:"Bodzio",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q20034845"},addTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},removeTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/But":{name:"But",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q18720442"},addTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},removeTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Conforama":{name:"Conforama",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q541134"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},removeTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Crate & Barrel":{name:"Crate & Barrel",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5182604"},addTags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"},removeTags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5204927"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},removeTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},removeTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Ethan Allen":{name:"Ethan Allen",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5402870"},addTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},removeTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Fly":{name:"Fly",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q1389184"},addTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},removeTags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5677754"},addTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},removeTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Havertys":{name:"Havertys",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5683881"},addTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},removeTags:{brand:"Havertys","brand:wikidata":"Q5683881","brand:wikipedia":"en:Havertys",name:"Havertys",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q54078"},addTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},removeTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/JYSK":{name:"JYSK",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},removeTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/La-Z-Boy":{name:"La-Z-Boy",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q6391583"},addTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},removeTags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7313497"},addTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},removeTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Restoration Hardware":{name:"Restoration Hardware",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7316207"},addTags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"},removeTags:{brand:"Restoration Hardware","brand:wikidata":"Q7316207","brand:wikipedia":"en:Restoration Hardware",name:"Restoration Hardware",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Roller":{name:"Roller",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q1621286"},addTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},removeTags:{brand:"Roller","brand:wikidata":"Q1621286","brand:wikipedia":"de:Roller (Möbelhaus)",name:"Roller",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rooms To Go":{name:"Rooms To Go",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7366329"},addTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},removeTags:{brand:"Rooms To Go","brand:wikidata":"Q7366329","brand:wikipedia":"en:Rooms To Go",name:"Rooms To Go",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/ScS":{name:"ScS",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q19654399"},addTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},removeTags:{brand:"ScS","brand:wikidata":"Q19654399","brand:wikipedia":"en:ScS",name:"ScS",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7720000"},addTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},removeTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q10801453"},addTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},removeTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},matchScore:2,suggestion:true},"shop/garden_centre/Dehner":{name:"Dehner",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q1183029"},addTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},removeTags:{brand:"Dehner","brand:wikidata":"Q1183029","brand:wikipedia":"de:Dehner",name:"Dehner",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3095006"},addTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},removeTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Jardiland":{name:"Jardiland",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3162276"},addTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},removeTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Point Vert":{name:"Point Vert",icon:"maki-garden-centre",geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q16661975"},addTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},removeTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/gift/Card Factory":{name:"Card Factory",icon:"maki-gift",geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q5038192"},addTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},removeTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1521910"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},removeTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1720245"},addTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},removeTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},matchScore:2,suggestion:true},"shop/greengrocer/Produce Junction":{name:"Produce Junction",icon:"maki-shop",geometry:["point","area"],tags:{shop:"greengrocer","brand:wikidata":"Q60583541"},addTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},removeTags:{brand:"Produce Junction","brand:wikidata":"Q60583541",name:"Produce Junction",shop:"greengrocer"},matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hairdresser_supply","brand:wikidata":"Q7405065"},addTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},removeTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},matchScore:2,suggestion:true},"shop/hairdresser/Fantastic Sams":{name:"Fantastic Sams",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5434222"},addTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},removeTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/First Choice Haircutters":{name:"First Choice Haircutters",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5452622"},addTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},removeTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Great Clips":{name:"Great Clips",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5598967"},addTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},removeTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Cuttery":{name:"Hair Cuttery",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5639484"},addTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},removeTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Express":{name:"Hair Express",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q57550814"},addTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},removeTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hairkiller":{name:"Hairkiller",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q58305998"},addTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},removeTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Klier":{name:"Klier",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q1465159"},addTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},removeTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Klipp":{name:"Klipp",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q1737304"},addTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},removeTags:{brand:"Klipp","brand:wikidata":"Q1737304","brand:wikipedia":"de:Klipp Frisör",name:"Klipp",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Sport Clips":{name:"Sport Clips",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q7579310"},addTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},removeTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q7643239"},addTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},removeTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Toni & Guy":{name:"Toni & Guy",icon:"temaki-beauty_salon",geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q324784"},addTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},removeTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hardware/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q5654601"},addTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},removeTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},matchScore:2,suggestion:true},"shop/hardware/Home Hardware":{name:"Home Hardware",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q3139611"},addTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"},removeTags:{brand:"Home Hardware","brand:wikidata":"Q3139611","brand:wikipedia":"en:Home Hardware",name:"Home Hardware",shop:"hardware"},matchScore:2,suggestion:true},"shop/hardware/True Value":{name:"True Value",icon:"temaki-tools",geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q7847545"},addTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},removeTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},matchScore:2,suggestion:true},"shop/health_food/Holland & Barrett":{name:"Holland & Barrett",icon:"maki-shop",geometry:["point","area"],tags:{shop:"health_food","brand:wikidata":"Q5880870"},addTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},removeTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q477222"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},removeTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Audika":{name:"Audika",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q2870745"},addTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},removeTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q1497707"},addTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},removeTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{name:"Kind Hörgeräte",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q43598590"},addTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},removeTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Neuroth":{name:"Neuroth",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q15836645"},addTags:{brand:"Neuroth","brand:wikidata":"Q15836645",name:"Neuroth",shop:"hearing_aids"},removeTags:{brand:"Neuroth","brand:wikidata":"Q15836645",name:"Neuroth",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"maki-shop",geometry:["point","area"],tags:{shop:"hifi","brand:wikidata":"Q790020"},addTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},removeTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},matchScore:2,suggestion:true},"shop/houseware/Bed Bath & Beyond":{name:"Bed Bath & Beyond",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q813782"},addTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},removeTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Blokker":{name:"Blokker",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q884934"},addTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},removeTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Cervera":{name:"Cervera",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q10447179"},addTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},removeTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/HomeGoods":{name:"HomeGoods",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q5887941"},addTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},removeTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Marskramer":{name:"Marskramer",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q2305917"},addTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},removeTags:{brand:"Marskramer","brand:wikidata":"Q2305917","brand:wikipedia":"nl:Marskramer (warenhuis)",name:"Marskramer",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Old Time Pottery":{name:"Old Time Pottery",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q7085222"},addTags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"},removeTags:{brand:"Old Time Pottery","brand:website":"http://www.oldtimepottery.com","brand:wikidata":"Q7085222","brand:wikipedia":"en:Old Time Pottery",name:"Old Time Pottery",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Sur La Table":{name:"Sur La Table",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q7645220"},addTags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"},removeTags:{brand:"Sur La Table","brand:wikidata":"Q7645220","brand:wikipedia":"en:Sur La Table",name:"Sur La Table",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Tuesday Morning":{name:"Tuesday Morning",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q7851426"},addTags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"},removeTags:{brand:"Tuesday Morning","brand:wikidata":"Q7851426","brand:wikipedia":"en:Tuesday Morning",name:"Tuesday Morning",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q451423"},addTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},removeTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Xenos":{name:"Xenos",icon:"fas-blender",geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q16547960"},addTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},removeTags:{brand:"Xenos","brand:wikidata":"Q16547960","brand:wikipedia":"nl:Xenos",name:"Xenos",shop:"houseware"},matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q1191740"},addTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},removeTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Hemtex":{name:"Hemtex",icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q10521868"},addTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},removeTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Pier 1 Imports":{name:"Pier 1 Imports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q7191691"},addTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},removeTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/jewelry/Apart":{name:"Apart",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q11686561"},addTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},removeTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Bijou Brigitte":{name:"Bijou Brigitte",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q599545"},addTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},removeTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Cartier":{name:"Cartier",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q538587"},addTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},removeTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Claire's":{name:"Claire's",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q2974996"},addTags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"jewelry"},removeTags:{brand:"Claire's","brand:wikidata":"Q2974996","brand:wikipedia":"en:Claire's",name:"Claire's",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Ernest Jones":{name:"Ernest Jones",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q5393358"},addTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},removeTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Guldfynd":{name:"Guldfynd",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q49099223"},addTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},removeTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/H Samuel":{name:"H Samuel",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q5628558"},addTags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"},removeTags:{brand:"H Samuel","brand:wikidata":"Q5628558","brand:wikipedia":"en:H. Samuel",name:"H Samuel",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q6129024"},addTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},removeTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Kay Jewelers":{name:"Kay Jewelers",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q7611434"},addTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},removeTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Pandora":{name:"Pandora",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q2241604"},addTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},removeTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Swarovski":{name:"Swarovski",icon:"maki-jewelry-store",geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q611115"},addTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},removeTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},matchScore:2,suggestion:true},"shop/kiosk/Lietuvos spauda":{name:"Lietuvos spauda",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6514414"},addTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},removeTags:{brand:"Lietuvos spauda","brand:wikidata":"Q6514414","brand:wikipedia":"lt:Lietuvos spauda",name:"Lietuvos spauda",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6514414"},addTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},removeTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Pressbyrån":{name:"Pressbyrån",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q2489072"},addTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},removeTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/R-Kioski":{name:"R-Kioski",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1571400"},addTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},removeTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Ruch":{name:"Ruch",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1260314"},addTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},removeTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/k kiosk":{name:"k kiosk",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q60381703"},addTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},removeTags:{brand:"k kiosk","brand:wikidata":"Q60381703","brand:wikipedia":"it:K Kiosk",name:"k kiosk",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kitchen/Cuisinella":{name:"Cuisinella",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen","brand:wikidata":"Q3007012"},addTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},removeTags:{brand:"Cuisinella","brand:wikidata":"Q3007012","brand:wikipedia":"fr:Cuisinella",name:"Cuisinella",shop:"kitchen"},matchScore:2,suggestion:true},"shop/kitchen/Schmidt":{name:"Schmidt",icon:"maki-shop",geometry:["point","area"],tags:{shop:"kitchen","brand:wikidata":"Q3487620"},addTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},removeTags:{brand:"Schmidt","brand:wikidata":"Q3487620","brand:wikipedia":"de:Schmidt Groupe",name:"Schmidt",shop:"kitchen"},matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"temaki-spa",geometry:["point","area"],tags:{shop:"massage","brand:wikidata":"Q22922899"},addTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},removeTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},matchScore:2,suggestion:true},"shop/mobile_phone/3 Store":{name:"3 Store",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q407009"},addTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},removeTags:{brand:"3 Store","brand:wikidata":"Q407009","brand:wikipedia":"en:3 (telecommunications)",name:"3 Store",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q298594"},addTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},removeTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Bell":{name:"Bell",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2894594"},addTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},removeTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Boost Mobile":{name:"Boost Mobile",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q4943790"},addTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},removeTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Carphone Warehouse":{name:"Carphone Warehouse",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},removeTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Claro":{name:"Claro",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1770208"},addTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},removeTags:{brand:"Claro","brand:wikidata":"Q1770208","brand:wikipedia":"en:Claro (company)",name:"Claro",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5184987"},addTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},removeTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Digicel":{name:"Digicel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2117506"},addTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},removeTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/EE":{name:"EE",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5322942"},addTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},removeTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Entel":{name:"Entel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5323742"},addTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},removeTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Freedom Mobile":{name:"Freedom Mobile",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q8023931"},addTags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"},removeTags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/MTN":{name:"MTN",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1813361"},addTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},removeTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1925685"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},removeTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q344744"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},removeTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Moov":{name:"Moov",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3323637"},addTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},removeTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Movistar":{name:"Movistar",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q967735"},addTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},removeTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7072246"},addTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},removeTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Orange":{name:"Orange",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1431486"},addTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange S.A.",name:"Orange",shop:"mobile_phone"},removeTags:{brand:"Orange","brand:wikidata":"Q1431486","brand:wikipedia":"fr:Orange S.A.",name:"Orange",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},removeTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7202998"},addTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},removeTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Plus":{name:"Plus",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7205598"},addTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},removeTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Rogers":{name:"Rogers",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3439663"},addTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},removeTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/SFR":{name:"SFR",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q218765"},addTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},removeTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Sprint":{name:"Sprint",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q301965"},addTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},removeTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/T-Mobile":{name:"T-Mobile",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q327634"},addTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},removeTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/TIM":{name:"TIM",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q144617"},addTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},removeTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telcel":{name:"Telcel",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3517255"},addTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},removeTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Tele2":{name:"Tele2",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},removeTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telekom":{name:"Telekom",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q9396"},addTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},removeTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telenor":{name:"Telenor",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q845632"},addTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},removeTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telstra":{name:"Telstra",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q721162"},addTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},removeTags:{brand:"Telstra","brand:wikidata":"Q721162","brand:wikipedia":"en:Telstra",name:"Telstra",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q165858"},addTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},removeTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Turkcell":{name:"Turkcell",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q283852"},addTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},removeTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Télécentre":{name:"Télécentre",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q180034"},addTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},removeTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/U.S. Cellular":{name:"U.S. Cellular",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2466256"},addTags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"},removeTags:{brand:"U.S. Cellular","brand:wikidata":"Q2466256","brand:wikipedia":"en:U.S. Cellular",name:"U.S. Cellular",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Verizon Wireless":{name:"Verizon Wireless",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q919641"},addTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},removeTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Vodafone":{name:"Vodafone",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q122141"},addTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},removeTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/WIFI_ETECSA":{name:"WIFI_ETECSA",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q490323"},addTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},removeTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Wind":{name:"Wind",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q650467"},addTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},removeTags:{brand:"Wind","brand:wikidata":"Q650467","brand:wikipedia":"en:WIND (Italy)",name:"Wind",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2630989"},addTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},removeTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/auショップ":{name:"auショップ",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11190521"},addTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},removeTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Алло":{name:"Алло",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q18683057"},addTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},removeTags:{brand:"Алло","brand:wikidata":"Q18683057","brand:wikipedia":"uk:Алло (торгова мережа)",name:"Алло",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q402880"},addTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},removeTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Евросеть":{name:"Евросеть",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65310"},addTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},removeTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Київстар":{name:"Київстар",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2288463"},addTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},removeTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/МТС":{name:"МТС",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1368919"},addTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},removeTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Мегафон":{name:"Мегафон",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1720713"},addTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},removeTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Связной":{name:"Связной",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65371"},addTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},removeTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Теле2":{name:"Теле2",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},removeTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンク":{name:"ソフトバンク",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7553832"},addTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},removeTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{name:"ソフトバンクショップ",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11315281"},addTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},removeTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ドコモショップ":{name:"ドコモショップ",icon:"maki-mobile-phone",geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q853958"},addTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop",shop:"mobile_phone"},removeTags:{brand:"ドコモショップ","brand:en":"DoCoMo Shop","brand:wikidata":"Q853958","brand:wikipedia":"ja:NTTドコモ",name:"ドコモショップ","name:en":"DoCoMo Shop",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",geometry:["point","area"],tags:{shop:"money_lender","brand:wikidata":"Q6899166"},addTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},removeTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},matchScore:2,suggestion:true},"shop/motorcycle/Harley-Davidson":{name:"Harley-Davidson",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q192814"},addTags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"},removeTags:{brand:"Harley-Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley-Davidson",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Honda":{name:"Honda",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Kawasaki":{name:"Kawasaki",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q6379855"},addTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},removeTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Motortrade":{name:"Motortrade",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q48803162"},addTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},removeTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Suzuki":{name:"Suzuki",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Yamaha":{name:"Yamaha",icon:"fas-motorcycle",geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q158888"},addTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},removeTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/musical_instrument/Guitar Center":{name:"Guitar Center",icon:"maki-music",geometry:["point","area"],tags:{shop:"musical_instrument","brand:wikidata":"Q3622794"},addTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},removeTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},matchScore:2,suggestion:true},"shop/music/HMV":{name:"HMV",icon:"maki-music",geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q10854572"},addTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},removeTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"maki-music",geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},matchScore:2,suggestion:true},"shop/newsagent/Kolporter":{name:"Kolporter",icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent","brand:wikidata":"Q6427874"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},removeTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},matchScore:2,suggestion:true},"shop/newsagent/読売新聞":{name:"読売新聞",icon:"maki-shop",geometry:["point","area"],tags:{shop:"newsagent","brand:wikidata":"Q645218"},addTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},removeTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},matchScore:2,suggestion:true},"shop/nutrition_supplements/GNC":{name:"GNC",icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements","brand:wikidata":"Q4808595"},addTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},removeTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},matchScore:2,suggestion:true},"shop/nutrition_supplements/The Vitamin Shoppe":{name:"The Vitamin Shoppe",icon:"maki-shop",geometry:["point","area"],tags:{shop:"nutrition_supplements","brand:wikidata":"Q7772938"},addTags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"},removeTags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"},matchScore:2,suggestion:true},"shop/optician/Alain Afflelou":{name:"Alain Afflelou",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2829511"},addTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},removeTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Apollo":{name:"Apollo",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q618940"},addTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},removeTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Atol":{name:"Atol",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2869542"},addTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},removeTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Boots Opticians":{name:"Boots Opticians",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q4944037"},addTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},removeTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Fielmann":{name:"Fielmann",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q457822"},addTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},removeTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Grand Optical":{name:"Grand Optical",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3113677"},addTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},removeTags:{brand:"Grand Optical","brand:wikidata":"Q3113677","brand:wikipedia":"fr:Grand Optical",name:"Grand Optical",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q28232761"},addTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},removeTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Hans Anders":{name:"Hans Anders",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q1884976"},addTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},removeTags:{brand:"Hans Anders","brand:wikidata":"Q1884976","brand:wikipedia":"nl:Hans Anders",name:"Hans Anders",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Krys":{name:"Krys",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3119538"},addTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},removeTags:{brand:"Krys","brand:wikidata":"Q3119538","brand:wikipedia":"fr:Krys Group",name:"Krys",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q6523209"},addTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},removeTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Les Opticiens Mutualistes":{name:"Les Opticiens Mutualistes",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q18414551"},addTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},removeTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Optic 2000":{name:"Optic 2000",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3354445"},addTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},removeTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle":{name:"Pearle",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},removeTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle Vision":{name:"Pearle Vision",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},removeTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2000610"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},removeTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q136311"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},removeTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q10687541"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},removeTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q12004589"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},removeTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q7936150"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},removeTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q5422607"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},removeTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/メガネスーパー":{name:"メガネスーパー",icon:"maki-optician",geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q11343504"},addTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},removeTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},matchScore:2,suggestion:true},"shop/outdoor/Jack Wolfskin":{name:"Jack Wolfskin",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q536133"},addTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},removeTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Kathmandu":{name:"Kathmandu",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q1736294"},addTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},removeTags:{brand:"Kathmandu","brand:wikidata":"Q1736294","brand:wikipedia":"en:Kathmandu (company)",name:"Kathmandu",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q6925414"},addTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},removeTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/REI":{name:"REI",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q3414933"},addTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},removeTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Trespass":{name:"Trespass",icon:"temaki-compass",geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q17035733"},addTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},removeTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},matchScore:2,suggestion:true},"shop/paint/Benjamin Moore":{name:"Benjamin Moore",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q4889038"},addTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},removeTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q5151654"},addTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},removeTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Jotun":{name:"Jotun",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q1778870"},addTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},removeTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Sherwin Williams":{name:"Sherwin Williams",icon:"fas-paint-roller",geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q48881"},addTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},removeTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},matchScore:2,suggestion:true},"shop/party/Party City":{name:"Party City",icon:"maki-shop",geometry:["point","area"],tags:{shop:"party","brand:wikidata":"Q7140896"},addTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},removeTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},matchScore:2,suggestion:true},"shop/pawnbroker/Cash Converters":{name:"Cash Converters",icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q5048645"},addTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},removeTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/pawnbroker/Cebuana Lhuillier":{name:"Cebuana Lhuillier",icon:"maki-shop",geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q17064661"},addTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},removeTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/perfumery/Douglas":{name:"Douglas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q2052213"},addTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},removeTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/ICI PARIS XL":{name:"ICI PARIS XL",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q769749"},addTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},removeTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/Marionnaud":{name:"Marionnaud",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q1129073"},addTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},removeTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/O Boticário":{name:"O Boticário",icon:"maki-shop",geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q7073219"},addTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},removeTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},matchScore:2,suggestion:true},"shop/pet/Das Futterhaus":{name:"Das Futterhaus",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q1167914"},addTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},removeTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Fressnapf":{name:"Fressnapf",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},removeTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q57985699"},addTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},removeTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Maxi Zoo":{name:"Maxi Zoo",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},removeTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Mud Bay":{name:"Mud Bay",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q30324179"},addTags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"},removeTags:{brand:"Mud Bay","brand:wikidata":"Q30324179","brand:wikipedia":"en:Mud Bay pet store",name:"Mud Bay",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Supplies Plus":{name:"Pet Supplies Plus",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171563"},addTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},removeTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Valu":{name:"Pet Valu",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q58009635"},addTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},removeTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/PetSmart":{name:"PetSmart",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q3307147"},addTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},removeTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Petco":{name:"Petco",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171798"},addTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},removeTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pets at Home":{name:"Pets at Home",icon:"maki-dog-park",geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7179258"},addTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},removeTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},matchScore:2,suggestion:true},"shop/photo/Kodak Express":{name:"Kodak Express",icon:"maki-attraction",geometry:["point","area"],tags:{shop:"photo","brand:wikidata":"Q6425126"},addTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},removeTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},matchScore:2,suggestion:true},"shop/second_hand/Value Village":{name:"Value Village",icon:"maki-shop",geometry:["point","area"],tags:{shop:"second_hand","brand:wikidata":"Q7428188"},addTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},removeTags:{brand:"Value Village","brand:wikidata":"Q7428188","brand:wikipedia":"en:Savers",name:"Value Village",shop:"second_hand"},matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2832297"},addTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},removeTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/André":{name:"André",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2847114"},addTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},removeTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Bata":{name:"Bata",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q688082"},addTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},removeTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Besson Chaussures":{name:"Besson Chaussures",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2899930"},addTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},removeTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Birkenstock":{name:"Birkenstock",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q648458"},addTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},removeTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Brantano":{name:"Brantano",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q4957616"},addTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},removeTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/CCC":{name:"CCC",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q11788344"},addTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},removeTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Camper":{name:"Camper",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1030922"},addTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},removeTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Clarks":{name:"Clarks",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1095857"},addTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},removeTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Converse":{name:"Converse",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q319515"},addTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},removeTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Crocs":{name:"Crocs",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q926699"},addTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},removeTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/DSW":{name:"DSW",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5206207"},addTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},removeTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Deichmann":{name:"Deichmann",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q664543"},addTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},removeTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Din sko":{name:"Din sko",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q10472869"},addTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},removeTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Dosenbach":{name:"Dosenbach",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2677329"},addTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},removeTags:{brand:"Dosenbach","brand:wikidata":"Q2677329","brand:wikipedia":"de:Dosenbach-Ochsner",name:"Dosenbach",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1280255"},addTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},removeTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Famous Footwear":{name:"Famous Footwear",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5433457"},addTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},removeTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Foot Locker":{name:"Foot Locker",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q63335"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},removeTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Geox":{name:"Geox",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q588001"},addTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},removeTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Humanic":{name:"Humanic",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1636668"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},removeTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Mephisto":{name:"Mephisto",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q822975"},addTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},removeTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/New Balance":{name:"New Balance",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q742988"},addTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},removeTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Payless ShoeSource":{name:"Payless ShoeSource",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7156755"},addTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},removeTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Quick Schuh":{name:"Quick Schuh",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2123069"},addTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},removeTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rack Room Shoes":{name:"Rack Room Shoes",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q17109937"},addTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},removeTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Reno":{name:"Reno",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2144204"},addTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},removeTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rieker":{name:"Rieker",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2152193"},addTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},removeTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Salamander":{name:"Salamander",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q878354"},addTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},removeTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/San Marina":{name:"San Marina",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q3471558"},addTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},removeTags:{brand:"San Marina","brand:wikidata":"Q3471558","brand:wikipedia":"fr:San Marina",name:"San Marina",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2298792"},addTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},removeTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Schuh":{name:"Schuh",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7432952"},addTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},removeTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Carnival":{name:"Shoe Carnival",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500007"},addTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},removeTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Zone":{name:"Shoe Zone",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500016"},addTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},removeTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Siemes Schuhcenter":{name:"Siemes Schuhcenter",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2800720"},addTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},removeTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Skechers":{name:"Skechers",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2945643"},addTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},removeTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/The Shoe Company":{name:"The Shoe Company",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7763892"},addTags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"},removeTags:{brand:"The Shoe Company","brand:wikidata":"Q7763892","brand:wikipedia":"en:The Shoe Company",name:"The Shoe Company",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Vans":{name:"Vans",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1135366"},addTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},removeTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Éram":{name:"Éram",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q16684192"},addTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},removeTags:{brand:"Éram","brand:wikidata":"Q16684192","brand:wikipedia":"fr:Éram",name:"Éram",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/ЦентрОбувь":{name:"ЦентрОбувь",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q4504072"},addTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},removeTags:{brand:"ЦентрОбувь","brand:wikidata":"Q4504072","brand:wikipedia":"ru:ЦентрОбувь",name:"ЦентрОбувь",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/東京靴流通センター":{name:"東京靴流通センター",icon:"maki-shoe",geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q11318515"},addTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center",shop:"shoes"},removeTags:{brand:"東京靴流通センター","brand:en":"Tokyo Shoes Retailing Center","brand:wikidata":"Q11318515","brand:wikipedia":"ja:チヨダ",name:"東京靴流通センター","name:en":"Tokyo Shoes Retailing Center",shop:"shoes"},matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q3895"},addTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},removeTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Aktiesport":{name:"Aktiesport",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q57546889"},addTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},removeTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Bass Pro Shops":{name:"Bass Pro Shops",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4867953"},addTags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"sports"},removeTags:{brand:"Bass Pro Shops","brand:wikidata":"Q4867953","brand:wikipedia":"en:Bass Pro Shops",name:"Bass Pro Shops",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Big 5 Sporting Goods":{name:"Big 5 Sporting Goods",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4904902"},addTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},removeTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Cabela's":{name:"Cabela's",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q2793714"},addTags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"sports"},removeTags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Decathlon":{name:"Decathlon",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q509349"},addTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},removeTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Dick's Sporting Goods":{name:"Dick's Sporting Goods",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5272601"},addTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},removeTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hervis":{name:"Hervis",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q1614816"},addTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},removeTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hibbett Sports":{name:"Hibbett Sports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5750671"},addTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},removeTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Intersport":{name:"Intersport",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q666888"},addTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},removeTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/JD Sports":{name:"JD Sports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q6108019"},addTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},removeTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Marathon Sports":{name:"Marathon Sports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q3027516"},addTags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"},removeTags:{brand:"Marathon Sports","brand:wikidata":"Q3027516","brand:wikipedia":"es:Marathon Sports",name:"Marathon Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Play It Again Sports":{name:"Play It Again Sports",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7203029"},addTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},removeTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sport 2000":{name:"Sport 2000",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q262394"},addTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},removeTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sportisimo":{name:"Sportisimo",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q54974273"},addTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},removeTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Authority":{name:"Sports Authority",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7579688"},addTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},removeTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Direct":{name:"Sports Direct",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q2913554"},addTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},removeTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Спортмастер":{name:"Спортмастер",icon:"maki-shop",geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4438176"},addTags:{brand:"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер",shop:"sports"},removeTags:{brand:"Спортмастер","brand:wikidata":"Q4438176","brand:wikipedia":"ru:Спортмастер",name:"Спортмастер",shop:"sports"},matchScore:2,suggestion:true},"shop/stationery/Bureau Vallée":{name:"Bureau Vallée",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q18385014"},addTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},removeTags:{brand:"Bureau Vallée","brand:wikidata":"Q18385014","brand:wikipedia":"fr:Bureau Vallée",name:"Bureau Vallée",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1915329"},addTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},removeTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Office Depot":{name:"Office Depot",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1337797"},addTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},removeTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/OfficeMax":{name:"OfficeMax",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079111"},addTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},removeTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Officeworks":{name:"Officeworks",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079486"},addTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},removeTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Pagro":{name:"Pagro",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q57550022"},addTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},removeTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Paper Source":{name:"Paper Source",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q25000269"},addTags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"},removeTags:{brand:"Paper Source","brand:wikidata":"Q25000269","brand:wikipedia":"en:Paper Source",name:"Paper Source",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Paperchase":{name:"Paperchase",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7132739"},addTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},removeTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Ryman":{name:"Ryman",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7385188"},addTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},removeTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Staples":{name:"Staples",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q785943"},addTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},removeTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Комус":{name:"Комус",icon:"maki-shop",geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q4230314"},addTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},removeTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},matchScore:2,suggestion:true},"shop/storage_rental/Extra Space Storage":{name:"Extra Space Storage",icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental","brand:wikidata":"Q5422162"},addTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},removeTags:{brand:"Extra Space Storage","brand:wikidata":"Q5422162","brand:wikipedia":"en:Extra Space Storage",name:"Extra Space Storage",shop:"storage_rental"},matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",geometry:["point","area"],tags:{shop:"storage_rental","brand:wikidata":"Q1156045"},addTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},removeTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},matchScore:2,suggestion:true},"shop/supermarket/A&O":{name:"A&O",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3600279"},addTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},removeTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/A101":{name:"A101",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6034496"},addTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},removeTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ADEG":{name:"ADEG",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q290211"},addTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},removeTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ahorramás":{name:"Ahorramás",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58221883"},addTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},removeTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert":{name:"Albert",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9144241"},addTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},removeTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert Heijn":{name:"Albert Heijn",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1653985"},addTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},removeTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albertsons":{name:"Albertsons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4712282"},addTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},removeTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q125054"},addTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},removeTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Nord":{name:"Aldi Nord",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171373"},addTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},removeTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Süd":{name:"Aldi Süd",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171672"},addTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},removeTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alimerka":{name:"Alimerka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16482738"},addTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},removeTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alnatura":{name:"Alnatura",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q876811"},addTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},removeTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Atacadão":{name:"Atacadão",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868739"},addTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},removeTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Auchan":{name:"Auchan",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},removeTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bi-Lo":{name:"Bi-Lo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4835622"},addTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},removeTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q857182"},addTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},removeTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Big C":{name:"Big C",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q858665"},addTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},removeTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Billa":{name:"Billa",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q537781"},addTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},removeTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bingo":{name:"Bingo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16842066"},addTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},removeTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biocoop":{name:"Biocoop",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2904039"},addTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},removeTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Brookshire Brothers":{name:"Brookshire Brothers",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4975084"},addTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},removeTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Brookshire's":{name:"Brookshire's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4975085"},addTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},removeTags:{brand:"Brookshire's","brand:wikidata":"Q4975085","brand:wikipedia":"en:Brookshire Grocery Company",name:"Brookshire's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4985016"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},removeTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bulk Barn":{name:"Bulk Barn",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4996466"},addTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},removeTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bunnpris":{name:"Bunnpris",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1774634"},addTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},removeTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/COOP Jednota":{name:"COOP Jednota",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Caprabo":{name:"Caprabo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1980781"},addTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},removeTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cargills Food City":{name:"Cargills Food City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58353955"},addTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},removeTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour":{name:"Carrefour",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q217599"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour City":{name:"Carrefour City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940187"},addTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940188"},addTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Express":{name:"Carrefour Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940190"},addTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2689639"},addTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carulla":{name:"Carulla",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5047480"},addTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},removeTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Checkers":{name:"Checkers",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5089126"},addTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},removeTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Chedraui":{name:"Chedraui",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2961952"},addTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},removeTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/City Market":{name:"City Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5123299"},addTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},removeTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Co-op":{name:"Co-op",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coles":{name:"Coles",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1108172"},addTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},removeTags:{brand:"Coles","brand:wikidata":"Q1108172","brand:wikipedia":"en:Coles Supermarkets",name:"Coles",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2363991"},addTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},removeTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Combi":{name:"Combi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1113618"},addTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},removeTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Comercial Mexicana":{name:"Comercial Mexicana",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2985173"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},removeTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q639075"},addTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},removeTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad City":{name:"Conad City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57543102"},addTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},removeTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Condis":{name:"Condis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57417581"},addTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},removeTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Consum":{name:"Consum",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8350308"},addTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},removeTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Continente":{name:"Continente",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2995683"},addTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},removeTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coop Prix":{name:"Coop Prix",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5167705"},addTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},removeTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cora":{name:"Cora",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q686643"},addTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},removeTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Costcutter":{name:"Costcutter",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175072"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},removeTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coto":{name:"Coto",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175411"},addTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},removeTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Countdown":{name:"Countdown",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5176845"},addTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},removeTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cub Foods":{name:"Cub Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5191916"},addTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},removeTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/D1":{name:"D1",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q43403418"},addTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},removeTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dagli'Brugsen":{name:"Dagli'Brugsen",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12307017"},addTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},removeTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Deen":{name:"Deen",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q13571727"},addTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},removeTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delhaize":{name:"Delhaize",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1184173"},addTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},removeTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11693824"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},removeTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Denner":{name:"Denner",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q379911"},addTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},removeTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Despar":{name:"Despar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Despar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},removeTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia Market":{name:"Dia Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},removeTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dino":{name:"Dino",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11694239"},addTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},removeTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dirk van den Broek":{name:"Dirk van den Broek",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17502722"},addTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},removeTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dunnes Stores":{name:"Dunnes Stores",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1266203"},addTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},removeTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc":{name:"E. Leclerc",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1273376"},addTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},removeTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc Drive":{name:"E. Leclerc Drive",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1273376"},addTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",shop:"supermarket"},removeTags:{brand:"E. Leclerc Drive","brand:wikidata":"Q1273376","brand:wikipedia":"fr:E.Leclerc",name:"E. Leclerc Drive",operator:"E.Leclerc","operator:wikidata":"Q1273376","operator:wikipedia":"en:E.Leclerc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3119122"},addTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},removeTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Edeka":{name:"Edeka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},removeTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eko":{name:"Eko",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9251859"},addTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},removeTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ekono":{name:"Ekono",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2842729"},addTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},removeTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eroski":{name:"Eroski",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1361349"},addTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},removeTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Esselunga":{name:"Esselunga",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1059636"},addTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},removeTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EuroSpin":{name:"EuroSpin",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1374674"},addTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},removeTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eurospar":{name:"Eurospar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12309283"},addTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},removeTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Extra":{name:"Extra",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11964085"},addTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},removeTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Famila":{name:"Famila",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1395108"},addTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},removeTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fareway":{name:"Fareway",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5434998"},addTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},removeTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Farm Boy":{name:"Farm Boy",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5435469"},addTags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"},removeTags:{brand:"Farm Boy","brand:wikidata":"Q5435469","brand:wikipedia":"en:Farm Boy",name:"Farm Boy",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Farmfoods":{name:"Farmfoods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5435841"},addTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},removeTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Feneberg":{name:"Feneberg",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5345378"},addTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},removeTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food 4 Less":{name:"Food 4 Less",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465282"},addTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},removeTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465300"},addTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},removeTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food City":{name:"Food City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465306"},addTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},removeTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1435950"},addTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},removeTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Foodworks":{name:"Foodworks",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465579"},addTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},removeTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fred Meyer":{name:"Fred Meyer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5495932"},addTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},removeTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/FreshCo":{name:"FreshCo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5502915"},addTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},removeTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Froiz":{name:"Froiz",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17070775"},addTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},removeTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Føtex":{name:"Føtex",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1480395"},addTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},removeTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/G20":{name:"G20",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504731"},addTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},removeTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Gadis":{name:"Gadis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12389151"},addTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},removeTags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1522721"},addTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},removeTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Globus":{name:"Globus",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q457503"},addTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},removeTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grand Frais":{name:"Grand Frais",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3114675"},addTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},removeTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grocery Outlet":{name:"Grocery Outlet",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5609934"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},removeTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Géant Casino":{name:"Géant Casino",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1380537"},addTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},removeTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/H-E-B":{name:"H-E-B",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q830621"},addTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},removeTags:{brand:"H-E-B","brand:wikidata":"Q830621","brand:wikipedia":"en:H-E-B",name:"H-E-B",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/HIT":{name:"HIT",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1548713"},addTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},removeTags:{brand:"HIT","brand:wikidata":"Q1548713","brand:wikipedia":"de:HIT Handelsgruppe",name:"HIT",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5648760"},addTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},removeTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Harris Teeter":{name:"Harris Teeter",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5665067"},addTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},removeTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hemköp":{name:"Hemköp",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10521746"},addTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},removeTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Heron Foods":{name:"Heron Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5743472"},addTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},removeTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hofer":{name:"Hofer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15815751"},addTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},removeTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hoogvliet":{name:"Hoogvliet",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1642179"},addTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},removeTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hy-Vee":{name:"Hy-Vee",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1639719"},addTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},removeTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hyper U":{name:"Hyper U",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},removeTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA":{name:"ICA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},removeTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Kvantum":{name:"ICA Kvantum",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},removeTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Maxi":{name:"ICA Maxi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},removeTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/IDEA":{name:"IDEA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q23461622"},addTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},removeTags:{brand:"IDEA","brand:wikidata":"Q23461622","brand:wikipedia":"en:Idea (supermarkets)",name:"IDEA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3146662"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},removeTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Iceland":{name:"Iceland",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q721810"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},removeTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ingles":{name:"Ingles",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6032595"},addTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},removeTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché":{name:"Intermarché",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},removeTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché Super":{name:"Intermarché Super",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},removeTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Interspar":{name:"Interspar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15820339"},addTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},removeTags:{brand:"Interspar","brand:wikidata":"Q15820339","brand:wikipedia":"de:Interspar (Österreich)",name:"Interspar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q797150"},addTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},removeTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jan Linders":{name:"Jan Linders",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2200982"},addTags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"},removeTags:{brand:"Jan Linders","brand:wikidata":"Q2200982","brand:wikipedia":"nl:Jan Linders Supermarkten",name:"Jan Linders",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jewel-Osco":{name:"Jewel-Osco",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3178470"},addTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},removeTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Joker":{name:"Joker",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q716328"},addTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},removeTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2262314"},addTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},removeTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kaufland":{name:"Kaufland",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q685967"},addTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},removeTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6412065"},addTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},removeTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kiwi":{name:"Kiwi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1613639"},addTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},removeTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kroger":{name:"Kroger",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q153417"},addTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},removeTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7061148"},addTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},removeTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Anónima":{name:"La Anónima",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135985"},addTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},removeTags:{brand:"La Anónima","brand:wikidata":"Q6135985","brand:wikipedia":"es:La Anónima",name:"La Anónima",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58904673"},addTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},removeTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Vie Claire":{name:"La Vie Claire",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3213589"},addTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},removeTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Landi":{name:"Landi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1803010"},addTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},removeTags:{brand:"Landi","brand:wikidata":"Q1803010","brand:wikipedia":"en:Landi (Unternehmen)",name:"Landi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2181426"},addTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},removeTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider":{name:"Lider",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider Express":{name:"Lider Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lidl":{name:"Lidl",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q151954"},addTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},removeTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lincolnshire Co-op":{name:"Lincolnshire Co-op",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6551231"},addTags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"},removeTags:{brand:"Lincolnshire Co-op","brand:wikidata":"Q6551231","brand:wikipedia":"en:Lincolnshire Co-operative",name:"Lincolnshire Co-op",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Linella":{name:"Linella",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q61085990"},addTags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"},removeTags:{brand:"Linella","brand:wikidata":"Q61085990","brand:wikipedia":"ro:Linella",name:"Linella",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Loblaws":{name:"Loblaws",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3257626"},addTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"},removeTags:{brand:"Loblaws","brand:wikidata":"Q3257626","brand:wikipedia":"en:Loblaws",name:"Loblaws",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowe's Market":{name:"Lowe's Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693107"},addTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},removeTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowes Foods":{name:"Lowes Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693991"},addTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},removeTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lucky":{name:"Lucky",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6698032"},addTags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"},removeTags:{brand:"Lucky","brand:wikidata":"Q6698032","brand:wikipedia":"en:Lucky Stores",name:"Lucky",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lupa":{name:"Lupa",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58044048"},addTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},removeTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MD":{name:"MD",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3841263"},addTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},removeTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MPREIS":{name:"MPREIS",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q873491"},addTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},removeTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Markant":{name:"Markant",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57523365"},addTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},removeTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Market Basket":{name:"Market Basket",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2079198"},addTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},removeTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Marktkauf":{name:"Marktkauf",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1533254"},addTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},removeTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Martin's Super Markets":{name:"Martin's Super Markets",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6774803"},addTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},removeTags:{brand:"Martin's Super Markets","brand:wikidata":"Q6774803","brand:wikipedia":"en:Martin's Super Markets",name:"Martin's Super Markets",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q513977"},addTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},removeTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi Dia":{name:"Maxi Dia",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},removeTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima X":{name:"Maxima X",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},removeTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},removeTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XXX":{name:"Maxima XXX",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},removeTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Canada)":{name:"Maxi (Canada)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3302441"},addTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Serbia)":{name:"Maxi (Serbia)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6795490"},addTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mega Image":{name:"Mega Image",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6808085"},addTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},removeTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mego":{name:"Mego",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16363314"},addTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},removeTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meijer":{name:"Meijer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1917753"},addTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},removeTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meny":{name:"Meny",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10581720"},addTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},removeTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mercadona":{name:"Mercadona",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q377705"},addTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},removeTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Merkur":{name:"Merkur",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1921857"},addTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},removeTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Metro (Canada)":{name:"Metro (Canada)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1145669"},addTags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"},removeTags:{brand:"Metro","brand:wikidata":"Q1145669","brand:wikipedia":"en:Metro Inc.",name:"Metro",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Metro (Peru)":{name:"Metro (Peru)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16640217"},addTags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",operator:"Cencosud",shop:"supermarket"},removeTags:{brand:"Metro","brand:wikidata":"Q16640217","brand:wikipedia":"en:Tiendas Metro",name:"Metro",operator:"Cencosud",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Migros":{name:"Migros",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q680727"},addTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},removeTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mila":{name:"Mila",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48844636"},addTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},removeTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Minipreço":{name:"Minipreço",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3042224"},addTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},removeTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mix Markt":{name:"Mix Markt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q327854"},addTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},removeTags:{brand:"Mix Markt","brand:wikidata":"Q327854","brand:wikipedia":"de:Mix Markt",name:"Mix Markt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3321241"},addTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},removeTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/More":{name:"More",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6910891"},addTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},removeTags:{brand:"More","brand:wikidata":"Q6910891","brand:wikipedia":"en:More (store)",name:"More",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Morrisons":{name:"Morrisons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q922344"},addTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},removeTags:{brand:"Morrisons","brand:wikidata":"Q922344","brand:wikipedia":"en:Morrisons",name:"Morrisons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1963643"},addTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},removeTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nahkauf":{name:"Nahkauf",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57515238"},addTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},removeTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Naturalia":{name:"Naturalia",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3337081"},addTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},removeTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto":{name:"Netto",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q552652"},addTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},removeTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto Marken-Discount":{name:"Netto Marken-Discount",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q879858"},addTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},removeTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/New World":{name:"New World",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7012488"},addTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},removeTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/No Frills":{name:"No Frills",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3342407"},addTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},removeTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norfa XL":{name:"Norfa XL",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1998983"},addTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},removeTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norma":{name:"Norma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q450180"},addTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},removeTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Okay":{name:"Okay",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2159701"},addTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},removeTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Olímpica":{name:"Olímpica",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q24749847"},addTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},removeTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/PLUS":{name:"PLUS",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1978981"},addTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},removeTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/POLOmarket":{name:"POLOmarket",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11821937"},addTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},removeTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Palí":{name:"Palí",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1064887"},addTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},removeTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pam":{name:"Pam",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3777398"},addTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},removeTags:{brand:"Pam","brand:wikidata":"Q3777398","brand:wikipedia":"it:Gruppo PAM",name:"Pam",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pavilions":{name:"Pavilions",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7155886"},addTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},removeTags:{brand:"Pavilions","brand:wikidata":"Q7155886","brand:wikipedia":"en:Pavilions (supermarket)",name:"Pavilions",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q284688"},addTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},removeTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pick 'n Save":{name:"Pick 'n Save",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7371288"},addTags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"},removeTags:{brand:"Pick 'n Save","brand:wikidata":"Q7371288","brand:wikipedia":"en:Roundy's",name:"Pick 'n Save",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pick n Pay":{name:"Pick n Pay",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7190735"},addTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},removeTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piggly Wiggly":{name:"Piggly Wiggly",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3388303"},addTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},removeTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pingo Doce":{name:"Pingo Doce",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1575057"},addTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},removeTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piotr i Paweł":{name:"Piotr i Paweł",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2096356"},addTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},removeTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plaza Vea":{name:"Plaza Vea",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7203672"},addTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},removeTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plodine":{name:"Plodine",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58040098"},addTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},removeTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Poiesz":{name:"Poiesz",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2521700"},addTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},removeTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (Kansas City)":{name:"Price Chopper (Kansas City)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242572"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (New York)":{name:"Price Chopper (New York)",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242574"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Profi":{name:"Profi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q956664"},addTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},removeTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Provigo":{name:"Provigo",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408306"},addTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},removeTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Proxi":{name:"Proxi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408522"},addTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},removeTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Proxy Delhaize":{name:"Proxy Delhaize",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q14903417"},addTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},removeTags:{brand:"Proxy Delhaize","brand:wikidata":"Q14903417","brand:wikipedia":"en:Delhaize Group",name:"Proxy Delhaize",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q672170"},addTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},removeTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Punto Simply":{name:"Punto Simply",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},removeTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Puregold":{name:"Puregold",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7261170"},addTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},removeTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pão de Açúcar":{name:"Pão de Açúcar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3411543"},addTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},removeTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/QFC":{name:"QFC",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7265425"},addTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},removeTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ralphs":{name:"Ralphs",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3929820"},addTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},removeTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real":{name:"Real",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q698473"},addTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},removeTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real Canadian Superstore":{name:"Real Canadian Superstore",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7300856"},addTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},removeTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Redner's Markets":{name:"Redner's Markets",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7306166"},addTags:{brand:"Redner's Markets","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's Markets",shop:"supermarket"},removeTags:{brand:"Redner's Markets","brand:wikidata":"Q7306166","brand:wikipedia":"en:Redner's Markets",name:"Redner's Markets",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7311014"},addTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},removeTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rema 1000":{name:"Rema 1000",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q28459"},addTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},removeTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe":{name:"Rewe",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},removeTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe City":{name:"Rewe City",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},removeTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rimi":{name:"Rimi",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7334456"},addTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},removeTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/S-Market":{name:"S-Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11891613"},addTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},removeTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Safeway":{name:"Safeway",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1508234"},addTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},removeTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sainsbury's":{name:"Sainsbury's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q152096"},addTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},removeTags:{brand:"Sainsbury's","brand:wikidata":"Q152096","brand:wikipedia":"en:Sainsbury's",name:"Sainsbury's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7419620"},addTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},removeTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Save-A-Lot":{name:"Save-A-Lot",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7427972"},addTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},removeTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Save-On-Foods":{name:"Save-On-Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7427974"},addTags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"},removeTags:{brand:"Save-On-Foods","brand:wikidata":"Q7427974","brand:wikipedia":"en:Save-On-Foods",name:"Save-On-Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Schnucks":{name:"Schnucks",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7431920"},addTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},removeTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shaw's":{name:"Shaw's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q578387"},addTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},removeTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ShopRite":{name:"ShopRite",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7501097"},addTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},removeTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shoprite":{name:"Shoprite",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1857639"},addTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},removeTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sigma":{name:"Sigma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3977979"},addTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},removeTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Simply Market":{name:"Simply Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},removeTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sky":{name:"Sky",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1129779"},addTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},removeTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Smith's":{name:"Smith's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7544856"},addTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},removeTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sobeys":{name:"Sobeys",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1143340"},addTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},removeTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Soriana":{name:"Soriana",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q735562"},addTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},removeTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Spar":{name:"Spar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"},removeTags:{brand:"Spar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Spar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Społem":{name:"Społem",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11826043"},addTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"},removeTags:{brand:"Społem","brand:wikidata":"Q11826043","brand:wikipedia":"pl:Powszechna Spółdzielnia Spożywców „Społem”",name:"Społem",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sprouts Farmers Market":{name:"Sprouts Farmers Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7581369"},addTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},removeTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stater Bros.":{name:"Stater Bros.",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7604016"},addTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},removeTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stokrotka":{name:"Stokrotka",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9345945"},addTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},removeTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stop & Shop":{name:"Stop & Shop",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3658429"},addTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},removeTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58012362"},addTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},removeTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super 1 Foods":{name:"Super 1 Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7642102"},addTags:{brand:"Super 1 Foods","brand:wikidata":"Q7642102",name:"Super 1 Foods","operator:wikidata":"Q7642102","operator:wikipedia":"en:Brookshire Grocery Company",shop:"supermarket"},removeTags:{brand:"Super 1 Foods","brand:wikidata":"Q7642102",name:"Super 1 Foods","operator:wikidata":"Q7642102","operator:wikipedia":"en:Brookshire Grocery Company",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super C":{name:"Super C",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504127"},addTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},removeTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super One Foods":{name:"Super One Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17108733"},addTags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"},removeTags:{brand:"Super One Foods","brand:wikidata":"Q17108733","brand:wikipedia":"en:Super One Foods",name:"Super One Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super U":{name:"Super U",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},removeTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperBrugsen":{name:"SuperBrugsen",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12337746"},addTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},removeTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperValu":{name:"SuperValu",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7642081"},addTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},removeTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superama":{name:"Superama",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135762"},addTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},removeTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Supercor":{name:"Supercor",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135841"},addTags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"},removeTags:{brand:"Supercor","brand:wikidata":"Q6135841","brand:wikipedia":"es:Supercor",name:"Supercor",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superspar":{name:"Superspar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},removeTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tegut":{name:"Tegut",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1547993"},addTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},removeTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco":{name:"Tesco",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},removeTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Express":{name:"Tesco Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},removeTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Extra":{name:"Tesco Extra",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q25172225"},addTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},removeTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Metro":{name:"Tesco Metro",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57551648"},addTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},removeTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Fresh Market":{name:"The Fresh Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7735265"},addTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},removeTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Todis":{name:"Todis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3992174"},addTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},removeTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tommy":{name:"Tommy",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12643718"},addTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},removeTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tops":{name:"Tops",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7825137"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},removeTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7828510"},addTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},removeTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Trader Joe's":{name:"Trader Joe's",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q688825"},addTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},removeTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Treff 3000":{name:"Treff 3000",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},removeTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tuodì":{name:"Tuodì",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3706995"},addTags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"},removeTags:{brand:"Tuodì","brand:wikidata":"Q3706995","brand:wikipedia":"it:Tuodì",name:"Tuodì",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/U Express":{name:"U Express",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},removeTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarc":{name:"Unimarc",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6156244"},addTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},removeTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarkt":{name:"Unimarkt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1169599"},addTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},removeTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vea":{name:"Vea",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5858167"},addTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},removeTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/VinMart":{name:"VinMart",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q60245505"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},removeTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vomar":{name:"Vomar",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3202837"},addTags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"},removeTags:{brand:"Vomar","brand:wikidata":"Q3202837","brand:wikipedia":"nl:Vomar",name:"Vomar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vons":{name:"Vons",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7941609"},addTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},removeTags:{brand:"Vons","brand:wikidata":"Q7941609","brand:wikipedia":"en:Vons",name:"Vons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q771734"},addTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},removeTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{name:"Walmart Neighborhood Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Supercenter":{name:"Walmart Supercenter",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wasgau":{name:"Wasgau",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2536857"},addTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},removeTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wegmans":{name:"Wegmans",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11288478"},addTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},removeTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Weis":{name:"Weis",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7980370"},addTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},removeTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Whole Foods Market":{name:"Whole Foods Market",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1809448"},addTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},removeTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Willys":{name:"Willys",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10720214"},addTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},removeTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/WinCo Foods":{name:"WinCo Foods",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8023592"},addTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},removeTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Winn Dixie":{name:"Winn Dixie",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1264366"},addTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},removeTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Woolworths":{name:"Woolworths",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3249145"},addTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},removeTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Your Independent Grocer":{name:"Your Independent Grocer",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8058833"},addTags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"},removeTags:{brand:"Your Independent Grocer","brand:wikidata":"Q8058833","brand:wikipedia":"en:Your Independent Grocer",name:"Your Independent Grocer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/denn's Biomarkt":{name:"denn's Biomarkt",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48883773"},addTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},removeTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/fakta":{name:"fakta",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3172238"},addTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},removeTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Şok":{name:"Şok",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q19613992"},addTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},removeTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4721807"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},removeTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5518063"},addTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},removeTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6783887"},addTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},removeTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Σκλαβενίτης":{name:"Σκλαβενίτης",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7536037"},addTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},removeTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Азбука Вкуса":{name:"Азбука Вкуса",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4058209"},addTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},removeTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Атак":{name:"Атак",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868738"},addTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},removeTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ашан":{name:"Ашан",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},removeTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q21656645"},addTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},removeTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Виктория":{name:"Виктория",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4111046"},addTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},removeTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Виталюр":{name:"Виталюр",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q55663075"},addTags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"},removeTags:{brand:"Виталюр","brand:wikidata":"Q55663075","brand:wikipedia":"ru:Виталюр",name:"Виталюр",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Вопак":{name:"Вопак",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q30966107"},addTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},removeTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Гулливер":{name:"Гулливер",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003470"},addTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},removeTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Десяточка":{name:"Десяточка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q61876182"},addTags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"},removeTags:{brand:"Десяточка","brand:en":"Desyatochka","brand:wikidata":"Q61876182",name:"Десяточка",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Дикси":{name:"Дикси",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4161561"},addTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},removeTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4216307"},addTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},removeTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Командор":{name:"Командор",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q61876152"},addTags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"},removeTags:{brand:"Командор","brand:en":"Komandor","brand:wikidata":"Q61876152",name:"Командор",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Красный Яр":{name:"Красный Яр",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1786753"},addTags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"},removeTags:{brand:"Красный Яр","brand:en":"Krasnyj Jar","brand:wikidata":"Q1786753","brand:wikipedia":"ru:Красный Яр",name:"Красный Яр",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Лента":{name:"Лента",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4258608"},addTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},removeTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Магнит":{name:"Магнит",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Мария-Ра":{name:"Мария-Ра",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4281631"},addTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},removeTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Монетка":{name:"Монетка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4301704"},addTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},removeTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{name:"Народная 7Я семьЯ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4032436"},addTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},removeTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Перекрёсток":{name:"Перекрёсток",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1684639"},addTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},removeTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Покупочка":{name:"Покупочка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003270"},addTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},removeTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Полушка":{name:"Полушка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4371080"},addTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},removeTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Пятёрочка":{name:"Пятёрочка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1768969"},addTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},removeTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Радеж":{name:"Радеж",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4387165"},addTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},removeTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Рукавичка":{name:"Рукавичка",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q20092568"},addTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},removeTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Светофор":{name:"Светофор",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q61875920"},addTags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"},removeTags:{brand:"Светофор","brand:en":"Svetofor","brand:wikidata":"Q61875920",name:"Светофор",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Семишагофф":{name:"Семишагофф",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003374"},addTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},removeTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Сільпо":{name:"Сільпо",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4419434"},addTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},removeTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Таврия В":{name:"Таврия В",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q61823146"},addTags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"},removeTags:{brand:"Таврия В","brand:wikidata":"Q61823146","brand:wikipedia":"uk:Таврія В",name:"Таврия В",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фора":{name:"Фора",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12165977"},addTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},removeTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фуршет":{name:"Фуршет",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4493564"},addTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},removeTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Эдельвейс":{name:"Эдельвейс",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57979368"},addTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},removeTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/いなげや":{name:"いなげや",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17193392"},addTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},removeTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/まいばすけっと":{name:"まいばすけっと",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11278154"},addTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},removeTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イオン":{name:"イオン",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11285951"},addTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},removeTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イトーヨーカドー":{name:"イトーヨーカドー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3088746"},addTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},removeTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/カスミ":{name:"カスミ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11294160"},addTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},removeTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/バロー":{name:"バロー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11328346"},addTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},removeTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マックスバリュ":{name:"マックスバリュ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1960109"},addTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},removeTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マルエツ":{name:"マルエツ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11341197"},addTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},removeTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヤオコー":{name:"ヤオコー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11344967"},addTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},removeTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヨークベニマル":{name:"ヨークベニマル",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346199"},addTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},removeTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ライフ":{name:"ライフ",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346476"},addTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},removeTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯":{name:"全聯",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯福利中心":{name:"全聯福利中心",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/家乐福":{name:"家乐福",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q217599"},addTags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"},removeTags:{brand:"家乐福","brand:wikidata":"Q217599","brand:wikipedia":"wuu:家乐福",name:"家乐福",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/惠康 Wellcome":{name:"惠康 Wellcome",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/業務スーパー":{name:"業務スーパー",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11590183"},addTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},removeTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/沃尔玛":{name:"沃尔玛",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛","name:en":"Walmart",name:"沃尔玛",shop:"supermarket"},removeTags:{brand:"沃尔玛","brand:en":"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"wuu:沃尔玛","name:en":"Walmart",name:"沃尔玛",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/美廉社":{name:"美廉社",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15914017"},addTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},removeTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/西友":{name:"西友",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3108542"},addTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},removeTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好":{name:"頂好",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好超市":{name:"頂好超市",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/하나로마트":{name:"하나로마트",icon:"maki-grocery",geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12590611"},addTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},removeTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},matchScore:2,suggestion:true},"shop/tea/T2":{name:"T2",icon:"maki-teahouse",geometry:["point","area"],tags:{shop:"tea","brand:wikidata":"Q48802134"},addTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},removeTags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"},matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"maki-shop",geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q13646"},addTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},removeTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},matchScore:2,suggestion:true},"shop/ticket/Guichet Transilien":{name:"Guichet Transilien",icon:"maki-shop",geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q389554"},addTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},removeTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},matchScore:2,suggestion:true},"shop/toys/Dráčik":{name:"Dráčik",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653669"},addTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},removeTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Intertoys":{name:"Intertoys",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1891407"},addTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},removeTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/JouéClub":{name:"JouéClub",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3187152"},addTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},removeTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/King Jouet":{name:"King Jouet",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3197009"},addTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},removeTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/La Grande Récré":{name:"La Grande Récré",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3209556"},addTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},removeTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lego":{name:"Lego",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1063455"},addTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},removeTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lekia":{name:"Lekia",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q56303274"},addTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},removeTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Maxi Toys":{name:"Maxi Toys",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16663879"},addTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},removeTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/The Entertainer":{name:"The Entertainer",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q7732289"},addTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},removeTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Toys R Us":{name:"Toys R Us",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q696334"},addTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},removeTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Детский мир":{name:"Детский мир",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16643324"},addTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},removeTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Кораблик":{name:"Кораблик",icon:"maki-shop",geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653416"},addTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},removeTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},matchScore:2,suggestion:true},"shop/travel_agency/Coral Travel":{name:"Coral Travel",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q58011479"},addTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},removeTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/D-reizen":{name:"D-reizen",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2445498"},addTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},removeTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/DER Reisebüro":{name:"DER Reisebüro",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q56729186"},addTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},removeTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/First Reisebüro":{name:"First Reisebüro",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},removeTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Flight Centre":{name:"Flight Centre",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q5459202"},addTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},removeTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Halcón Viajes":{name:"Halcón Viajes",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57591939"},addTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},removeTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Havas Voyages":{name:"Havas Voyages",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57628091"},addTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},removeTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Reiseland":{name:"Reiseland",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q40387610"},addTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},removeTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/TUI":{name:"TUI",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},removeTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/The Co-operative Travel":{name:"The Co-operative Travel",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7726526"},addTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},removeTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomas Cook":{name:"Thomas Cook",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2141800"},addTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},removeTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomson":{name:"Thomson",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7795876"},addTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},removeTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Поехали с нами":{name:"Поехали с нами",icon:"maki-suitcase",geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q25439141"},addTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},removeTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/tyres/Big O Tires":{name:"Big O Tires",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q4906085"},addTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},removeTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Bridgestone":{name:"Bridgestone",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q179433"},addTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},removeTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Discount Tire":{name:"Discount Tire",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q5281735"},addTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},removeTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Express Oil Change & Tire Engineers":{name:"Express Oil Change & Tire Engineers",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q39057654"},addTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},removeTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Les Schwab Tire Center":{name:"Les Schwab Tire Center",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q6529977"},addTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},removeTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Michelin":{name:"Michelin",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q151107"},addTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},removeTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Vianor":{name:"Vianor",icon:"maki-shop",geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q10714920"},addTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},removeTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},matchScore:2,suggestion:true},"shop/variety_store/Action":{name:"Action",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q2634111"},addTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},removeTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazaar":{name:"Big Bazaar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3631008"},addTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},removeTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazar":{name:"Big Bazar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q15873104"},addTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},removeTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar General":{name:"Dollar General",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q145168"},addTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},removeTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar Tree":{name:"Dollar Tree",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5289230"},addTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},removeTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollarama":{name:"Dollarama",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3033947"},addTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},removeTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Family Dollar":{name:"Family Dollar",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5433101"},addTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},removeTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Five Below":{name:"Five Below",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5455836"},addTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},removeTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Fix Price":{name:"Fix Price",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q4038791"},addTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},removeTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/GiFi":{name:"GiFi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3105439"},addTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},removeTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Home Bargains":{name:"Home Bargains",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5888229"},addTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},removeTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Mäc-Geiz":{name:"Mäc-Geiz",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1957126"},addTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},removeTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/NOZ":{name:"NOZ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3345688"},addTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},removeTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundland":{name:"Poundland",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1434528"},addTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},removeTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundstretcher":{name:"Poundstretcher",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q7235675"},addTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},removeTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundworld":{name:"Poundworld",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q16967516"},addTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},removeTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/TEDi":{name:"TEDi",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1364603"},addTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},removeTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Tokmanni":{name:"Tokmanni",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q13423470"},addTags:{name:"Tokmanni",brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",shop:"variety_store"},removeTags:{name:"Tokmanni",brand:"Tokmanni","brand:wikidata":"Q13423470","brand:wikipedia":"fi:Tokmanni",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Wilko":{name:"Wilko",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q8002536"},addTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},removeTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/キャンドゥ":{name:"キャンドゥ",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11297367"},addTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},removeTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/セリア":{name:"セリア",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11314509"},addTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},removeTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/ダイソー":{name:"ダイソー",icon:"maki-shop",geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q866991"},addTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},removeTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},matchScore:2,suggestion:true},"shop/video_games/EB Games":{name:"EB Games",icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q4993686"},addTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},removeTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/GameStop":{name:"GameStop",icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q202210"},addTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},removeTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/Micromania":{name:"Micromania",icon:"maki-gaming",geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q3312221"},addTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},removeTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},matchScore:2,suggestion:true},"shop/video/Blockbuster":{name:"Blockbuster",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q884711"},addTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},removeTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},matchScore:2,suggestion:true},"shop/video/Family Video":{name:"Family Video",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5433297"},addTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},removeTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},matchScore:2,suggestion:true},"shop/video/ゲオ":{name:"ゲオ",icon:"temaki-movie_rental",geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5533938"},addTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},removeTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},matchScore:2,suggestion:true},"shop/watches/Swatch":{name:"Swatch",icon:"maki-watch",geometry:["point","area"],tags:{shop:"watches","brand:wikidata":"Q573422"},addTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},removeTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},matchScore:2,suggestion:true},"shop/wholesale/BJ's Wholesale Club":{name:"BJ's Wholesale Club",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q4835754"},addTags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale",operator:"BJ's Wholesale Club"},removeTags:{brand:"BJ's Wholesale Club","brand:wikidata":"Q4835754","brand:wikipedia":"en:BJ's Wholesale Club",name:"BJ's Wholesale Club",shop:"wholesale",operator:"BJ's Wholesale Club"},matchScore:2,suggestion:true},"shop/wholesale/Costco":{name:"Costco",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q715583"},addTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},removeTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},matchScore:2,suggestion:true},"shop/wholesale/Makro":{name:"Makro",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q704606"},addTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},removeTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},matchScore:2,suggestion:true},"shop/wholesale/Metro":{name:"Metro",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q13610282"},addTags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"},removeTags:{brand:"Metro","brand:wikidata":"Q13610282","brand:wikipedia":"en:Metro Cash and Carry",name:"Metro",shop:"wholesale"},matchScore:2,suggestion:true},"shop/wholesale/Sam's Club":{name:"Sam's Club",icon:"maki-warehouse",geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q1972120"},addTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},removeTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},matchScore:2,suggestion:true},"tourism/hotel/B&B Hôtel":{name:"B&B Hôtel",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q794939"},addTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},removeTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western":{name:"Best Western",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western Plus":{name:"Best Western Plus",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Campanile":{name:"Campanile",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2412064"},addTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},removeTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Candlewood Suites":{name:"Candlewood Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5032010"},addTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},removeTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn":{name:"Comfort Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},removeTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn & Suites":{name:"Comfort Inn & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},removeTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Suites":{name:"Comfort Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},removeTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Country Inn & Suites":{name:"Country Inn & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5177332"},addTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},removeTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Courtyard by Marriott":{name:"Courtyard by Marriott",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1053170"},addTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},removeTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Crowne Plaza":{name:"Crowne Plaza",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2746220"},addTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},removeTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Days Inn":{name:"Days Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1047239"},addTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Embassy Suites":{name:"Embassy Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5369524"},addTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},removeTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Extended Stay America":{name:"Extended Stay America",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5421850"},addTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},removeTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Fairfield Inn":{name:"Fairfield Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5430314"},addTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},removeTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Formule 1":{name:"Formule 1",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1630895"},addTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},removeTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Grand Hyatt":{name:"Grand Hyatt",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Grand Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Grand Hyatt",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hampton Inn":{name:"Hampton Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5646230"},addTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},removeTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton":{name:"Hilton",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q598884"},addTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},removeTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton Garden Inn":{name:"Hilton Garden Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1162859"},addTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},removeTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn":{name:"Holiday Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2717882"},addTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},removeTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express":{name:"Holiday Inn Express",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{name:"Holiday Inn Express & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Homewood Suites":{name:"Homewood Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5890701"},addTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},removeTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt":{name:"Hyatt",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt Centric":{name:"Hyatt Centric",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt Centric","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Centric",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt House":{name:"Hyatt House",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt House","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt House",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt Place":{name:"Hyatt Place",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt Place","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt Place","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Place",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hyatt Regency":{name:"Hyatt Regency",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Hyatt Regency","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Hyatt Regency",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis":{name:"Ibis",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q920166"},addTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},removeTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Budget":{name:"Ibis Budget",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1458135"},addTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},removeTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Hotel":{name:"Ibis Hotel",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q920166"},addTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},removeTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Styles":{name:"Ibis Styles",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q3147425"},addTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},removeTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Kyriad":{name:"Kyriad",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q11751808"},addTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},removeTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/La Quinta":{name:"La Quinta",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q6464734"},addTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Marriott":{name:"Marriott",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1141173"},addTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},removeTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Mercure":{name:"Mercure",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1709809"},addTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},removeTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Novotel":{name:"Novotel",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q420545"},addTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},removeTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Park Hyatt":{name:"Park Hyatt",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1425063"},addTags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",operator:"Hyatt",tourism:"hotel"},removeTags:{brand:"Park Hyatt","brand:wikidata":"Q1425063","brand:wikipedia":"en:Hyatt",name:"Park Hyatt",operator:"Hyatt",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Premier Inn":{name:"Premier Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q2108626"},addTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},removeTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Première Classe":{name:"Première Classe",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q5964551"},addTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},removeTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn":{name:"Quality Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},removeTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn & Suites":{name:"Quality Inn & Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},removeTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ramada":{name:"Ramada",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1502859"},addTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Red Roof Inn":{name:"Red Roof Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7304949"},addTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},removeTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Residence Inn":{name:"Residence Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7315394"},addTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},removeTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sheraton":{name:"Sheraton",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q634831"},addTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},removeTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sleep Inn":{name:"Sleep Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1075788"},addTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},removeTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Staybridge Suites":{name:"Staybridge Suites",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7605116"},addTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},removeTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Travelodge":{name:"Travelodge",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q7836087"},addTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},removeTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/東横イン":{name:"東横イン",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"hotel","brand:wikidata":"Q1320541"},addTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},removeTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/motel/Econo Lodge":{name:"Econo Lodge",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5333330"},addTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},removeTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Motel 6":{name:"Motel 6",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q2188884"},addTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},removeTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Rodeway Inn":{name:"Rodeway Inn",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q7356709"},addTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},removeTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Super 8":{name:"Super 8",icon:"maki-lodging",geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5364003"},addTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"},removeTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",operator:"Wyndham Hotels and Resorts","operator:wikidata":"Q8040120","operator:wikipedia":"en:Wyndham Hotels and Resorts",tourism:"motel"},matchScore:2,suggestion:true}};
25812
25813   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","category-utility","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/crossing/marked","highway/crossing/unmarked","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/enforcement","type/site","relation"]};
25814
25815   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/garage","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf-area":{icon:"maki-golf",geometry:"area",name:"Golf Features",members:["golf/fairway","golf/green","golf/lateral_water_hazard","golf/rough","golf/bunker","golf/tee","golf/water_hazard","golf/driving_range"]},"category-golf-line":{icon:"maki-golf",geometry:"line",name:"Golf Features",members:["golf/hole","golf/cartpath","golf/cartpath_service","golf/path"]},"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:["highway/footway/marked","highway/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-utility":{icon:"iD-category-utility",geometry:"line",name:"Utility Features",members:["power/line","power/minor_line","man_made/pipeline","power/cable/underground"]},"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"]}};
25816
25817   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",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"},architect:{key:"architect",type:"text",label:"Architect"},"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"},attraction:{key:"attraction",type:"typeCombo",label:"Type"},backrest:{key:"backrest",type:"check",label:"Backrest"},bar:{key:"bar",type:"check",label:"Bar"},barrier:{key:"barrier",type:"typeCombo",label:"Type"},basin:{key:"basin",type:"combo",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:"Beauty Specialty"},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"},"bridge/support":{key:"bridge:support",type:"combo",label:"Type"},building_area:{key:"building",type:"combo","default":"yes",geometry:"area",label:"Building"},building:{key:"building",type:"combo",label:"Building"},"building/material":{key:"building:material",type:"combo",label:"Material"},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"},check_date:{key:"check_date",type:"text",label:"Last Checked Date"},clothes:{key:"clothes",type:"semiCombo",label:"Clothes"},club:{key:"club",type:"typeCombo",label:"Type"},collection_times:{key:"collection_times",type:"text",label:"Collection Times"},colour:{key:"colour",type:"text",label:"Color"},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"]},conveying:{key:"conveying",type:"typeCombo",label:"Movement Direction",strings:{options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}}},country:{key:"country",type:"combo",label:"Country"},couplings:{key:"couplings",type:"number",minValue:1,label:"Couplings",placeholder:"1, 2, 3..."},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","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",prerequisiteTag:{key:"religion"}},denotation:{key:"denotation",type:"combo",label:"Denotation"},departures_board:{key:"departures_board",type:"combo",label:"Departures Board",strings:{options:{yes:"Yes",timetable:"Timetable",realtime:"Realtime",no:"None"}}},description:{key:"description",type:"textarea",label:"Description",universal:true},design:{key:"design",type:"combo",label:"Design"},destination_oneway:{key:"destination",type:"semiCombo",label:"Destinations",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/ref_oneway":{key:"destination:ref",type:"semiCombo",label:"Destination Road Numbers",prerequisiteTag:{key:"oneway",value:"yes"},snake_case:false},"destination/symbol_oneway":{key:"destination:symbol",type:"semiCombo",label:"Destination Symbols",prerequisiteTag:{key:"oneway",value:"yes"}},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"]},diet_multi:{key:"diet:",type:"multiCombo",label:"Diet Types"},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:"Distance"},dock:{key:"dock",type:"combo",label:"Type"},dog:{key:"dog",type:"combo",label:"Dogs",strings:{options:{yes:"Allowed",leashed:"Leashed Only",no:"Not Allowed"}}},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",label:"Email"},embankment:{key:"embankment",type:"typeCombo",label:"Type",placeholder:"Default"},emergency:{key:"emergency",type:"check",label:"Emergency"},enforcement:{key:"enforcement",type:"combo",label:"Type"},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",placeholder:"+31 42 123 4567"},fee:{key:"fee",type:"check",label:"Fee"},fence_type:{key:"fence_type",type:"combo",label:"Type"},"fire_hydrant/diameter":{key:"fire_hydrant:diameter",type:"combo",label:"Diameter (mm, in, or letters)",snake_case:false},"fire_hydrant/pressure":{key:"fire_hydrant:pressure",type:"combo",label:"Pressure (bar)",snake_case:false},"fire_hydrant/type":{key:"fire_hydrant:type",type:"combo",label:"Shape",strings:{options:{pillar:"Pillar/Aboveground",underground:"Underground",wall:"Wall",pipe:"Capped Pipe"}}},fireplace:{key:"fireplace",type:"check",label:"Fireplace"},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},"flag/type":{key:"flag:type",type:"combo",label:"Flag Type"},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency_electrified:{key:"frequency",type:"combo",label:"Operating Frequency",prerequisiteTag:{key:"electrified",valueNot:"no"}},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},from:{key:"from",type:"text",label:"From"},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:"typeCombo",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW...",snake_case:false},"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"},"historic/wreck/date_sunk":{key:"wreck:date_sunk",type:"text",label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{key:"wreck:visible_at_high_tide",type:"check",label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{key:"wreck:visible_at_low_tide",type:"check",label:"Visible At Low Tide"},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_yes:{key:"intermittent",type:"check",label:"Intermittent","default":"yes"},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",prerequisiteTag:{key:"internet_access",valueNot:"no"}},"internet_access/ssid":{key:"internet_access:ssid",type:"text",label:"SSID (Network Name)",prerequisiteTag:{key:"internet_access",valueNot:"no"}},junction_line:{key:"junction",type:"combo",label:"Junction",strings:{options:{roundabout:"Roundabout",circular:"Traffic Circle",jughandle:"Jughandle"}}},"junction/ref_oneway":{key:"junction:ref",type:"text",label:"Junction Number",prerequisiteTag:{key:"oneway",value:"yes"}},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..."},language_multi:{key:"language:",type:"multiCombo",label:"Languages"},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_pool:{key:"location",type:"typeCombo",label:"Location",strings:{options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}}},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"},material:{key:"material",type:"combo",label:"Material"},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"},minspeed:{key:"minspeed",type:"maxspeed",label:"Minimum Speed Limit",placeholder:"20, 30, 40..."},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"}}},"oneway/bicycle":{key:"oneway:bicycle",type:"check",label:"One Way (Bicycles)",prerequisiteTag:{key:"oneway"}},opening_date:{key:"opening_date",type:"text",label:"Expected Opening Date"},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"}}},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types"},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}}},"piste/difficulty_skitour":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}}},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}}},"piste/grooming_downhill":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}}},"piste/grooming_hike":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}}},"piste/grooming_nordic":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"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",connection:"Connection"}}},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"},recycling_type:{key:"recycling_type",type:"combo",label:"Type",placeholder:"Container, Center",strings:{options:{container:"Container",centre:"Center"}}},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"},"roof/colour":{key:"roof:colour",type:"combo",label:"Roof Color"},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"}}},salt:{key:"salt",type:"check",label:"Salt"},sanitary_dump_station:{key:"sanitary_dump_station",type:"check",label:"Toilet Disposal"},scuba_diving:{key:"scuba_diving:",type:"multiCombo",label:"Services",options:["repair","courses","rental","filling","air_filling","nitrox_filling","trimix_filling","oxygen_filling"]},"seamark/beacon_isolated_danger/shape":{key:"seamark:beacon_isolated_danger:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/category":{key:"seamark:beacon_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}}},"seamark/beacon_lateral/colour":{key:"seamark:beacon_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green",grey:"Grey"}}},"seamark/beacon_lateral/shape":{key:"seamark:beacon_lateral:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/system":{key:"seamark:beacon_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/buoy_lateral/category":{key:"seamark:buoy_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}}},"seamark/buoy_lateral/colour":{key:"seamark:buoy_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}}},"seamark/buoy_lateral/shape":{key:"seamark:buoy_lateral:shape",type:"combo",label:"Shape"},"seamark/buoy_lateral/system":{key:"seamark:buoy_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/mooring/category":{key:"seamark:mooring:category",type:"combo",label:"Category"},"seamark/type":{key:"seamark:type",type:"combo",label:"Seamark"},"seamark/wreck/category":{key:"seamark:wreck:category",type:"combo",label:"Category"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},seats:{key:"seats",type:"number",minValue:0,label:"Seats",placeholder:"2, 4, 6..."},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"},"survey/date":{key:"survey:date",type:"text",label:"Last Survey Date"},swimming_pool:{key:"swimming_pool",type:"combo",label:"Type"},"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"}}},tidal:{key:"tidal",type:"check",label:"Tidal"},to:{key:"to",type:"text",label:"To"},"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:{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_sign:{key:"traffic_sign",type:"typeCombo",label:"Traffic Sign"},"traffic_sign/direction":{key:"traffic_sign:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},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_electrified:{key:"voltage",type:"combo",label:"Voltage",prerequisiteTag:{key:"electrified",valueNot:"no"}},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_source:{key:"water_source","default":"main",type:"combo",label:"Water Source"},water_volume:{key:"water_volume",type:"number",label:"Water Reserve Volume (m³)",snake_case:false},water:{key:"water",type:"combo",label:"Type"},waterway:{key:"waterway",type:"typeCombo",label:"Type"},website:{key:"website",type:"url",icon:"website",placeholder:"https://example.com",label:"Website"},wetland:{key:"wetland",type:"combo",label:"Type"},wheelchair:{key:"wheelchair",type:"radio",options:["yes","limited","no"],icon:"maki-wheelchair",label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikidata:{key:"wikidata",type:"wikidata",icon:"wikipedia",universal:true,label:"Wikidata"},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"}}}};
25818
25819   var quickselect = createCommonjsModule(function (module, exports) {
25820   (function (global, factory) {
25821         module.exports = factory();
25822   }(commonjsGlobal, (function () {
25823   function quickselect(arr, k, left, right, compare) {
25824       quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
25825   }
25826
25827   function quickselectStep(arr, k, left, right, compare) {
25828
25829       while (right > left) {
25830           if (right - left > 600) {
25831               var n = right - left + 1;
25832               var m = k - left + 1;
25833               var z = Math.log(n);
25834               var s = 0.5 * Math.exp(2 * z / 3);
25835               var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
25836               var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
25837               var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
25838               quickselectStep(arr, k, newLeft, newRight, compare);
25839           }
25840
25841           var t = arr[k];
25842           var i = left;
25843           var j = right;
25844
25845           swap(arr, left, k);
25846           if (compare(arr[right], t) > 0) swap(arr, left, right);
25847
25848           while (i < j) {
25849               swap(arr, i, j);
25850               i++;
25851               j--;
25852               while (compare(arr[i], t) < 0) i++;
25853               while (compare(arr[j], t) > 0) j--;
25854           }
25855
25856           if (compare(arr[left], t) === 0) swap(arr, left, j);
25857           else {
25858               j++;
25859               swap(arr, j, right);
25860           }
25861
25862           if (j <= k) left = j + 1;
25863           if (k <= j) right = j - 1;
25864       }
25865   }
25866
25867   function swap(arr, i, j) {
25868       var tmp = arr[i];
25869       arr[i] = arr[j];
25870       arr[j] = tmp;
25871   }
25872
25873   function defaultCompare(a, b) {
25874       return a < b ? -1 : a > b ? 1 : 0;
25875   }
25876
25877   return quickselect;
25878
25879   })));
25880   });
25881
25882   var rbush_1 = rbush;
25883   var default_1 = rbush;
25884
25885
25886
25887   function rbush(maxEntries, format) {
25888       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
25889
25890       // max entries in a node is 9 by default; min node fill is 40% for best performance
25891       this._maxEntries = Math.max(4, maxEntries || 9);
25892       this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
25893
25894       if (format) {
25895           this._initFormat(format);
25896       }
25897
25898       this.clear();
25899   }
25900
25901   rbush.prototype = {
25902
25903       all: function () {
25904           return this._all(this.data, []);
25905       },
25906
25907       search: function (bbox) {
25908
25909           var node = this.data,
25910               result = [],
25911               toBBox = this.toBBox;
25912
25913           if (!intersects$1(bbox, node)) return result;
25914
25915           var nodesToSearch = [],
25916               i, len, child, childBBox;
25917
25918           while (node) {
25919               for (i = 0, len = node.children.length; i < len; i++) {
25920
25921                   child = node.children[i];
25922                   childBBox = node.leaf ? toBBox(child) : child;
25923
25924                   if (intersects$1(bbox, childBBox)) {
25925                       if (node.leaf) result.push(child);
25926                       else if (contains$2(bbox, childBBox)) this._all(child, result);
25927                       else nodesToSearch.push(child);
25928                   }
25929               }
25930               node = nodesToSearch.pop();
25931           }
25932
25933           return result;
25934       },
25935
25936       collides: function (bbox) {
25937
25938           var node = this.data,
25939               toBBox = this.toBBox;
25940
25941           if (!intersects$1(bbox, node)) return false;
25942
25943           var nodesToSearch = [],
25944               i, len, child, childBBox;
25945
25946           while (node) {
25947               for (i = 0, len = node.children.length; i < len; i++) {
25948
25949                   child = node.children[i];
25950                   childBBox = node.leaf ? toBBox(child) : child;
25951
25952                   if (intersects$1(bbox, childBBox)) {
25953                       if (node.leaf || contains$2(bbox, childBBox)) return true;
25954                       nodesToSearch.push(child);
25955                   }
25956               }
25957               node = nodesToSearch.pop();
25958           }
25959
25960           return false;
25961       },
25962
25963       load: function (data) {
25964           if (!(data && data.length)) return this;
25965
25966           if (data.length < this._minEntries) {
25967               for (var i = 0, len = data.length; i < len; i++) {
25968                   this.insert(data[i]);
25969               }
25970               return this;
25971           }
25972
25973           // recursively build the tree with the given data from scratch using OMT algorithm
25974           var node = this._build(data.slice(), 0, data.length - 1, 0);
25975
25976           if (!this.data.children.length) {
25977               // save as is if tree is empty
25978               this.data = node;
25979
25980           } else if (this.data.height === node.height) {
25981               // split root if trees have the same height
25982               this._splitRoot(this.data, node);
25983
25984           } else {
25985               if (this.data.height < node.height) {
25986                   // swap trees if inserted one is bigger
25987                   var tmpNode = this.data;
25988                   this.data = node;
25989                   node = tmpNode;
25990               }
25991
25992               // insert the small tree into the large tree at appropriate level
25993               this._insert(node, this.data.height - node.height - 1, true);
25994           }
25995
25996           return this;
25997       },
25998
25999       insert: function (item) {
26000           if (item) this._insert(item, this.data.height - 1);
26001           return this;
26002       },
26003
26004       clear: function () {
26005           this.data = createNode([]);
26006           return this;
26007       },
26008
26009       remove: function (item, equalsFn) {
26010           if (!item) return this;
26011
26012           var node = this.data,
26013               bbox = this.toBBox(item),
26014               path = [],
26015               indexes = [],
26016               i, parent, index, goingUp;
26017
26018           // depth-first iterative tree traversal
26019           while (node || path.length) {
26020
26021               if (!node) { // go up
26022                   node = path.pop();
26023                   parent = path[path.length - 1];
26024                   i = indexes.pop();
26025                   goingUp = true;
26026               }
26027
26028               if (node.leaf) { // check current node
26029                   index = findItem(item, node.children, equalsFn);
26030
26031                   if (index !== -1) {
26032                       // item found, remove the item and condense tree upwards
26033                       node.children.splice(index, 1);
26034                       path.push(node);
26035                       this._condense(path);
26036                       return this;
26037                   }
26038               }
26039
26040               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
26041                   path.push(node);
26042                   indexes.push(i);
26043                   i = 0;
26044                   parent = node;
26045                   node = node.children[0];
26046
26047               } else if (parent) { // go right
26048                   i++;
26049                   node = parent.children[i];
26050                   goingUp = false;
26051
26052               } else node = null; // nothing found
26053           }
26054
26055           return this;
26056       },
26057
26058       toBBox: function (item) { return item; },
26059
26060       compareMinX: compareNodeMinX,
26061       compareMinY: compareNodeMinY,
26062
26063       toJSON: function () { return this.data; },
26064
26065       fromJSON: function (data) {
26066           this.data = data;
26067           return this;
26068       },
26069
26070       _all: function (node, result) {
26071           var nodesToSearch = [];
26072           while (node) {
26073               if (node.leaf) result.push.apply(result, node.children);
26074               else nodesToSearch.push.apply(nodesToSearch, node.children);
26075
26076               node = nodesToSearch.pop();
26077           }
26078           return result;
26079       },
26080
26081       _build: function (items, left, right, height) {
26082
26083           var N = right - left + 1,
26084               M = this._maxEntries,
26085               node;
26086
26087           if (N <= M) {
26088               // reached leaf level; return leaf
26089               node = createNode(items.slice(left, right + 1));
26090               calcBBox(node, this.toBBox);
26091               return node;
26092           }
26093
26094           if (!height) {
26095               // target height of the bulk-loaded tree
26096               height = Math.ceil(Math.log(N) / Math.log(M));
26097
26098               // target number of root entries to maximize storage utilization
26099               M = Math.ceil(N / Math.pow(M, height - 1));
26100           }
26101
26102           node = createNode([]);
26103           node.leaf = false;
26104           node.height = height;
26105
26106           // split the items into M mostly square tiles
26107
26108           var N2 = Math.ceil(N / M),
26109               N1 = N2 * Math.ceil(Math.sqrt(M)),
26110               i, j, right2, right3;
26111
26112           multiSelect(items, left, right, N1, this.compareMinX);
26113
26114           for (i = left; i <= right; i += N1) {
26115
26116               right2 = Math.min(i + N1 - 1, right);
26117
26118               multiSelect(items, i, right2, N2, this.compareMinY);
26119
26120               for (j = i; j <= right2; j += N2) {
26121
26122                   right3 = Math.min(j + N2 - 1, right2);
26123
26124                   // pack each entry recursively
26125                   node.children.push(this._build(items, j, right3, height - 1));
26126               }
26127           }
26128
26129           calcBBox(node, this.toBBox);
26130
26131           return node;
26132       },
26133
26134       _chooseSubtree: function (bbox, node, level, path) {
26135
26136           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
26137
26138           while (true) {
26139               path.push(node);
26140
26141               if (node.leaf || path.length - 1 === level) break;
26142
26143               minArea = minEnlargement = Infinity;
26144
26145               for (i = 0, len = node.children.length; i < len; i++) {
26146                   child = node.children[i];
26147                   area = bboxArea(child);
26148                   enlargement = enlargedArea(bbox, child) - area;
26149
26150                   // choose entry with the least area enlargement
26151                   if (enlargement < minEnlargement) {
26152                       minEnlargement = enlargement;
26153                       minArea = area < minArea ? area : minArea;
26154                       targetNode = child;
26155
26156                   } else if (enlargement === minEnlargement) {
26157                       // otherwise choose one with the smallest area
26158                       if (area < minArea) {
26159                           minArea = area;
26160                           targetNode = child;
26161                       }
26162                   }
26163               }
26164
26165               node = targetNode || node.children[0];
26166           }
26167
26168           return node;
26169       },
26170
26171       _insert: function (item, level, isNode) {
26172
26173           var toBBox = this.toBBox,
26174               bbox = isNode ? item : toBBox(item),
26175               insertPath = [];
26176
26177           // find the best node for accommodating the item, saving all nodes along the path too
26178           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
26179
26180           // put the item into the node
26181           node.children.push(item);
26182           extend$1(node, bbox);
26183
26184           // split on node overflow; propagate upwards if necessary
26185           while (level >= 0) {
26186               if (insertPath[level].children.length > this._maxEntries) {
26187                   this._split(insertPath, level);
26188                   level--;
26189               } else break;
26190           }
26191
26192           // adjust bboxes along the insertion path
26193           this._adjustParentBBoxes(bbox, insertPath, level);
26194       },
26195
26196       // split overflowed node into two
26197       _split: function (insertPath, level) {
26198
26199           var node = insertPath[level],
26200               M = node.children.length,
26201               m = this._minEntries;
26202
26203           this._chooseSplitAxis(node, m, M);
26204
26205           var splitIndex = this._chooseSplitIndex(node, m, M);
26206
26207           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
26208           newNode.height = node.height;
26209           newNode.leaf = node.leaf;
26210
26211           calcBBox(node, this.toBBox);
26212           calcBBox(newNode, this.toBBox);
26213
26214           if (level) insertPath[level - 1].children.push(newNode);
26215           else this._splitRoot(node, newNode);
26216       },
26217
26218       _splitRoot: function (node, newNode) {
26219           // split root node
26220           this.data = createNode([node, newNode]);
26221           this.data.height = node.height + 1;
26222           this.data.leaf = false;
26223           calcBBox(this.data, this.toBBox);
26224       },
26225
26226       _chooseSplitIndex: function (node, m, M) {
26227
26228           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
26229
26230           minOverlap = minArea = Infinity;
26231
26232           for (i = m; i <= M - m; i++) {
26233               bbox1 = distBBox(node, 0, i, this.toBBox);
26234               bbox2 = distBBox(node, i, M, this.toBBox);
26235
26236               overlap = intersectionArea(bbox1, bbox2);
26237               area = bboxArea(bbox1) + bboxArea(bbox2);
26238
26239               // choose distribution with minimum overlap
26240               if (overlap < minOverlap) {
26241                   minOverlap = overlap;
26242                   index = i;
26243
26244                   minArea = area < minArea ? area : minArea;
26245
26246               } else if (overlap === minOverlap) {
26247                   // otherwise choose distribution with minimum area
26248                   if (area < minArea) {
26249                       minArea = area;
26250                       index = i;
26251                   }
26252               }
26253           }
26254
26255           return index;
26256       },
26257
26258       // sorts node children by the best axis for split
26259       _chooseSplitAxis: function (node, m, M) {
26260
26261           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
26262               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
26263               xMargin = this._allDistMargin(node, m, M, compareMinX),
26264               yMargin = this._allDistMargin(node, m, M, compareMinY);
26265
26266           // if total distributions margin value is minimal for x, sort by minX,
26267           // otherwise it's already sorted by minY
26268           if (xMargin < yMargin) node.children.sort(compareMinX);
26269       },
26270
26271       // total margin of all possible split distributions where each node is at least m full
26272       _allDistMargin: function (node, m, M, compare) {
26273
26274           node.children.sort(compare);
26275
26276           var toBBox = this.toBBox,
26277               leftBBox = distBBox(node, 0, m, toBBox),
26278               rightBBox = distBBox(node, M - m, M, toBBox),
26279               margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
26280               i, child;
26281
26282           for (i = m; i < M - m; i++) {
26283               child = node.children[i];
26284               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
26285               margin += bboxMargin(leftBBox);
26286           }
26287
26288           for (i = M - m - 1; i >= m; i--) {
26289               child = node.children[i];
26290               extend$1(rightBBox, node.leaf ? toBBox(child) : child);
26291               margin += bboxMargin(rightBBox);
26292           }
26293
26294           return margin;
26295       },
26296
26297       _adjustParentBBoxes: function (bbox, path, level) {
26298           // adjust bboxes along the given tree path
26299           for (var i = level; i >= 0; i--) {
26300               extend$1(path[i], bbox);
26301           }
26302       },
26303
26304       _condense: function (path) {
26305           // go through the path, removing empty nodes and updating bboxes
26306           for (var i = path.length - 1, siblings; i >= 0; i--) {
26307               if (path[i].children.length === 0) {
26308                   if (i > 0) {
26309                       siblings = path[i - 1].children;
26310                       siblings.splice(siblings.indexOf(path[i]), 1);
26311
26312                   } else this.clear();
26313
26314               } else calcBBox(path[i], this.toBBox);
26315           }
26316       },
26317
26318       _initFormat: function (format) {
26319           // data format (minX, minY, maxX, maxY accessors)
26320
26321           // uses eval-type function compilation instead of just accepting a toBBox function
26322           // because the algorithms are very sensitive to sorting functions performance,
26323           // so they should be dead simple and without inner calls
26324
26325           var compareArr = ['return a', ' - b', ';'];
26326
26327           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
26328           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
26329
26330           this.toBBox = new Function('a',
26331               'return {minX: a' + format[0] +
26332               ', minY: a' + format[1] +
26333               ', maxX: a' + format[2] +
26334               ', maxY: a' + format[3] + '};');
26335       }
26336   };
26337
26338   function findItem(item, items, equalsFn) {
26339       if (!equalsFn) return items.indexOf(item);
26340
26341       for (var i = 0; i < items.length; i++) {
26342           if (equalsFn(item, items[i])) return i;
26343       }
26344       return -1;
26345   }
26346
26347   // calculate node's bbox from bboxes of its children
26348   function calcBBox(node, toBBox) {
26349       distBBox(node, 0, node.children.length, toBBox, node);
26350   }
26351
26352   // min bounding rectangle of node children from k to p-1
26353   function distBBox(node, k, p, toBBox, destNode) {
26354       if (!destNode) destNode = createNode(null);
26355       destNode.minX = Infinity;
26356       destNode.minY = Infinity;
26357       destNode.maxX = -Infinity;
26358       destNode.maxY = -Infinity;
26359
26360       for (var i = k, child; i < p; i++) {
26361           child = node.children[i];
26362           extend$1(destNode, node.leaf ? toBBox(child) : child);
26363       }
26364
26365       return destNode;
26366   }
26367
26368   function extend$1(a, b) {
26369       a.minX = Math.min(a.minX, b.minX);
26370       a.minY = Math.min(a.minY, b.minY);
26371       a.maxX = Math.max(a.maxX, b.maxX);
26372       a.maxY = Math.max(a.maxY, b.maxY);
26373       return a;
26374   }
26375
26376   function compareNodeMinX(a, b) { return a.minX - b.minX; }
26377   function compareNodeMinY(a, b) { return a.minY - b.minY; }
26378
26379   function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
26380   function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
26381
26382   function enlargedArea(a, b) {
26383       return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
26384              (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
26385   }
26386
26387   function intersectionArea(a, b) {
26388       var minX = Math.max(a.minX, b.minX),
26389           minY = Math.max(a.minY, b.minY),
26390           maxX = Math.min(a.maxX, b.maxX),
26391           maxY = Math.min(a.maxY, b.maxY);
26392
26393       return Math.max(0, maxX - minX) *
26394              Math.max(0, maxY - minY);
26395   }
26396
26397   function contains$2(a, b) {
26398       return a.minX <= b.minX &&
26399              a.minY <= b.minY &&
26400              b.maxX <= a.maxX &&
26401              b.maxY <= a.maxY;
26402   }
26403
26404   function intersects$1(a, b) {
26405       return b.minX <= a.maxX &&
26406              b.minY <= a.maxY &&
26407              b.maxX >= a.minX &&
26408              b.maxY >= a.minY;
26409   }
26410
26411   function createNode(children) {
26412       return {
26413           children: children,
26414           height: 1,
26415           leaf: true,
26416           minX: Infinity,
26417           minY: Infinity,
26418           maxX: -Infinity,
26419           maxY: -Infinity
26420       };
26421   }
26422
26423   // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
26424   // combines selection algorithm with binary divide & conquer approach
26425
26426   function multiSelect(arr, left, right, n, compare) {
26427       var stack = [left, right],
26428           mid;
26429
26430       while (stack.length) {
26431           right = stack.pop();
26432           left = stack.pop();
26433
26434           if (right - left <= n) continue;
26435
26436           mid = left + Math.ceil((right - left) / n / 2) * n;
26437           quickselect(arr, mid, left, right, compare);
26438
26439           stack.push(left, mid, mid, right);
26440       }
26441   }
26442   rbush_1.default = default_1;
26443
26444   var lineclip_1 = lineclip;
26445
26446   lineclip.polyline = lineclip;
26447   lineclip.polygon = polygonclip;
26448
26449
26450   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
26451   // handle polylines rather than just segments
26452
26453   function lineclip(points, bbox, result) {
26454
26455       var len = points.length,
26456           codeA = bitCode(points[0], bbox),
26457           part = [],
26458           i, a, b, codeB, lastCode;
26459
26460       if (!result) result = [];
26461
26462       for (i = 1; i < len; i++) {
26463           a = points[i - 1];
26464           b = points[i];
26465           codeB = lastCode = bitCode(b, bbox);
26466
26467           while (true) {
26468
26469               if (!(codeA | codeB)) { // accept
26470                   part.push(a);
26471
26472                   if (codeB !== lastCode) { // segment went outside
26473                       part.push(b);
26474
26475                       if (i < len - 1) { // start a new line
26476                           result.push(part);
26477                           part = [];
26478                       }
26479                   } else if (i === len - 1) {
26480                       part.push(b);
26481                   }
26482                   break;
26483
26484               } else if (codeA & codeB) { // trivial reject
26485                   break;
26486
26487               } else if (codeA) { // a outside, intersect with clip edge
26488                   a = intersect$1(a, b, codeA, bbox);
26489                   codeA = bitCode(a, bbox);
26490
26491               } else { // b outside
26492                   b = intersect$1(a, b, codeB, bbox);
26493                   codeB = bitCode(b, bbox);
26494               }
26495           }
26496
26497           codeA = lastCode;
26498       }
26499
26500       if (part.length) result.push(part);
26501
26502       return result;
26503   }
26504
26505   // Sutherland-Hodgeman polygon clipping algorithm
26506
26507   function polygonclip(points, bbox) {
26508
26509       var result, edge, prev, prevInside, i, p, inside;
26510
26511       // clip against each side of the clip rectangle
26512       for (edge = 1; edge <= 8; edge *= 2) {
26513           result = [];
26514           prev = points[points.length - 1];
26515           prevInside = !(bitCode(prev, bbox) & edge);
26516
26517           for (i = 0; i < points.length; i++) {
26518               p = points[i];
26519               inside = !(bitCode(p, bbox) & edge);
26520
26521               // if segment goes through the clip window, add an intersection
26522               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
26523
26524               if (inside) result.push(p); // add a point if it's inside
26525
26526               prev = p;
26527               prevInside = inside;
26528           }
26529
26530           points = result;
26531
26532           if (!points.length) break;
26533       }
26534
26535       return result;
26536   }
26537
26538   // intersect a segment against one of the 4 lines that make up the bbox
26539
26540   function intersect$1(a, b, edge, bbox) {
26541       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
26542              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
26543              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
26544              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
26545              null;
26546   }
26547
26548   // bit code reflects the point position relative to the bbox:
26549
26550   //         left  mid  right
26551   //    top  1001  1000  1010
26552   //    mid  0001  0000  0010
26553   // bottom  0101  0100  0110
26554
26555   function bitCode(p, bbox) {
26556       var code = 0;
26557
26558       if (p[0] < bbox[0]) code |= 1; // left
26559       else if (p[0] > bbox[2]) code |= 2; // right
26560
26561       if (p[1] < bbox[1]) code |= 4; // bottom
26562       else if (p[1] > bbox[3]) code |= 8; // top
26563
26564       return code;
26565   }
26566
26567   var whichPolygon_1 = whichPolygon;
26568
26569   function whichPolygon(data) {
26570       var bboxes = [];
26571       for (var i = 0; i < data.features.length; i++) {
26572           var feature = data.features[i];
26573           var coords = feature.geometry.coordinates;
26574
26575           if (feature.geometry.type === 'Polygon') {
26576               bboxes.push(treeItem(coords, feature.properties));
26577
26578           } else if (feature.geometry.type === 'MultiPolygon') {
26579               for (var j = 0; j < coords.length; j++) {
26580                   bboxes.push(treeItem(coords[j], feature.properties));
26581               }
26582           }
26583       }
26584
26585       var tree = rbush_1().load(bboxes);
26586
26587       function query(p, multi) {
26588           var output = [],
26589               result = tree.search({
26590                   minX: p[0],
26591                   minY: p[1],
26592                   maxX: p[0],
26593                   maxY: p[1]
26594               });
26595           for (var i = 0; i < result.length; i++) {
26596               if (insidePolygon(result[i].coords, p)) {
26597                   if (multi)
26598                       output.push(result[i].props);
26599                   else
26600                       return result[i].props;
26601               }
26602           }
26603           return multi && output.length ? output : null;
26604       }
26605
26606       query.tree = tree;
26607       query.bbox = function queryBBox(bbox) {
26608           var output = [];
26609           var result = tree.search({
26610               minX: bbox[0],
26611               minY: bbox[1],
26612               maxX: bbox[2],
26613               maxY: bbox[3]
26614           });
26615           for (var i = 0; i < result.length; i++) {
26616               if (polygonIntersectsBBox(result[i].coords, bbox)) {
26617                   output.push(result[i].props);
26618               }
26619           }
26620           return output;
26621       };
26622
26623       return query;
26624   }
26625
26626   function polygonIntersectsBBox(polygon, bbox) {
26627       var bboxCenter = [
26628           (bbox[0] + bbox[2]) / 2,
26629           (bbox[1] + bbox[3]) / 2
26630       ];
26631       if (insidePolygon(polygon, bboxCenter)) return true;
26632       for (var i = 0; i < polygon.length; i++) {
26633           if (lineclip_1(polygon[i], bbox).length > 0) return true;
26634       }
26635       return false;
26636   }
26637
26638   // ray casting algorithm for detecting if point is in polygon
26639   function insidePolygon(rings, p) {
26640       var inside = false;
26641       for (var i = 0, len = rings.length; i < len; i++) {
26642           var ring = rings[i];
26643           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
26644               if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
26645           }
26646       }
26647       return inside;
26648   }
26649
26650   function rayIntersect(p, p1, p2) {
26651       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]);
26652   }
26653
26654   function treeItem(coords, props) {
26655       var item = {
26656           minX: Infinity,
26657           minY: Infinity,
26658           maxX: -Infinity,
26659           maxY: -Infinity,
26660           coords: coords,
26661           props: props
26662       };
26663
26664       for (var i = 0; i < coords[0].length; i++) {
26665           var p = coords[0][i];
26666           item.minX = Math.min(item.minX, p[0]);
26667           item.minY = Math.min(item.minY, p[1]);
26668           item.maxX = Math.max(item.maxX, p[0]);
26669           item.maxY = Math.max(item.maxY, p[1]);
26670       }
26671       return item;
26672   }
26673
26674   // index the osm-community-index
26675   var ociFeatureCollection = values$1(features$2).map(function(feature) {
26676       // workaround for which-polygon: only supports `properties`, not `id`
26677       // https://github.com/mapbox/which-polygon/pull/6
26678       feature.properties = {
26679           id: feature.id,
26680           area: d3_geoArea(feature)   // also precompute areas
26681       };
26682       return feature;
26683   });
26684
26685
26686   var data = {
26687       community: {
26688           features: features$2,
26689           resources: resources,
26690           query: whichPolygon_1({
26691               type: 'FeatureCollection',
26692               features: ociFeatureCollection
26693           })
26694       },
26695       imagery: dataImagery,  //legacy
26696       presets: {
26697           presets: presets,
26698           defaults: defaults,
26699           categories: categories,
26700           fields: fields
26701       }
26702   };
26703
26704   function osmEntity(attrs) {
26705       // For prototypal inheritance.
26706       if (this instanceof osmEntity) return;
26707
26708       // Create the appropriate subtype.
26709       if (attrs && attrs.type) {
26710           return osmEntity[attrs.type].apply(this, arguments);
26711       } else if (attrs && attrs.id) {
26712           return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
26713       }
26714
26715       // Initialize a generic Entity (used only in tests).
26716       return (new osmEntity()).initialize(arguments);
26717   }
26718
26719
26720   osmEntity.id = function(type) {
26721       return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
26722   };
26723
26724
26725   osmEntity.id.next = {
26726       changeset: -1, node: -1, way: -1, relation: -1
26727   };
26728
26729
26730   osmEntity.id.fromOSM = function(type, id) {
26731       return type[0] + id;
26732   };
26733
26734
26735   osmEntity.id.toOSM = function(id) {
26736       return id.slice(1);
26737   };
26738
26739
26740   osmEntity.id.type = function(id) {
26741       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
26742   };
26743
26744
26745   // A function suitable for use as the second argument to d3.selection#data().
26746   osmEntity.key = function(entity) {
26747       return entity.id + 'v' + (entity.v || 0);
26748   };
26749
26750
26751   osmEntity.prototype = {
26752
26753       tags: {},
26754
26755
26756       initialize: function(sources) {
26757           for (var i = 0; i < sources.length; ++i) {
26758               var source = sources[i];
26759               for (var prop in source) {
26760                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
26761                       if (source[prop] === undefined) {
26762                           delete this[prop];
26763                       } else {
26764                           this[prop] = source[prop];
26765                       }
26766                   }
26767               }
26768           }
26769
26770           if (!this.id && this.type) {
26771               this.id = osmEntity.id(this.type);
26772           }
26773           if (!this.hasOwnProperty('visible')) {
26774               this.visible = true;
26775           }
26776
26777           return this;
26778       },
26779
26780
26781       copy: function(resolver, copies) {
26782           if (copies[this.id])
26783               return copies[this.id];
26784
26785           var copy = osmEntity(this, {id: undefined, user: undefined, version: undefined});
26786           copies[this.id] = copy;
26787
26788           return copy;
26789       },
26790
26791
26792       osmId: function() {
26793           return osmEntity.id.toOSM(this.id);
26794       },
26795
26796
26797       isNew: function() {
26798           return this.osmId() < 0;
26799       },
26800
26801
26802       update: function(attrs) {
26803           return osmEntity(this, attrs, {v: 1 + (this.v || 0)});
26804       },
26805
26806
26807       mergeTags: function(tags) {
26808           var merged = clone(this.tags), changed = false;
26809           for (var k in tags) {
26810               var t1 = merged[k],
26811                   t2 = tags[k];
26812               if (!t1) {
26813                   changed = true;
26814                   merged[k] = t2;
26815               } else if (t1 !== t2) {
26816                   changed = true;
26817                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
26818               }
26819           }
26820           return changed ? this.update({tags: merged}) : this;
26821       },
26822
26823
26824       intersects: function(extent, resolver) {
26825           return this.extent(resolver).intersects(extent);
26826       },
26827
26828
26829       hasNonGeometryTags: function() {
26830           return without(Object.keys(this.tags), 'area').length > 0;
26831       },
26832
26833       hasParentRelations: function(resolver) {
26834           return resolver.parentRelations(this).length > 0;
26835       },
26836
26837       hasInterestingTags: function() {
26838           return keys$1(this.tags).some(osmIsInterestingTag);
26839       },
26840
26841
26842       isHighwayIntersection: function() {
26843           return false;
26844       },
26845
26846       isDegenerate: function() {
26847           return true;
26848       },
26849
26850       deprecatedTags: function() {
26851           var tags = this.tags;
26852
26853           // if there are no tags, none can be deprecated
26854           if (Object.keys(tags).length === 0) return [];
26855
26856           var deprecated = [];
26857           dataDeprecated.forEach(function(d) {
26858               var matchesDeprecatedTags = every(Object.keys(d.old), function(key) {
26859                   return tags[key] && (d.old[key] === tags[key] || d.old[key] === '*');
26860               });
26861               if (matchesDeprecatedTags) {
26862                   deprecated.push(d);
26863               }
26864           });
26865
26866           return deprecated;
26867       }
26868   };
26869
26870   function geoExtent(min, max) {
26871       if (!(this instanceof geoExtent)) {
26872           return new geoExtent(min, max);
26873       } else if (min instanceof geoExtent) {
26874           return min;
26875       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
26876           this[0] = min[0];
26877           this[1] = min[1];
26878       } else {
26879           this[0] = min        || [ Infinity,  Infinity];
26880           this[1] = max || min || [-Infinity, -Infinity];
26881       }
26882   }
26883
26884   geoExtent.prototype = new Array(2);
26885
26886   assignIn(geoExtent.prototype, {
26887
26888       equals: function (obj) {
26889           return this[0][0] === obj[0][0] &&
26890               this[0][1] === obj[0][1] &&
26891               this[1][0] === obj[1][0] &&
26892               this[1][1] === obj[1][1];
26893       },
26894
26895
26896       extend: function(obj) {
26897           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26898           return geoExtent(
26899               [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
26900               [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
26901           );
26902       },
26903
26904
26905       _extend: function(extent) {
26906           this[0][0] = Math.min(extent[0][0], this[0][0]);
26907           this[0][1] = Math.min(extent[0][1], this[0][1]);
26908           this[1][0] = Math.max(extent[1][0], this[1][0]);
26909           this[1][1] = Math.max(extent[1][1], this[1][1]);
26910       },
26911
26912
26913       area: function() {
26914           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
26915       },
26916
26917
26918       center: function() {
26919           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
26920       },
26921
26922
26923       rectangle: function() {
26924           return [this[0][0], this[0][1], this[1][0], this[1][1]];
26925       },
26926
26927
26928       bbox: function() {
26929           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
26930       },
26931
26932
26933       polygon: function() {
26934           return [
26935               [this[0][0], this[0][1]],
26936               [this[0][0], this[1][1]],
26937               [this[1][0], this[1][1]],
26938               [this[1][0], this[0][1]],
26939               [this[0][0], this[0][1]]
26940           ];
26941       },
26942
26943
26944       contains: function(obj) {
26945           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26946           return obj[0][0] >= this[0][0] &&
26947                  obj[0][1] >= this[0][1] &&
26948                  obj[1][0] <= this[1][0] &&
26949                  obj[1][1] <= this[1][1];
26950       },
26951
26952
26953       intersects: function(obj) {
26954           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26955           return obj[0][0] <= this[1][0] &&
26956                  obj[0][1] <= this[1][1] &&
26957                  obj[1][0] >= this[0][0] &&
26958                  obj[1][1] >= this[0][1];
26959       },
26960
26961
26962       intersection: function(obj) {
26963           if (!this.intersects(obj)) return new geoExtent();
26964           return new geoExtent(
26965               [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
26966               [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
26967           );
26968       },
26969
26970
26971       percentContainedIn: function(obj) {
26972           if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
26973           var a1 = this.intersection(obj).area();
26974           var a2 = this.area();
26975
26976           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
26977               return 0;
26978           } else {
26979               return a1 / a2;
26980           }
26981       },
26982
26983
26984       padByMeters: function(meters) {
26985           var dLat = geoMetersToLat(meters);
26986           var dLon = geoMetersToLon(meters, this.center()[1]);
26987           return geoExtent(
26988               [this[0][0] - dLon, this[0][1] - dLat],
26989               [this[1][0] + dLon, this[1][1] + dLat]
26990           );
26991       },
26992
26993
26994       toParam: function() {
26995           return this.rectangle().join(',');
26996       }
26997
26998   });
26999
27000   // constants
27001   var TAU = 2 * Math.PI;
27002   var EQUATORIAL_RADIUS = 6356752.314245179;
27003   var POLAR_RADIUS = 6378137.0;
27004
27005
27006   function geoLatToMeters(dLat) {
27007       return dLat * (TAU * POLAR_RADIUS / 360);
27008   }
27009
27010
27011   function geoLonToMeters(dLon, atLat) {
27012       return Math.abs(atLat) >= 90 ? 0 :
27013           dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
27014   }
27015
27016
27017   function geoMetersToLat(m) {
27018       return m / (TAU * POLAR_RADIUS / 360);
27019   }
27020
27021
27022   function geoMetersToLon(m, atLat) {
27023       return Math.abs(atLat) >= 90 ? 0 :
27024           m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
27025   }
27026
27027
27028   function geoMetersToOffset(meters, tileSize) {
27029       tileSize = tileSize || 256;
27030       return [
27031           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
27032           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
27033       ];
27034   }
27035
27036
27037   function geoOffsetToMeters(offset, tileSize) {
27038       tileSize = tileSize || 256;
27039       return [
27040           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
27041           -offset[1] * TAU * POLAR_RADIUS / tileSize
27042       ];
27043   }
27044
27045
27046   // Equirectangular approximation of spherical distances on Earth
27047   function geoSphericalDistance(a, b) {
27048       var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
27049       var y = geoLatToMeters(a[1] - b[1]);
27050       return Math.sqrt((x * x) + (y * y));
27051   }
27052
27053
27054   // scale to zoom
27055   function geoScaleToZoom(k, tileSize) {
27056       tileSize = tileSize || 256;
27057       var log2ts = Math.log(tileSize) * Math.LOG2E;
27058       return Math.log(k * TAU) / Math.LN2 - log2ts;
27059   }
27060
27061
27062   // zoom to scale
27063   function geoZoomToScale(z, tileSize) {
27064       tileSize = tileSize || 256;
27065       return tileSize * Math.pow(2, z) / TAU;
27066   }
27067
27068
27069   // returns info about the node from `nodes` closest to the given `point`
27070   function geoSphericalClosestNode(nodes, point) {
27071       var minDistance = Infinity, distance;
27072       var indexOfMin;
27073
27074       for (var i in nodes) {
27075           distance = geoSphericalDistance(nodes[i].loc, point);
27076           if (distance < minDistance) {
27077               minDistance = distance;
27078               indexOfMin = i;
27079           }
27080       }
27081
27082       if (indexOfMin !== undefined) {
27083           return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
27084       } else {
27085           return null;
27086       }
27087   }
27088
27089   /**
27090    * The base implementation of `_.some` without support for iteratee shorthands.
27091    *
27092    * @private
27093    * @param {Array|Object} collection The collection to iterate over.
27094    * @param {Function} predicate The function invoked per iteration.
27095    * @returns {boolean} Returns `true` if any element passes the predicate check,
27096    *  else `false`.
27097    */
27098   function baseSome(collection, predicate) {
27099     var result;
27100
27101     baseEach(collection, function(value, index, collection) {
27102       result = predicate(value, index, collection);
27103       return !result;
27104     });
27105     return !!result;
27106   }
27107
27108   /**
27109    * Checks if `predicate` returns truthy for **any** element of `collection`.
27110    * Iteration is stopped once `predicate` returns truthy. The predicate is
27111    * invoked with three arguments: (value, index|key, collection).
27112    *
27113    * @static
27114    * @memberOf _
27115    * @since 0.1.0
27116    * @category Collection
27117    * @param {Array|Object} collection The collection to iterate over.
27118    * @param {Function} [predicate=_.identity] The function invoked per iteration.
27119    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
27120    * @returns {boolean} Returns `true` if any element passes the predicate check,
27121    *  else `false`.
27122    * @example
27123    *
27124    * _.some([null, 0, 'yes', false], Boolean);
27125    * // => true
27126    *
27127    * var users = [
27128    *   { 'user': 'barney', 'active': true },
27129    *   { 'user': 'fred',   'active': false }
27130    * ];
27131    *
27132    * // The `_.matches` iteratee shorthand.
27133    * _.some(users, { 'user': 'barney', 'active': false });
27134    * // => false
27135    *
27136    * // The `_.matchesProperty` iteratee shorthand.
27137    * _.some(users, ['active', false]);
27138    * // => true
27139    *
27140    * // The `_.property` iteratee shorthand.
27141    * _.some(users, 'active');
27142    * // => true
27143    */
27144   function some(collection, predicate, guard) {
27145     var func = isArray(collection) ? arraySome : baseSome;
27146     if (guard && isIterateeCall(collection, predicate, guard)) {
27147       predicate = undefined;
27148     }
27149     return func(collection, baseIteratee(predicate, 3));
27150   }
27151
27152   // vector equals
27153   function geoVecEqual(a, b, epsilon) {
27154       if (epsilon) {
27155           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
27156       } else {
27157           return (a[0] === b[0]) && (a[1] === b[1]);
27158       }
27159   }
27160
27161   // vector addition
27162   function geoVecAdd(a, b) {
27163       return [ a[0] + b[0], a[1] + b[1] ];
27164   }
27165
27166   // vector subtraction
27167   function geoVecSubtract(a, b) {
27168       return [ a[0] - b[0], a[1] - b[1] ];
27169   }
27170
27171   // vector scaling
27172   function geoVecScale(a, mag) {
27173       return [ a[0] * mag, a[1] * mag ];
27174   }
27175
27176   // vector rounding (was: geoRoundCoordinates)
27177   function geoVecFloor(a) {
27178       return [ Math.floor(a[0]), Math.floor(a[1]) ];
27179   }
27180
27181   // linear interpolation
27182   function geoVecInterp(a, b, t) {
27183       return [
27184           a[0] + (b[0] - a[0]) * t,
27185           a[1] + (b[1] - a[1]) * t
27186       ];
27187   }
27188
27189   // http://jsperf.com/id-dist-optimization
27190   function geoVecLength(a, b) {
27191       var x = a[0] - b[0];
27192       var y = a[1] - b[1];
27193       return Math.sqrt((x * x) + (y * y));
27194   }
27195
27196   // Return the counterclockwise angle in the range (-pi, pi)
27197   // between the positive X axis and the line intersecting a and b.
27198   function geoVecAngle(a, b) {
27199       return Math.atan2(b[1] - a[1], b[0] - a[0]);
27200   }
27201
27202   // dot product
27203   function geoVecDot(a, b, origin) {
27204       origin = origin || [0, 0];
27205       return (a[0] - origin[0]) * (b[0] - origin[0]) +
27206           (a[1] - origin[1]) * (b[1] - origin[1]);
27207   }
27208
27209   // 2D cross product of OA and OB vectors, returns magnitude of Z vector
27210   // Returns a positive value, if OAB makes a counter-clockwise turn,
27211   // negative for clockwise turn, and zero if the points are collinear.
27212   function geoVecCross(a, b, origin) {
27213       origin = origin || [0, 0];
27214       return (a[0] - origin[0]) * (b[1] - origin[1]) -
27215           (a[1] - origin[1]) * (b[0] - origin[0]);
27216   }
27217
27218   // Return the counterclockwise angle in the range (-pi, pi)
27219   // between the positive X axis and the line intersecting a and b.
27220   function geoAngle(a, b, projection) {
27221       return geoVecAngle(projection(a.loc), projection(b.loc));
27222   }
27223
27224   function geoEdgeEqual(a, b) {
27225       return (a[0] === b[0] && a[1] === b[1]) ||
27226           (a[0] === b[1] && a[1] === b[0]);
27227   }
27228
27229   // Rotate all points counterclockwise around a pivot point by given angle
27230   function geoRotate(points, angle, around) {
27231       return points.map(function(point) {
27232           var radial = geoVecSubtract(point, around);
27233           return [
27234               radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
27235               radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
27236           ];
27237       });
27238   }
27239
27240
27241   // Choose the edge with the minimal distance from `point` to its orthogonal
27242   // projection onto that edge, if such a projection exists, or the distance to
27243   // the closest vertex on that edge. Returns an object with the `index` of the
27244   // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
27245   function geoChooseEdge(nodes, point, projection, activeID) {
27246       var dist = geoVecLength;
27247       var points = nodes.map(function(n) { return projection(n.loc); });
27248       var ids = nodes.map(function(n) { return n.id; });
27249       var min = Infinity;
27250       var idx;
27251       var loc;
27252
27253       for (var i = 0; i < points.length - 1; i++) {
27254           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
27255
27256           var o = points[i];
27257           var s = geoVecSubtract(points[i + 1], o);
27258           var v = geoVecSubtract(point, o);
27259           var proj = geoVecDot(v, s) / geoVecDot(s, s);
27260           var p;
27261
27262           if (proj < 0) {
27263               p = o;
27264           } else if (proj > 1) {
27265               p = points[i + 1];
27266           } else {
27267               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
27268           }
27269
27270           var d = dist(p, point);
27271           if (d < min) {
27272               min = d;
27273               idx = i + 1;
27274               loc = projection.invert(p);
27275           }
27276       }
27277
27278       if (idx !== undefined) {
27279           return { index: idx, distance: min, loc: loc };
27280       } else {
27281           return null;
27282       }
27283   }
27284
27285
27286   // Test active (dragged or drawing) segments against inactive segments
27287   // This is used to test e.g. multipolygon rings that cross
27288   // `activeNodes` is the ring containing the activeID being dragged.
27289   // `inactiveNodes` is the other ring to test against
27290   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
27291       var actives = [];
27292       var inactives = [];
27293       var j, k, n1, n2, segment;
27294
27295       // gather active segments (only segments in activeNodes that contain the activeID)
27296       for (j = 0; j < activeNodes.length - 1; j++) {
27297           n1 = activeNodes[j];
27298           n2 = activeNodes[j+1];
27299           segment = [n1.loc, n2.loc];
27300           if (n1.id === activeID || n2.id === activeID) {
27301               actives.push(segment);
27302           }
27303       }
27304
27305       // gather inactive segments
27306       for (j = 0; j < inactiveNodes.length - 1; j++) {
27307           n1 = inactiveNodes[j];
27308           n2 = inactiveNodes[j+1];
27309           segment = [n1.loc, n2.loc];
27310           inactives.push(segment);
27311       }
27312
27313       // test
27314       for (j = 0; j < actives.length; j++) {
27315           for (k = 0; k < inactives.length; k++) {
27316               var p = actives[j];
27317               var q = inactives[k];
27318               var hit = geoLineIntersection(p, q);
27319               if (hit) {
27320                   return true;
27321               }
27322           }
27323       }
27324
27325       return false;
27326   }
27327
27328
27329   // Test active (dragged or drawing) segments against inactive segments
27330   // This is used to test whether a way intersects with itself.
27331   function geoHasSelfIntersections(nodes, activeID) {
27332       var actives = [];
27333       var inactives = [];
27334       var j, k;
27335
27336       // group active and passive segments along the nodes
27337       for (j = 0; j < nodes.length - 1; j++) {
27338           var n1 = nodes[j];
27339           var n2 = nodes[j+1];
27340           var segment = [n1.loc, n2.loc];
27341           if (n1.id === activeID || n2.id === activeID) {
27342               actives.push(segment);
27343           } else {
27344               inactives.push(segment);
27345           }
27346       }
27347
27348       // test
27349       for (j = 0; j < actives.length; j++) {
27350           for (k = 0; k < inactives.length; k++) {
27351               var p = actives[j];
27352               var q = inactives[k];
27353               // skip if segments share an endpoint
27354               if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
27355                   geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
27356                   continue;
27357               }
27358
27359               var hit = geoLineIntersection(p, q);
27360               if (hit) {
27361                   var epsilon = 1e-8;
27362                   // skip if the hit is at the segment's endpoint
27363                   if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
27364                       geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
27365                       continue;
27366                   } else {
27367                       return true;
27368                   }
27369               }
27370           }
27371       }
27372
27373       return false;
27374   }
27375
27376
27377   // Return the intersection point of 2 line segments.
27378   // From https://github.com/pgkelley4/line-segments-intersect
27379   // This uses the vector cross product approach described below:
27380   //  http://stackoverflow.com/a/565282/786339
27381   function geoLineIntersection(a, b) {
27382       var p = [a[0][0], a[0][1]];
27383       var p2 = [a[1][0], a[1][1]];
27384       var q = [b[0][0], b[0][1]];
27385       var q2 = [b[1][0], b[1][1]];
27386       var r = geoVecSubtract(p2, p);
27387       var s = geoVecSubtract(q2, q);
27388       var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
27389       var denominator = geoVecCross(r, s);
27390
27391       if (uNumerator && denominator) {
27392           var u = uNumerator / denominator;
27393           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
27394
27395           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
27396               return geoVecInterp(p, p2, t);
27397           }
27398       }
27399
27400       return null;
27401   }
27402
27403
27404   function geoPathIntersections(path1, path2) {
27405       var intersections = [];
27406       for (var i = 0; i < path1.length - 1; i++) {
27407           for (var j = 0; j < path2.length - 1; j++) {
27408               var a = [ path1[i], path1[i+1] ];
27409               var b = [ path2[j], path2[j+1] ];
27410               var hit = geoLineIntersection(a, b);
27411               if (hit) {
27412                   intersections.push(hit);
27413               }
27414           }
27415       }
27416       return intersections;
27417   }
27418
27419   function geoPathHasIntersections(path1, path2) {
27420       for (var i = 0; i < path1.length - 1; i++) {
27421           for (var j = 0; j < path2.length - 1; j++) {
27422               var a = [ path1[i], path1[i+1] ];
27423               var b = [ path2[j], path2[j+1] ];
27424               var hit = geoLineIntersection(a, b);
27425               if (hit) {
27426                   return true;
27427               }
27428           }
27429       }
27430       return false;
27431   }
27432
27433
27434   // Return whether point is contained in polygon.
27435   //
27436   // `point` should be a 2-item array of coordinates.
27437   // `polygon` should be an array of 2-item arrays of coordinates.
27438   //
27439   // From https://github.com/substack/point-in-polygon.
27440   // ray-casting algorithm based on
27441   // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
27442   //
27443   function geoPointInPolygon(point, polygon) {
27444       var x = point[0];
27445       var y = point[1];
27446       var inside = false;
27447
27448       for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
27449           var xi = polygon[i][0];
27450           var yi = polygon[i][1];
27451           var xj = polygon[j][0];
27452           var yj = polygon[j][1];
27453
27454           var intersect = ((yi > y) !== (yj > y)) &&
27455               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
27456           if (intersect) inside = !inside;
27457       }
27458
27459       return inside;
27460   }
27461
27462
27463   function geoPolygonContainsPolygon(outer, inner) {
27464       return every(inner, function(point) {
27465           return geoPointInPolygon(point, outer);
27466       });
27467   }
27468
27469
27470   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
27471       function testPoints(outer, inner) {
27472           return some(inner, function(point) {
27473               return geoPointInPolygon(point, outer);
27474           });
27475       }
27476
27477      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
27478   }
27479
27480
27481   function geoPathLength(path) {
27482       var length = 0;
27483       for (var i = 0; i < path.length - 1; i++) {
27484           length += geoVecLength(path[i], path[i + 1]);
27485       }
27486       return length;
27487   }
27488
27489
27490   // If the given point is at the edge of the padded viewport,
27491   // return a vector that will nudge the viewport in that direction
27492   function geoViewportEdge(point, dimensions) {
27493       var pad = [80, 20, 50, 20];   // top, right, bottom, left
27494       var x = 0;
27495       var y = 0;
27496
27497       if (point[0] > dimensions[0] - pad[1])
27498           x = -10;
27499       if (point[0] < pad[3])
27500           x = 10;
27501       if (point[1] > dimensions[1] - pad[2])
27502           y = -10;
27503       if (point[1] < pad[0])
27504           y = 10;
27505
27506       if (x || y) {
27507           return [x, y];
27508       } else {
27509           return null;
27510       }
27511   }
27512
27513   /*
27514       Bypasses features of D3's default projection stream pipeline that are unnecessary:
27515       * Antimeridian clipping
27516       * Spherical rotation
27517       * Resampling
27518   */
27519   function geoRawMercator() {
27520       var project = mercatorRaw;
27521       var k = 512 / Math.PI; // scale
27522       var x = 0;
27523       var y = 0; // translate
27524       var clipExtent = [[0, 0], [0, 0]];
27525
27526
27527       function projection(point) {
27528           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
27529           return [point[0] * k + x, y - point[1] * k];
27530       }
27531
27532
27533       projection.invert = function(point) {
27534           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
27535           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
27536       };
27537
27538
27539       projection.scale = function(_) {
27540           if (!arguments.length) return k;
27541           k = +_;
27542           return projection;
27543       };
27544
27545
27546       projection.translate = function(_) {
27547           if (!arguments.length) return [x, y];
27548           x = +_[0];
27549           y = +_[1];
27550           return projection;
27551       };
27552
27553
27554       projection.clipExtent = function(_) {
27555           if (!arguments.length) return clipExtent;
27556           clipExtent = _;
27557           return projection;
27558       };
27559
27560
27561       projection.transform = function(obj) {
27562           if (!arguments.length) return identity$7.translate(x, y).scale(k);
27563           x = +obj.x;
27564           y = +obj.y;
27565           k = +obj.k;
27566           return projection;
27567       };
27568
27569
27570       projection.stream = d3_geoTransform({
27571           point: function(x, y) {
27572               var vec = projection([x, y]);
27573               this.stream.point(vec[0], vec[1]);
27574           }
27575       }).stream;
27576
27577
27578       return projection;
27579   }
27580
27581   function osmChangeset() {
27582       if (!(this instanceof osmChangeset)) {
27583           return (new osmChangeset()).initialize(arguments);
27584       } else if (arguments.length) {
27585           this.initialize(arguments);
27586       }
27587   }
27588
27589
27590   osmEntity.changeset = osmChangeset;
27591
27592   osmChangeset.prototype = Object.create(osmEntity.prototype);
27593
27594   assignIn(osmChangeset.prototype, {
27595
27596       type: 'changeset',
27597
27598
27599       extent: function() {
27600           return new geoExtent();
27601       },
27602
27603
27604       geometry: function() {
27605           return 'changeset';
27606       },
27607
27608
27609       asJXON: function() {
27610           return {
27611               osm: {
27612                   changeset: {
27613                       tag: map$3(this.tags, function(value, key) {
27614                           return { '@k': key, '@v': value };
27615                       }),
27616                       '@version': 0.6,
27617                       '@generator': 'iD'
27618                   }
27619               }
27620           };
27621       },
27622
27623
27624       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
27625       // XML. Returns a string.
27626       osmChangeJXON: function(changes) {
27627           var changeset_id = this.id;
27628
27629           function nest(x, order) {
27630               var groups = {};
27631               for (var i = 0; i < x.length; i++) {
27632                   var tagName = Object.keys(x[i])[0];
27633                   if (!groups[tagName]) groups[tagName] = [];
27634                   groups[tagName].push(x[i][tagName]);
27635               }
27636               var ordered = {};
27637               order.forEach(function(o) {
27638                   if (groups[o]) ordered[o] = groups[o];
27639               });
27640               return ordered;
27641           }
27642
27643
27644           // sort relations in a changeset by dependencies
27645           function sort(changes) {
27646
27647               // find a referenced relation in the current changeset
27648               function resolve(item) {
27649                   return find$1(relations, function(relation) {
27650                       return item.keyAttributes.type === 'relation'
27651                           && item.keyAttributes.ref === relation['@id'];
27652                   });
27653               }
27654
27655               // a new item is an item that has not been already processed
27656               function isNew(item) {
27657                   return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
27658                       return proc['@id'] === item['@id'];
27659                   });
27660               }
27661
27662               var processing = [],
27663                   sorted = {},
27664                   relations = changes.relation;
27665
27666               if (!relations) return changes;
27667
27668               for (var i = 0; i < relations.length; i++) {
27669                   var relation = relations[i];
27670
27671                   // skip relation if already sorted
27672                   if (!sorted[relation['@id']]) {
27673                       processing.push(relation);
27674                   }
27675
27676                   while (processing.length > 0) {
27677                       var next = processing[0],
27678                       deps = filter(compact(next.member.map(resolve)), isNew);
27679                       if (deps.length === 0) {
27680                           sorted[next['@id']] = next;
27681                           processing.shift();
27682                       } else {
27683                           processing = deps.concat(processing);
27684                       }
27685                   }
27686               }
27687
27688               changes.relation = values$1(sorted);
27689               return changes;
27690           }
27691
27692           function rep(entity) {
27693               return entity.asJXON(changeset_id);
27694           }
27695
27696           return {
27697               osmChange: {
27698                   '@version': 0.6,
27699                   '@generator': 'iD',
27700                   'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
27701                   'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
27702                   'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
27703               }
27704           };
27705       },
27706
27707
27708       asGeoJSON: function() {
27709           return {};
27710       }
27711
27712   });
27713
27714   /**
27715    * Creates a duplicate-free version of an array, using
27716    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
27717    * for equality comparisons, in which only the first occurrence of each element
27718    * is kept. The order of result values is determined by the order they occur
27719    * in the array.
27720    *
27721    * @static
27722    * @memberOf _
27723    * @since 0.1.0
27724    * @category Array
27725    * @param {Array} array The array to inspect.
27726    * @returns {Array} Returns the new duplicate free array.
27727    * @example
27728    *
27729    * _.uniq([2, 1, 2]);
27730    * // => [2, 1]
27731    */
27732   function uniq(array) {
27733     return (array && array.length) ? baseUniq(array) : [];
27734   }
27735
27736   function osmNode() {
27737       if (!(this instanceof osmNode)) {
27738           return (new osmNode()).initialize(arguments);
27739       } else if (arguments.length) {
27740           this.initialize(arguments);
27741       }
27742   }
27743
27744   osmEntity.node = osmNode;
27745
27746   osmNode.prototype = Object.create(osmEntity.prototype);
27747
27748   assignIn(osmNode.prototype, {
27749
27750       type: 'node',
27751
27752
27753       extent: function() {
27754           return new geoExtent(this.loc);
27755       },
27756
27757
27758       geometry: function(graph) {
27759           return graph.transient(this, 'geometry', function() {
27760               return graph.isPoi(this) ? 'point' : 'vertex';
27761           });
27762       },
27763
27764
27765       move: function(loc) {
27766           return this.update({loc: loc});
27767       },
27768
27769
27770       isDegenerate: function() {
27771           return !(
27772               Array.isArray(this.loc) && this.loc.length === 2 &&
27773               this.loc[0] >= -180 && this.loc[0] <= 180 &&
27774               this.loc[1] >= -90 && this.loc[1] <= 90
27775           );
27776       },
27777
27778
27779       // Inspect tags and geometry to determine which direction(s) this node/vertex points
27780       directions: function(resolver, projection) {
27781           var val;
27782           var i;
27783
27784           // which tag to use?
27785           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
27786               // all-way stop tag on a highway intersection
27787               val = 'all';
27788           } else {
27789               // generic direction tag
27790               val = (this.tags.direction || '').toLowerCase();
27791
27792               // better suffix-style direction tag
27793               var re = /:direction$/i;
27794               var keys = Object.keys(this.tags);
27795               for (i = 0; i < keys.length; i++) {
27796                   if (re.test(keys[i])) {
27797                       val = this.tags[keys[i]].toLowerCase();
27798                       break;
27799                   }
27800               }
27801           }
27802
27803           if (val === '') return [];
27804
27805           var cardinal = {
27806               north: 0,               n: 0,
27807               northnortheast: 22,     nne: 22,
27808               northeast: 45,          ne: 45,
27809               eastnortheast: 67,      ene: 67,
27810               east: 90,               e: 90,
27811               eastsoutheast: 112,     ese: 112,
27812               southeast: 135,         se: 135,
27813               southsoutheast: 157,    sse: 157,
27814               south: 180,             s: 180,
27815               southsouthwest: 202,    ssw: 202,
27816               southwest: 225,         sw: 225,
27817               westsouthwest: 247,     wsw: 247,
27818               west: 270,              w: 270,
27819               westnorthwest: 292,     wnw: 292,
27820               northwest: 315,         nw: 315,
27821               northnorthwest: 337,    nnw: 337
27822           };
27823
27824
27825           var values = val.split(';');
27826           var results = [];
27827
27828           values.forEach(function(v) {
27829               // swap cardinal for numeric directions
27830               if (cardinal[v] !== undefined) {
27831                   v = cardinal[v];
27832               }
27833
27834               // numeric direction - just add to results
27835               if (v !== '' && !isNaN(+v)) {
27836                   results.push(+v);
27837                   return;
27838               }
27839
27840               // string direction - inspect parent ways
27841               var lookBackward =
27842                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
27843               var lookForward =
27844                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
27845
27846               if (!lookForward && !lookBackward) return;
27847
27848               var nodeIds = {};
27849               resolver.parentWays(this).forEach(function(parent) {
27850                   var nodes = parent.nodes;
27851                   for (i = 0; i < nodes.length; i++) {
27852                       if (nodes[i] === this.id) {  // match current entity
27853                           if (lookForward && i > 0) {
27854                               nodeIds[nodes[i - 1]] = true;  // look back to prev node
27855                           }
27856                           if (lookBackward && i < nodes.length - 1) {
27857                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
27858                           }
27859                       }
27860                   }
27861               }, this);
27862
27863               Object.keys(nodeIds).forEach(function(nodeId) {
27864                   // +90 because geoAngle returns angle from X axis, not Y (north)
27865                   results.push(
27866                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
27867                   );
27868               }, this);
27869
27870           }, this);
27871
27872           return uniq(results);
27873       },
27874
27875
27876       isEndpoint: function(resolver) {
27877           return resolver.transient(this, 'isEndpoint', function() {
27878               var id = this.id;
27879               return resolver.parentWays(this).filter(function(parent) {
27880                   return !parent.isClosed() && !!parent.affix(id);
27881               }).length > 0;
27882           });
27883       },
27884
27885
27886       isConnected: function(resolver) {
27887           return resolver.transient(this, 'isConnected', function() {
27888               var parents = resolver.parentWays(this);
27889
27890               function isLine(entity) {
27891                   return entity.geometry(resolver) === 'line' &&
27892                       entity.hasInterestingTags();
27893               }
27894
27895               // vertex is connected to multiple parent lines
27896               if (parents.length > 1 && some(parents, isLine)) {
27897                   return true;
27898
27899               } else if (parents.length === 1) {
27900                   var way = parents[0],
27901                       nodes = way.nodes.slice();
27902                   if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
27903
27904                   // return true if vertex appears multiple times (way is self intersecting)
27905                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
27906               }
27907
27908               return false;
27909           });
27910       },
27911
27912
27913       isIntersection: function(resolver) {
27914           return resolver.transient(this, 'isIntersection', function() {
27915               return resolver.parentWays(this).filter(function(parent) {
27916                   return (parent.tags.highway ||
27917                       parent.tags.waterway ||
27918                       parent.tags.railway ||
27919                       parent.tags.aeroway) &&
27920                       parent.geometry(resolver) === 'line';
27921               }).length > 1;
27922           });
27923       },
27924
27925
27926       isHighwayIntersection: function(resolver) {
27927           return resolver.transient(this, 'isHighwayIntersection', function() {
27928               return resolver.parentWays(this).filter(function(parent) {
27929                   return parent.tags.highway && parent.geometry(resolver) === 'line';
27930               }).length > 1;
27931           });
27932       },
27933
27934
27935       isOnAddressLine: function(resolver) {
27936           return resolver.transient(this, 'isOnAddressLine', function() {
27937               return resolver.parentWays(this).filter(function(parent) {
27938                   return parent.tags.hasOwnProperty('addr:interpolation') &&
27939                       parent.geometry(resolver) === 'line';
27940               }).length > 0;
27941           });
27942       },
27943
27944
27945       asJXON: function(changeset_id) {
27946           var r = {
27947               node: {
27948                   '@id': this.osmId(),
27949                   '@lon': this.loc[0],
27950                   '@lat': this.loc[1],
27951                   '@version': (this.version || 0),
27952                   tag: map$3(this.tags, function(v, k) {
27953                       return { keyAttributes: { k: k, v: v } };
27954                   })
27955               }
27956           };
27957           if (changeset_id) r.node['@changeset'] = changeset_id;
27958           return r;
27959       },
27960
27961
27962       asGeoJSON: function() {
27963           return {
27964               type: 'Point',
27965               coordinates: this.loc
27966           };
27967       }
27968   });
27969
27970   function osmNote() {
27971       if (!(this instanceof osmNote)) {
27972           return (new osmNote()).initialize(arguments);
27973       } else if (arguments.length) {
27974           this.initialize(arguments);
27975       }
27976   }
27977
27978
27979   osmNote.id = function() {
27980       return osmNote.id.next--;
27981   };
27982
27983
27984   osmNote.id.next = -1;
27985
27986
27987   assignIn(osmNote.prototype, {
27988
27989       type: 'note',
27990
27991       initialize: function(sources) {
27992           for (var i = 0; i < sources.length; ++i) {
27993               var source = sources[i];
27994               for (var prop in source) {
27995                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
27996                       if (source[prop] === undefined) {
27997                           delete this[prop];
27998                       } else {
27999                           this[prop] = source[prop];
28000                       }
28001                   }
28002               }
28003           }
28004
28005           if (!this.id) {
28006               this.id = osmNote.id() + '';  // as string
28007           }
28008
28009           return this;
28010       },
28011
28012       extent: function() {
28013           return new geoExtent(this.loc);
28014       },
28015
28016       update: function(attrs) {
28017           return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
28018       },
28019
28020       isNew: function() {
28021           return this.id < 0;
28022       },
28023
28024       move: function(loc) {
28025           return this.update({ loc: loc });
28026       }
28027
28028   });
28029
28030   /** Error message constants. */
28031   var FUNC_ERROR_TEXT$1 = 'Expected a function';
28032
28033   /**
28034    * Creates a function that negates the result of the predicate `func`. The
28035    * `func` predicate is invoked with the `this` binding and arguments of the
28036    * created function.
28037    *
28038    * @static
28039    * @memberOf _
28040    * @since 3.0.0
28041    * @category Function
28042    * @param {Function} predicate The predicate to negate.
28043    * @returns {Function} Returns the new negated function.
28044    * @example
28045    *
28046    * function isEven(n) {
28047    *   return n % 2 == 0;
28048    * }
28049    *
28050    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
28051    * // => [1, 3, 5]
28052    */
28053   function negate(predicate) {
28054     if (typeof predicate != 'function') {
28055       throw new TypeError(FUNC_ERROR_TEXT$1);
28056     }
28057     return function() {
28058       var args = arguments;
28059       switch (args.length) {
28060         case 0: return !predicate.call(this);
28061         case 1: return !predicate.call(this, args[0]);
28062         case 2: return !predicate.call(this, args[0], args[1]);
28063         case 3: return !predicate.call(this, args[0], args[1], args[2]);
28064       }
28065       return !predicate.apply(this, args);
28066     };
28067   }
28068
28069   /**
28070    * The opposite of `_.filter`; this method returns the elements of `collection`
28071    * that `predicate` does **not** return truthy for.
28072    *
28073    * @static
28074    * @memberOf _
28075    * @since 0.1.0
28076    * @category Collection
28077    * @param {Array|Object} collection The collection to iterate over.
28078    * @param {Function} [predicate=_.identity] The function invoked per iteration.
28079    * @returns {Array} Returns the new filtered array.
28080    * @see _.filter
28081    * @example
28082    *
28083    * var users = [
28084    *   { 'user': 'barney', 'age': 36, 'active': false },
28085    *   { 'user': 'fred',   'age': 40, 'active': true }
28086    * ];
28087    *
28088    * _.reject(users, function(o) { return !o.active; });
28089    * // => objects for ['fred']
28090    *
28091    * // The `_.matches` iteratee shorthand.
28092    * _.reject(users, { 'age': 40, 'active': true });
28093    * // => objects for ['barney']
28094    *
28095    * // The `_.matchesProperty` iteratee shorthand.
28096    * _.reject(users, ['active', false]);
28097    * // => objects for ['fred']
28098    *
28099    * // The `_.property` iteratee shorthand.
28100    * _.reject(users, 'active');
28101    * // => objects for ['barney']
28102    */
28103   function reject(collection, predicate) {
28104     var func = isArray(collection) ? arrayFilter : baseFilter;
28105     return func(collection, negate(baseIteratee(predicate, 3)));
28106   }
28107
28108   /*
28109   Order the nodes of a way in reverse order and reverse any direction dependent tags
28110   other than `oneway`. (We assume that correcting a backwards oneway is the primary
28111   reason for reversing a way.)
28112
28113   In addition, numeric-valued `incline` tags are negated.
28114
28115   The JOSM implementation was used as a guide, but transformations that were of unclear benefit
28116   or adjusted tags that don't seem to be used in practice were omitted.
28117
28118   References:
28119       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
28120       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
28121       http://wiki.openstreetmap.org/wiki/Key:incline
28122       http://wiki.openstreetmap.org/wiki/Route#Members
28123       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
28124       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
28125       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
28126   */
28127   function actionReverse(wayID, options) {
28128       var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
28129       var numeric = /^([+\-]?)(?=[\d.])/;
28130       var turn_lanes = /^turn:lanes:?/;
28131       var keyReplacements = [
28132           [/:right$/, ':left'],
28133           [/:left$/, ':right'],
28134           [/:forward$/, ':backward'],
28135           [/:backward$/, ':forward']
28136       ];
28137       var valueReplacements = {
28138           left: 'right',
28139           right: 'left',
28140           up: 'down',
28141           down: 'up',
28142           forward: 'backward',
28143           backward: 'forward',
28144           forwards: 'backward',
28145           backwards: 'forward',
28146       };
28147       var roleReplacements = {
28148           forward: 'backward',
28149           backward: 'forward',
28150           forwards: 'backward',
28151           backwards: 'forward'
28152       };
28153       var onewayReplacements = {
28154           yes: '-1',
28155           '1': '-1',
28156           '-1': 'yes'
28157       };
28158
28159
28160       function reverseKey(key) {
28161           for (var i = 0; i < keyReplacements.length; ++i) {
28162               var replacement = keyReplacements[i];
28163               if (replacement[0].test(key)) {
28164                   return key.replace(replacement[0], replacement[1]);
28165               }
28166           }
28167           return key;
28168       }
28169
28170
28171       function reverseValue(key, value) {
28172           if (ignoreKey.test(key)) return value;
28173
28174           // Turn lanes are left/right to key (not way) direction - #5674
28175           if (turn_lanes.test(key)) {
28176               return value;
28177           } else if (key === 'incline' && numeric.test(value)) {
28178               return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
28179           } else if (options && options.reverseOneway && key === 'oneway') {
28180               return onewayReplacements[value] || value;
28181           } else {
28182               return valueReplacements[value] || value;
28183           }
28184       }
28185
28186
28187       // Reverse the direction of tags attached to the nodes - #3076
28188       function reverseNodeTags(graph, nodeIDs) {
28189           for (var i = 0; i < nodeIDs.length; i++) {
28190               var node = graph.hasEntity(nodeIDs[i]);
28191               if (!node || !Object.keys(node.tags).length) continue;
28192
28193               var tags = {};
28194               for (var key in node.tags) {
28195                   tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
28196               }
28197               graph = graph.replace(node.update({tags: tags}));
28198           }
28199           return graph;
28200       }
28201
28202
28203       return function(graph) {
28204           var way = graph.entity(wayID);
28205           var nodes = way.nodes.slice().reverse();
28206           var tags = {};
28207           var role;
28208
28209           for (var key in way.tags) {
28210               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
28211           }
28212
28213           graph.parentRelations(way).forEach(function(relation) {
28214               relation.members.forEach(function(member, index) {
28215                   if (member.id === way.id && (role = roleReplacements[member.role])) {
28216                       relation = relation.updateMember({role: role}, index);
28217                       graph = graph.replace(relation);
28218                   }
28219               });
28220           });
28221
28222           // Reverse any associated directions on nodes on the way and then replace
28223           // the way itself with the reversed node ids and updated way tags
28224           return reverseNodeTags(graph, nodes)
28225               .replace(way.update({nodes: nodes, tags: tags}));
28226       };
28227   }
28228
28229   /** `Object#toString` result references. */
28230   var numberTag$4 = '[object Number]';
28231
28232   /**
28233    * Checks if `value` is classified as a `Number` primitive or object.
28234    *
28235    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
28236    * classified as numbers, use the `_.isFinite` method.
28237    *
28238    * @static
28239    * @memberOf _
28240    * @since 0.1.0
28241    * @category Lang
28242    * @param {*} value The value to check.
28243    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
28244    * @example
28245    *
28246    * _.isNumber(3);
28247    * // => true
28248    *
28249    * _.isNumber(Number.MIN_VALUE);
28250    * // => true
28251    *
28252    * _.isNumber(Infinity);
28253    * // => true
28254    *
28255    * _.isNumber('3');
28256    * // => false
28257    */
28258   function isNumber(value) {
28259     return typeof value == 'number' ||
28260       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
28261   }
28262
28263   /** `Object#toString` result references. */
28264   var stringTag$4 = '[object String]';
28265
28266   /**
28267    * Checks if `value` is classified as a `String` primitive or object.
28268    *
28269    * @static
28270    * @since 0.1.0
28271    * @memberOf _
28272    * @category Lang
28273    * @param {*} value The value to check.
28274    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
28275    * @example
28276    *
28277    * _.isString('abc');
28278    * // => true
28279    *
28280    * _.isString(1);
28281    * // => false
28282    */
28283   function isString(value) {
28284     return typeof value == 'string' ||
28285       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
28286   }
28287
28288   /**
28289    * Checks if `value` is `NaN`.
28290    *
28291    * **Note:** This method is based on
28292    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
28293    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
28294    * `undefined` and other non-number values.
28295    *
28296    * @static
28297    * @memberOf _
28298    * @since 0.1.0
28299    * @category Lang
28300    * @param {*} value The value to check.
28301    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
28302    * @example
28303    *
28304    * _.isNaN(NaN);
28305    * // => true
28306    *
28307    * _.isNaN(new Number(NaN));
28308    * // => true
28309    *
28310    * isNaN(undefined);
28311    * // => true
28312    *
28313    * _.isNaN(undefined);
28314    * // => false
28315    */
28316   function isNaN$1(value) {
28317     // An `NaN` primitive is the only value that is not equal to itself.
28318     // Perform the `toStringTag` check first to avoid errors with some
28319     // ActiveX objects in IE.
28320     return isNumber(value) && value != +value;
28321   }
28322
28323   function osmLanes(entity) {
28324       if (entity.type !== 'way') return null;
28325       if (!entity.tags.highway) return null;
28326
28327       var tags = entity.tags;
28328       var isOneWay = entity.isOneWay();
28329       var laneCount = getLaneCount(tags, isOneWay);
28330       var maxspeed = parseMaxspeed(tags);
28331
28332       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
28333       var forward = laneDirections.forward;
28334       var backward = laneDirections.backward;
28335       var bothways = laneDirections.bothways;
28336
28337       // parse the piped string 'x|y|z' format
28338       var turnLanes = {};
28339       turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
28340       turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
28341       turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
28342
28343       var maxspeedLanes = {};
28344       maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
28345       maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
28346       maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
28347
28348       var psvLanes = {};
28349       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
28350       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
28351       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
28352
28353       var busLanes = {};
28354       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
28355       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
28356       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
28357
28358       var taxiLanes = {};
28359       taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
28360       taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
28361       taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
28362
28363       var hovLanes = {};
28364       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
28365       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
28366       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
28367
28368       var hgvLanes = {};
28369       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
28370       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
28371       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
28372
28373       var bicyclewayLanes = {};
28374       bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
28375       bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
28376       bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
28377
28378       var lanesObj = {
28379           forward: [],
28380           backward: [],
28381           unspecified: []
28382       };
28383
28384       // map forward/backward/unspecified of each lane type to lanesObj
28385       mapToLanesObj(lanesObj, turnLanes, 'turnLane');
28386       mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
28387       mapToLanesObj(lanesObj, psvLanes, 'psv');
28388       mapToLanesObj(lanesObj, busLanes, 'bus');
28389       mapToLanesObj(lanesObj, taxiLanes, 'taxi');
28390       mapToLanesObj(lanesObj, hovLanes, 'hov');
28391       mapToLanesObj(lanesObj, hgvLanes, 'hgv');
28392       mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
28393
28394       return {
28395           metadata: {
28396               count: laneCount,
28397               oneway: isOneWay,
28398               forward: forward,
28399               backward: backward,
28400               bothways: bothways,
28401               turnLanes: turnLanes,
28402               maxspeed: maxspeed,
28403               maxspeedLanes: maxspeedLanes,
28404               psvLanes: psvLanes,
28405               busLanes: busLanes,
28406               taxiLanes: taxiLanes,
28407               hovLanes: hovLanes,
28408               hgvLanes: hgvLanes,
28409               bicyclewayLanes: bicyclewayLanes
28410           },
28411           lanes: lanesObj
28412       };
28413   }
28414
28415
28416   function getLaneCount(tags, isOneWay) {
28417       var count;
28418       if (tags.lanes) {
28419           count = parseInt(tags.lanes, 10);
28420           if (count > 0) {
28421               return count;
28422           }
28423       }
28424
28425
28426       switch (tags.highway) {
28427           case 'trunk':
28428           case 'motorway':
28429               count = isOneWay ? 2 : 4;
28430               break;
28431           default:
28432               count = isOneWay ? 1 : 2;
28433               break;
28434       }
28435
28436       return count;
28437   }
28438
28439
28440   function parseMaxspeed(tags) {
28441       var maxspeed = tags.maxspeed;
28442       if (isNumber(maxspeed)) return maxspeed;
28443       if (isString(maxspeed)) {
28444           maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
28445           if (!maxspeed) return;
28446           return parseInt(maxspeed, 10);
28447       }
28448   }
28449
28450
28451   function parseLaneDirections(tags, isOneWay, laneCount) {
28452       var forward = parseInt(tags['lanes:forward'], 10);
28453       var backward = parseInt(tags['lanes:backward'], 10);
28454       var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
28455
28456       if (parseInt(tags.oneway, 10) === -1) {
28457           forward = 0;
28458           bothways = 0;
28459           backward = laneCount;
28460       }
28461       else if (isOneWay) {
28462           forward = laneCount;
28463           bothways = 0;
28464           backward = 0;
28465       }
28466       else if (isNaN$1(forward) && isNaN$1(backward)) {
28467           backward = Math.floor((laneCount - bothways) / 2);
28468           forward = laneCount - bothways - backward;
28469       }
28470       else if (isNaN$1(forward)) {
28471           if (backward > laneCount - bothways) {
28472               backward = laneCount - bothways;
28473           }
28474           forward = laneCount - bothways - backward;
28475       }
28476       else if (isNaN$1(backward)) {
28477           if (forward > laneCount - bothways) {
28478               forward = laneCount - bothways;
28479           }
28480           backward = laneCount - bothways - forward;
28481       }
28482       return {
28483           forward: forward,
28484           backward: backward,
28485           bothways: bothways
28486       };
28487   }
28488
28489
28490   function parseTurnLanes(tag){
28491       if (!tag) return;
28492
28493       var validValues = [
28494           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
28495           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
28496       ];
28497
28498       return tag.split('|')
28499           .map(function (s) {
28500               if (s === '') s = 'none';
28501               return s.split(';')
28502                   .map(function (d) {
28503                       return validValues.indexOf(d) === -1 ? 'unknown': d;
28504                   });
28505           });
28506   }
28507
28508
28509   function parseMaxspeedLanes(tag, maxspeed) {
28510       if (!tag) return;
28511
28512       return tag.split('|')
28513           .map(function (s) {
28514               if (s === 'none') return s;
28515               var m = parseInt(s, 10);
28516               if (s === '' || m === maxspeed) return null;
28517               return isNaN$1(m) ? 'unknown': m;
28518           });
28519   }
28520
28521
28522   function parseMiscLanes(tag) {
28523       if (!tag) return;
28524
28525       var validValues = [
28526           'yes', 'no', 'designated'
28527       ];
28528
28529       return tag.split('|')
28530           .map(function (s) {
28531               if (s === '') s = 'no';
28532               return validValues.indexOf(s) === -1 ? 'unknown': s;
28533           });
28534   }
28535
28536
28537   function parseBicycleWay(tag) {
28538       if (!tag) return;
28539
28540       var validValues = [
28541           'yes', 'no', 'designated', 'lane'
28542       ];
28543
28544       return tag.split('|')
28545           .map(function (s) {
28546               if (s === '') s = 'no';
28547               return validValues.indexOf(s) === -1 ? 'unknown': s;
28548           });
28549   }
28550
28551
28552   function mapToLanesObj(lanesObj, data, key) {
28553       if (data.forward) data.forward.forEach(function(l, i) {
28554           if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
28555           lanesObj.forward[i][key] = l;
28556       });
28557       if (data.backward) data.backward.forEach(function(l, i) {
28558           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
28559           lanesObj.backward[i][key] = l;
28560       });
28561       if (data.unspecified) data.unspecified.forEach(function(l, i) {
28562           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
28563           lanesObj.unspecified[i][key] = l;
28564       });
28565   }
28566
28567   /** Used to compose bitmasks for cloning. */
28568   var CLONE_DEEP_FLAG$2 = 1,
28569       CLONE_SYMBOLS_FLAG$3 = 4;
28570
28571   /**
28572    * This method is like `_.clone` except that it recursively clones `value`.
28573    *
28574    * @static
28575    * @memberOf _
28576    * @since 1.0.0
28577    * @category Lang
28578    * @param {*} value The value to recursively clone.
28579    * @returns {*} Returns the deep cloned value.
28580    * @see _.clone
28581    * @example
28582    *
28583    * var objects = [{ 'a': 1 }, { 'b': 2 }];
28584    *
28585    * var deep = _.cloneDeep(objects);
28586    * console.log(deep[0] === objects[0]);
28587    * // => false
28588    */
28589   function cloneDeep(value) {
28590     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
28591   }
28592
28593   /**
28594    * Gets the timestamp of the number of milliseconds that have elapsed since
28595    * the Unix epoch (1 January 1970 00:00:00 UTC).
28596    *
28597    * @static
28598    * @memberOf _
28599    * @since 2.4.0
28600    * @category Date
28601    * @returns {number} Returns the timestamp.
28602    * @example
28603    *
28604    * _.defer(function(stamp) {
28605    *   console.log(_.now() - stamp);
28606    * }, _.now());
28607    * // => Logs the number of milliseconds it took for the deferred invocation.
28608    */
28609   var now$1 = function() {
28610     return root$2.Date.now();
28611   };
28612
28613   /** Error message constants. */
28614   var FUNC_ERROR_TEXT$2 = 'Expected a function';
28615
28616   /* Built-in method references for those with the same name as other `lodash` methods. */
28617   var nativeMax$2 = Math.max,
28618       nativeMin = Math.min;
28619
28620   /**
28621    * Creates a debounced function that delays invoking `func` until after `wait`
28622    * milliseconds have elapsed since the last time the debounced function was
28623    * invoked. The debounced function comes with a `cancel` method to cancel
28624    * delayed `func` invocations and a `flush` method to immediately invoke them.
28625    * Provide `options` to indicate whether `func` should be invoked on the
28626    * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
28627    * with the last arguments provided to the debounced function. Subsequent
28628    * calls to the debounced function return the result of the last `func`
28629    * invocation.
28630    *
28631    * **Note:** If `leading` and `trailing` options are `true`, `func` is
28632    * invoked on the trailing edge of the timeout only if the debounced function
28633    * is invoked more than once during the `wait` timeout.
28634    *
28635    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
28636    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
28637    *
28638    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
28639    * for details over the differences between `_.debounce` and `_.throttle`.
28640    *
28641    * @static
28642    * @memberOf _
28643    * @since 0.1.0
28644    * @category Function
28645    * @param {Function} func The function to debounce.
28646    * @param {number} [wait=0] The number of milliseconds to delay.
28647    * @param {Object} [options={}] The options object.
28648    * @param {boolean} [options.leading=false]
28649    *  Specify invoking on the leading edge of the timeout.
28650    * @param {number} [options.maxWait]
28651    *  The maximum time `func` is allowed to be delayed before it's invoked.
28652    * @param {boolean} [options.trailing=true]
28653    *  Specify invoking on the trailing edge of the timeout.
28654    * @returns {Function} Returns the new debounced function.
28655    * @example
28656    *
28657    * // Avoid costly calculations while the window size is in flux.
28658    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
28659    *
28660    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
28661    * jQuery(element).on('click', _.debounce(sendMail, 300, {
28662    *   'leading': true,
28663    *   'trailing': false
28664    * }));
28665    *
28666    * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
28667    * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
28668    * var source = new EventSource('/stream');
28669    * jQuery(source).on('message', debounced);
28670    *
28671    * // Cancel the trailing debounced invocation.
28672    * jQuery(window).on('popstate', debounced.cancel);
28673    */
28674   function debounce(func, wait, options) {
28675     var lastArgs,
28676         lastThis,
28677         maxWait,
28678         result,
28679         timerId,
28680         lastCallTime,
28681         lastInvokeTime = 0,
28682         leading = false,
28683         maxing = false,
28684         trailing = true;
28685
28686     if (typeof func != 'function') {
28687       throw new TypeError(FUNC_ERROR_TEXT$2);
28688     }
28689     wait = toNumber(wait) || 0;
28690     if (isObject(options)) {
28691       leading = !!options.leading;
28692       maxing = 'maxWait' in options;
28693       maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
28694       trailing = 'trailing' in options ? !!options.trailing : trailing;
28695     }
28696
28697     function invokeFunc(time) {
28698       var args = lastArgs,
28699           thisArg = lastThis;
28700
28701       lastArgs = lastThis = undefined;
28702       lastInvokeTime = time;
28703       result = func.apply(thisArg, args);
28704       return result;
28705     }
28706
28707     function leadingEdge(time) {
28708       // Reset any `maxWait` timer.
28709       lastInvokeTime = time;
28710       // Start the timer for the trailing edge.
28711       timerId = setTimeout(timerExpired, wait);
28712       // Invoke the leading edge.
28713       return leading ? invokeFunc(time) : result;
28714     }
28715
28716     function remainingWait(time) {
28717       var timeSinceLastCall = time - lastCallTime,
28718           timeSinceLastInvoke = time - lastInvokeTime,
28719           timeWaiting = wait - timeSinceLastCall;
28720
28721       return maxing
28722         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
28723         : timeWaiting;
28724     }
28725
28726     function shouldInvoke(time) {
28727       var timeSinceLastCall = time - lastCallTime,
28728           timeSinceLastInvoke = time - lastInvokeTime;
28729
28730       // Either this is the first call, activity has stopped and we're at the
28731       // trailing edge, the system time has gone backwards and we're treating
28732       // it as the trailing edge, or we've hit the `maxWait` limit.
28733       return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
28734         (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
28735     }
28736
28737     function timerExpired() {
28738       var time = now$1();
28739       if (shouldInvoke(time)) {
28740         return trailingEdge(time);
28741       }
28742       // Restart the timer.
28743       timerId = setTimeout(timerExpired, remainingWait(time));
28744     }
28745
28746     function trailingEdge(time) {
28747       timerId = undefined;
28748
28749       // Only invoke if we have `lastArgs` which means `func` has been
28750       // debounced at least once.
28751       if (trailing && lastArgs) {
28752         return invokeFunc(time);
28753       }
28754       lastArgs = lastThis = undefined;
28755       return result;
28756     }
28757
28758     function cancel() {
28759       if (timerId !== undefined) {
28760         clearTimeout(timerId);
28761       }
28762       lastInvokeTime = 0;
28763       lastArgs = lastCallTime = lastThis = timerId = undefined;
28764     }
28765
28766     function flush() {
28767       return timerId === undefined ? result : trailingEdge(now$1());
28768     }
28769
28770     function debounced() {
28771       var time = now$1(),
28772           isInvoking = shouldInvoke(time);
28773
28774       lastArgs = arguments;
28775       lastThis = this;
28776       lastCallTime = time;
28777
28778       if (isInvoking) {
28779         if (timerId === undefined) {
28780           return leadingEdge(lastCallTime);
28781         }
28782         if (maxing) {
28783           // Handle invocations in a tight loop.
28784           timerId = setTimeout(timerExpired, wait);
28785           return invokeFunc(lastCallTime);
28786         }
28787       }
28788       if (timerId === undefined) {
28789         timerId = setTimeout(timerExpired, wait);
28790       }
28791       return result;
28792     }
28793     debounced.cancel = cancel;
28794     debounced.flush = flush;
28795     return debounced;
28796   }
28797
28798   /**
28799    * Casts `value` to `identity` if it's not a function.
28800    *
28801    * @private
28802    * @param {*} value The value to inspect.
28803    * @returns {Function} Returns cast function.
28804    */
28805   function castFunction(value) {
28806     return typeof value == 'function' ? value : identity$8;
28807   }
28808
28809   /**
28810    * Iterates over elements of `collection` and invokes `iteratee` for each element.
28811    * The iteratee is invoked with three arguments: (value, index|key, collection).
28812    * Iteratee functions may exit iteration early by explicitly returning `false`.
28813    *
28814    * **Note:** As with other "Collections" methods, objects with a "length"
28815    * property are iterated like arrays. To avoid this behavior use `_.forIn`
28816    * or `_.forOwn` for object iteration.
28817    *
28818    * @static
28819    * @memberOf _
28820    * @since 0.1.0
28821    * @alias each
28822    * @category Collection
28823    * @param {Array|Object} collection The collection to iterate over.
28824    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
28825    * @returns {Array|Object} Returns `collection`.
28826    * @see _.forEachRight
28827    * @example
28828    *
28829    * _.forEach([1, 2], function(value) {
28830    *   console.log(value);
28831    * });
28832    * // => Logs `1` then `2`.
28833    *
28834    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
28835    *   console.log(key);
28836    * });
28837    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
28838    */
28839   function forEach(collection, iteratee) {
28840     var func = isArray(collection) ? arrayEach : baseEach;
28841     return func(collection, castFunction(iteratee));
28842   }
28843
28844   /**
28845    * Iterates over own enumerable string keyed properties of an object and
28846    * invokes `iteratee` for each property. The iteratee is invoked with three
28847    * arguments: (value, key, object). Iteratee functions may exit iteration
28848    * early by explicitly returning `false`.
28849    *
28850    * @static
28851    * @memberOf _
28852    * @since 0.3.0
28853    * @category Object
28854    * @param {Object} object The object to iterate over.
28855    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
28856    * @returns {Object} Returns `object`.
28857    * @see _.forOwnRight
28858    * @example
28859    *
28860    * function Foo() {
28861    *   this.a = 1;
28862    *   this.b = 2;
28863    * }
28864    *
28865    * Foo.prototype.c = 3;
28866    *
28867    * _.forOwn(new Foo, function(value, key) {
28868    *   console.log(key);
28869    * });
28870    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
28871    */
28872   function forOwn(object, iteratee) {
28873     return object && baseForOwn(object, castFunction(iteratee));
28874   }
28875
28876   var translations = Object.create(null);
28877
28878   var currentLocale = 'en';
28879   var textDirection = 'ltr';
28880
28881   function setLocale(val) {
28882       if (translations[val] !== undefined) {
28883           currentLocale = val;
28884       } else if (translations[val.split('-')[0]]) {
28885           currentLocale = val.split('-')[0];
28886       }
28887   }
28888
28889   function addTranslation(id, value) {
28890       translations[id] = value;
28891   }
28892
28893   /**
28894    * Given a string identifier, try to find that string in the current
28895    * language, and return it.  This function will be called recursively
28896    * with locale `en` if a string can not be found in the requested language.
28897    *
28898    * @param {string}   s   string identifier
28899    * @param {object?}  o   object of token replacements and default string
28900    * @param {string?}  loc locale to use
28901    * @returns {string?} locale string
28902    */
28903   function t(s, o, loc) {
28904       loc = loc || currentLocale;
28905
28906       var path = s
28907           .split('.')
28908           .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
28909           .reverse();
28910
28911       var rep = translations[loc];
28912
28913       while (rep !== undefined && path.length) {
28914           rep = rep[path.pop()];
28915       }
28916
28917       if (rep !== undefined) {
28918           if (o) {
28919               for (var k in o) {
28920                   var variable = '{' + k + '}';
28921                   var re = new RegExp(variable, 'g'); // check globally for variables
28922                   rep = rep.replace(re, o[k]);
28923               }
28924           }
28925           return rep;
28926       }
28927
28928       if (loc !== 'en') {
28929           return t(s, o, 'en');
28930       }
28931
28932       if (o && 'default' in o) {
28933           return o.default;
28934       }
28935
28936       var missing = 'Missing ' + loc + ' translation: ' + s;
28937       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
28938
28939       return missing;
28940   }
28941
28942   /**
28943    * Given string 'ltr' or 'rtl', save that setting
28944    *
28945    * @param {string} dir ltr or rtl
28946    */
28947
28948   function setTextDirection(dir) {
28949       textDirection = dir;
28950   }
28951
28952   /** Used to compose bitmasks for cloning. */
28953   var CLONE_DEEP_FLAG$3 = 1,
28954       CLONE_SYMBOLS_FLAG$4 = 4;
28955
28956   /**
28957    * This method is like `_.cloneWith` except that it recursively clones `value`.
28958    *
28959    * @static
28960    * @memberOf _
28961    * @since 4.0.0
28962    * @category Lang
28963    * @param {*} value The value to recursively clone.
28964    * @param {Function} [customizer] The function to customize cloning.
28965    * @returns {*} Returns the deep cloned value.
28966    * @see _.cloneWith
28967    * @example
28968    *
28969    * function customizer(value) {
28970    *   if (_.isElement(value)) {
28971    *     return value.cloneNode(true);
28972    *   }
28973    * }
28974    *
28975    * var el = _.cloneDeepWith(document.body, customizer);
28976    *
28977    * console.log(el === document.body);
28978    * // => false
28979    * console.log(el.nodeName);
28980    * // => 'BODY'
28981    * console.log(el.childNodes.length);
28982    * // => 20
28983    */
28984   function cloneDeepWith(value, customizer) {
28985     customizer = typeof customizer == 'function' ? customizer : undefined;
28986     return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
28987   }
28988
28989   /**
28990    * Creates an array of `array` values not included in the other given arrays
28991    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
28992    * for equality comparisons. The order and references of result values are
28993    * determined by the first array.
28994    *
28995    * **Note:** Unlike `_.pullAll`, this method returns a new array.
28996    *
28997    * @static
28998    * @memberOf _
28999    * @since 0.1.0
29000    * @category Array
29001    * @param {Array} array The array to inspect.
29002    * @param {...Array} [values] The values to exclude.
29003    * @returns {Array} Returns the new array of filtered values.
29004    * @see _.without, _.xor
29005    * @example
29006    *
29007    * _.difference([2, 1], [2, 3]);
29008    * // => [1]
29009    */
29010   var difference = baseRest(function(array, values) {
29011     return isArrayLikeObject(array)
29012       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
29013       : [];
29014   });
29015
29016   /** `Object#toString` result references. */
29017   var mapTag$6 = '[object Map]',
29018       setTag$6 = '[object Set]';
29019
29020   /** Used for built-in method references. */
29021   var objectProto$h = Object.prototype;
29022
29023   /** Used to check objects for own properties. */
29024   var hasOwnProperty$e = objectProto$h.hasOwnProperty;
29025
29026   /**
29027    * Checks if `value` is an empty object, collection, map, or set.
29028    *
29029    * Objects are considered empty if they have no own enumerable string keyed
29030    * properties.
29031    *
29032    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
29033    * jQuery-like collections are considered empty if they have a `length` of `0`.
29034    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
29035    *
29036    * @static
29037    * @memberOf _
29038    * @since 0.1.0
29039    * @category Lang
29040    * @param {*} value The value to check.
29041    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
29042    * @example
29043    *
29044    * _.isEmpty(null);
29045    * // => true
29046    *
29047    * _.isEmpty(true);
29048    * // => true
29049    *
29050    * _.isEmpty(1);
29051    * // => true
29052    *
29053    * _.isEmpty([1, 2, 3]);
29054    * // => false
29055    *
29056    * _.isEmpty({ 'a': 1 });
29057    * // => false
29058    */
29059   function isEmpty(value) {
29060     if (value == null) {
29061       return true;
29062     }
29063     if (isArrayLike(value) &&
29064         (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
29065           isBuffer(value) || isTypedArray(value) || isArguments(value))) {
29066       return !value.length;
29067     }
29068     var tag = getTag$1(value);
29069     if (tag == mapTag$6 || tag == setTag$6) {
29070       return !value.size;
29071     }
29072     if (isPrototype(value)) {
29073       return !baseKeys(value).length;
29074     }
29075     for (var key in value) {
29076       if (hasOwnProperty$e.call(value, key)) {
29077         return false;
29078       }
29079     }
29080     return true;
29081   }
29082
29083   /**
29084    * Performs a deep comparison between two values to determine if they are
29085    * equivalent.
29086    *
29087    * **Note:** This method supports comparing arrays, array buffers, booleans,
29088    * date objects, error objects, maps, numbers, `Object` objects, regexes,
29089    * sets, strings, symbols, and typed arrays. `Object` objects are compared
29090    * by their own, not inherited, enumerable properties. Functions and DOM
29091    * nodes are compared by strict equality, i.e. `===`.
29092    *
29093    * @static
29094    * @memberOf _
29095    * @since 0.1.0
29096    * @category Lang
29097    * @param {*} value The value to compare.
29098    * @param {*} other The other value to compare.
29099    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
29100    * @example
29101    *
29102    * var object = { 'a': 1 };
29103    * var other = { 'a': 1 };
29104    *
29105    * _.isEqual(object, other);
29106    * // => true
29107    *
29108    * object === other;
29109    * // => false
29110    */
29111   function isEqual(value, other) {
29112     return baseIsEqual(value, other);
29113   }
29114
29115   /*
29116       iD.Difference represents the difference between two graphs.
29117       It knows how to calculate the set of entities that were
29118       created, modified, or deleted, and also contains the logic
29119       for recursively extending a difference to the complete set
29120       of entities that will require a redraw, taking into account
29121       child and parent relationships.
29122    */
29123   function coreDifference(base, head) {
29124       var _changes = {};
29125       var _diff = {};
29126       var _length = 0;
29127       var i, k, h, b, keys;
29128
29129       function changed(h, b) {
29130           if (h === b) return false;
29131           if (!h || !b) return true;
29132
29133           if (h.loc || b.loc) {
29134               if (!h.loc && b.loc || h.loc && !b.loc ||
29135                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
29136           }
29137           if (h.nodes || b.nodes) {
29138               if (!isEqual(h.nodes, b.nodes)) return true;
29139           }
29140           if (h.members || b.members) {
29141               if (!isEqual(h.members, b.members)) return true;
29142           }
29143           return !isEqual(h.tags, b.tags);
29144       }
29145
29146
29147       keys = Object.keys(head.entities);
29148       for (i = 0; i < keys.length; i++) {
29149           k = keys[i];
29150           h = head.entities[k];
29151           b = base.entities[k];
29152           if (changed(h, b)) {
29153               _changes[k] = {base: b, head: h};
29154               _length++;
29155           }
29156       }
29157
29158       keys = Object.keys(base.entities);
29159       for (i = 0; i < keys.length; i++) {
29160           k = keys[i];
29161           h = head.entities[k];
29162           b = base.entities[k];
29163           if (!_changes[k] && changed(h, b)) {
29164               _changes[k] = {base: b, head: h};
29165               _length++;
29166           }
29167       }
29168
29169
29170       function addParents(parents, result) {
29171           for (var i = 0; i < parents.length; i++) {
29172               var parent = parents[i];
29173
29174               if (parent.id in result)
29175                   continue;
29176
29177               result[parent.id] = parent;
29178               addParents(head.parentRelations(parent), result);
29179           }
29180       }
29181
29182
29183       _diff.length = function length() {
29184           return _length;
29185       };
29186
29187
29188       _diff.changes = function changes() {
29189           return _changes;
29190       };
29191
29192
29193       _diff.extantIDs = function extantIDs() {
29194           var result = [];
29195           forEach(_changes, function(change, id) {
29196               if (change.head) result.push(id);
29197           });
29198           return result;
29199       };
29200
29201
29202       _diff.modified = function modified() {
29203           var result = [];
29204           forEach(_changes, function(change) {
29205               if (change.base && change.head) result.push(change.head);
29206           });
29207           return result;
29208       };
29209
29210
29211       _diff.created = function created() {
29212           var result = [];
29213           forEach(_changes, function(change) {
29214               if (!change.base && change.head) result.push(change.head);
29215           });
29216           return result;
29217       };
29218
29219
29220       _diff.deleted = function deleted() {
29221           var result = [];
29222           forEach(_changes, function(change) {
29223               if (change.base && !change.head) result.push(change.base);
29224           });
29225           return result;
29226       };
29227
29228
29229       _diff.summary = function summary() {
29230           var relevant = {};
29231
29232           function addEntity(entity, graph, changeType) {
29233               relevant[entity.id] = {
29234                   entity: entity,
29235                   graph: graph,
29236                   changeType: changeType
29237               };
29238           }
29239
29240           function addParents(entity) {
29241               var parents = head.parentWays(entity);
29242               for (var j = parents.length - 1; j >= 0; j--) {
29243                   var parent = parents[j];
29244                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
29245               }
29246           }
29247
29248           var keys = Object.keys(_changes);
29249           for (var i = 0; i < keys.length; i++) {
29250               var change = _changes[keys[i]];
29251
29252               if (change.head && change.head.geometry(head) !== 'vertex') {
29253                   addEntity(change.head, head, change.base ? 'modified' : 'created');
29254
29255               } else if (change.base && change.base.geometry(base) !== 'vertex') {
29256                   addEntity(change.base, base, 'deleted');
29257
29258               } else if (change.base && change.head) { // modified vertex
29259                   var moved    = !isEqual(change.base.loc,  change.head.loc);
29260                   var retagged = !isEqual(change.base.tags, change.head.tags);
29261
29262                   if (moved) {
29263                       addParents(change.head);
29264                   }
29265
29266                   if (retagged || (moved && change.head.hasInterestingTags())) {
29267                       addEntity(change.head, head, 'modified');
29268                   }
29269
29270               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
29271                   addEntity(change.head, head, 'created');
29272
29273               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
29274                   addEntity(change.base, base, 'deleted');
29275               }
29276           }
29277
29278           return values$1(relevant);
29279       };
29280
29281
29282       _diff.complete = function complete(extent) {
29283           var result = {};
29284           var id, change;
29285
29286           for (id in _changes) {
29287               change = _changes[id];
29288
29289               var h = change.head;
29290               var b = change.base;
29291               var entity = h || b;
29292
29293               if (extent &&
29294                   (!h || !h.intersects(extent, head)) &&
29295                   (!b || !b.intersects(extent, base)))
29296                   continue;
29297
29298               result[id] = h;
29299
29300               if (entity.type === 'way') {
29301                   var nh = h ? h.nodes : [];
29302                   var nb = b ? b.nodes : [];
29303                   var diff, i;
29304
29305                   diff = difference(nh, nb);
29306                   for (i = 0; i < diff.length; i++) {
29307                       result[diff[i]] = head.hasEntity(diff[i]);
29308                   }
29309
29310                   diff = difference(nb, nh);
29311                   for (i = 0; i < diff.length; i++) {
29312                       result[diff[i]] = head.hasEntity(diff[i]);
29313                   }
29314               }
29315
29316               addParents(head.parentWays(entity), result);
29317               addParents(head.parentRelations(entity), result);
29318           }
29319
29320           return result;
29321       };
29322
29323
29324       return _diff;
29325   }
29326
29327   /** Used for built-in method references. */
29328   var objectProto$i = Object.prototype;
29329
29330   /** Used to check objects for own properties. */
29331   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
29332
29333   /**
29334    * Assigns own enumerable string keyed properties of source objects to the
29335    * destination object. Source objects are applied from left to right.
29336    * Subsequent sources overwrite property assignments of previous sources.
29337    *
29338    * **Note:** This method mutates `object` and is loosely based on
29339    * [`Object.assign`](https://mdn.io/Object/assign).
29340    *
29341    * @static
29342    * @memberOf _
29343    * @since 0.10.0
29344    * @category Object
29345    * @param {Object} object The destination object.
29346    * @param {...Object} [sources] The source objects.
29347    * @returns {Object} Returns `object`.
29348    * @see _.assignIn
29349    * @example
29350    *
29351    * function Foo() {
29352    *   this.a = 1;
29353    * }
29354    *
29355    * function Bar() {
29356    *   this.c = 3;
29357    * }
29358    *
29359    * Foo.prototype.b = 2;
29360    * Bar.prototype.d = 4;
29361    *
29362    * _.assign({ 'a': 0 }, new Foo, new Bar);
29363    * // => { 'a': 1, 'c': 3 }
29364    */
29365   var assign = createAssigner(function(object, source) {
29366     if (isPrototype(source) || isArrayLike(source)) {
29367       copyObject(source, keys$1(source), object);
29368       return;
29369     }
29370     for (var key in source) {
29371       if (hasOwnProperty$f.call(source, key)) {
29372         assignValue(object, key, source[key]);
29373       }
29374     }
29375   });
29376
29377   /* Built-in method references for those with the same name as other `lodash` methods. */
29378   var nativeMax$3 = Math.max;
29379
29380   /**
29381    * Checks if `value` is in `collection`. If `collection` is a string, it's
29382    * checked for a substring of `value`, otherwise
29383    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
29384    * is used for equality comparisons. If `fromIndex` is negative, it's used as
29385    * the offset from the end of `collection`.
29386    *
29387    * @static
29388    * @memberOf _
29389    * @since 0.1.0
29390    * @category Collection
29391    * @param {Array|Object|string} collection The collection to inspect.
29392    * @param {*} value The value to search for.
29393    * @param {number} [fromIndex=0] The index to search from.
29394    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
29395    * @returns {boolean} Returns `true` if `value` is found, else `false`.
29396    * @example
29397    *
29398    * _.includes([1, 2, 3], 1);
29399    * // => true
29400    *
29401    * _.includes([1, 2, 3], 1, 2);
29402    * // => false
29403    *
29404    * _.includes({ 'a': 1, 'b': 2 }, 1);
29405    * // => true
29406    *
29407    * _.includes('abcd', 'bc');
29408    * // => true
29409    */
29410   function includes(collection, value, fromIndex, guard) {
29411     collection = isArrayLike(collection) ? collection : values$1(collection);
29412     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
29413
29414     var length = collection.length;
29415     if (fromIndex < 0) {
29416       fromIndex = nativeMax$3(length + fromIndex, 0);
29417     }
29418     return isString(collection)
29419       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
29420       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
29421   }
29422
29423   var detected;
29424
29425   function utilDetect(force) {
29426       if (detected && !force) return detected;
29427       detected = {};
29428
29429       var ua = navigator.userAgent,
29430           m = null,
29431           q = utilStringQs(window.location.hash.substring(1));
29432
29433       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
29434       if (m !== null) {
29435           detected.browser = m[1];
29436           detected.version = m[2];
29437       }
29438       if (!detected.browser) {
29439           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
29440           if (m !== null) {
29441               detected.browser = 'msie';
29442               detected.version = m[1];
29443           }
29444       }
29445       if (!detected.browser) {
29446           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
29447           if (m !== null) {
29448               detected.browser = 'Opera';
29449               detected.version = m[2];
29450           }
29451       }
29452       if (!detected.browser) {
29453           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
29454           if (m !== null) {
29455               detected.browser = m[1];
29456               detected.version = m[2];
29457               m = ua.match(/version\/([\.\d]+)/i);
29458               if (m !== null) detected.version = m[1];
29459           }
29460       }
29461       if (!detected.browser) {
29462           detected.browser = navigator.appName;
29463           detected.version = navigator.appVersion;
29464       }
29465
29466       // keep major.minor version only..
29467       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
29468
29469       if (detected.browser.toLowerCase() === 'msie') {
29470           detected.ie = true;
29471           detected.browser = 'Internet Explorer';
29472           detected.support = parseFloat(detected.version) >= 11;
29473       } else {
29474           detected.ie = false;
29475           detected.support = true;
29476       }
29477
29478       // Added due to incomplete svg style support. See #715
29479       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
29480
29481       // Set locale based on url param (format 'en-US') or browser lang (default)
29482       if (q.hasOwnProperty('locale')) {
29483           detected.locale = q.locale;
29484           detected.language = q.locale.split('-')[0];
29485       } else {
29486           detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
29487           detected.language = detected.locale.split('-')[0];
29488
29489           // Search `navigator.languages` for a better locale. Prefer the first language,
29490           // unless the second language is a culture-specific version of the first one, see #3842
29491           if (navigator.languages && navigator.languages.length > 0) {
29492               var code0 = navigator.languages[0],
29493                   parts0 = code0.split('-');
29494
29495               detected.locale = code0;
29496               detected.language = parts0[0];
29497
29498               if (navigator.languages.length > 1 && parts0.length === 1) {
29499                   var code1 = navigator.languages[1],
29500                       parts1 = code1.split('-');
29501
29502                   if (parts1[0] === parts0[0]) {
29503                       detected.locale = code1;
29504                   }
29505               }
29506           }
29507       }
29508
29509       // Loaded locale is stored in currentLocale
29510       // return that instead (except in the situation where 'en' might override 'en-US')
29511       var loadedLocale = currentLocale || 'en';
29512       if (loadedLocale !== 'en') {
29513           detected.locale = loadedLocale;
29514           detected.language = detected.locale.split('-')[0];
29515       }
29516
29517       // detect text direction
29518       var lang = dataLocales[detected.locale];
29519       if ((lang && lang.rtl) || (q.rtl === 'true')) {
29520           detected.textDirection = 'rtl';
29521       } else {
29522           detected.textDirection = 'ltr';
29523       }
29524       setTextDirection(detected.textDirection);
29525
29526       // detect host
29527       var loc = window.top.location;
29528       var origin = loc.origin;
29529       if (!origin) {  // for unpatched IE11
29530           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
29531       }
29532
29533       detected.host = origin + loc.pathname;
29534
29535       detected.filedrop = (window.FileReader && 'ondrop' in window);
29536
29537       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29538
29539       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
29540
29541       function nav(x) {
29542           return navigator.userAgent.indexOf(x) !== -1;
29543       }
29544
29545       if (nav('Win')) {
29546           detected.os = 'win';
29547           detected.platform = 'Windows';
29548       }
29549       else if (nav('Mac')) {
29550           detected.os = 'mac';
29551           detected.platform = 'Macintosh';
29552       }
29553       else if (nav('X11') || nav('Linux')) {
29554           detected.os = 'linux';
29555           detected.platform = 'Linux';
29556       }
29557       else {
29558           detected.os = 'win';
29559           detected.platform = 'Unknown';
29560       }
29561
29562       return detected;
29563   }
29564
29565   var remove$1 = removeDiacritics;
29566
29567   var replacementList = [
29568     {
29569       base: ' ',
29570       chars: "\u00A0",
29571     }, {
29572       base: '0',
29573       chars: "\u07C0",
29574     }, {
29575       base: 'A',
29576       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",
29577     }, {
29578       base: 'AA',
29579       chars: "\uA732",
29580     }, {
29581       base: 'AE',
29582       chars: "\u00C6\u01FC\u01E2",
29583     }, {
29584       base: 'AO',
29585       chars: "\uA734",
29586     }, {
29587       base: 'AU',
29588       chars: "\uA736",
29589     }, {
29590       base: 'AV',
29591       chars: "\uA738\uA73A",
29592     }, {
29593       base: 'AY',
29594       chars: "\uA73C",
29595     }, {
29596       base: 'B',
29597       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
29598     }, {
29599       base: 'C',
29600       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
29601     }, {
29602       base: 'D',
29603       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
29604     }, {
29605       base: 'Dh',
29606       chars: "\u00D0",
29607     }, {
29608       base: 'DZ',
29609       chars: "\u01F1\u01C4",
29610     }, {
29611       base: 'Dz',
29612       chars: "\u01F2\u01C5",
29613     }, {
29614       base: 'E',
29615       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",
29616     }, {
29617       base: 'F',
29618       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
29619     }, {
29620       base: 'G',
29621       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
29622     }, {
29623       base: 'H',
29624       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
29625     }, {
29626       base: 'I',
29627       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
29628     }, {
29629       base: 'J',
29630       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
29631     }, {
29632       base: 'K',
29633       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
29634     }, {
29635       base: 'L',
29636       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
29637     }, {
29638       base: 'LJ',
29639       chars: "\u01C7",
29640     }, {
29641       base: 'Lj',
29642       chars: "\u01C8",
29643     }, {
29644       base: 'M',
29645       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
29646     }, {
29647       base: 'N',
29648       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
29649     }, {
29650       base: 'NJ',
29651       chars: "\u01CA",
29652     }, {
29653       base: 'Nj',
29654       chars: "\u01CB",
29655     }, {
29656       base: 'O',
29657       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",
29658     }, {
29659       base: 'OE',
29660       chars: "\u0152",
29661     }, {
29662       base: 'OI',
29663       chars: "\u01A2",
29664     }, {
29665       base: 'OO',
29666       chars: "\uA74E",
29667     }, {
29668       base: 'OU',
29669       chars: "\u0222",
29670     }, {
29671       base: 'P',
29672       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
29673     }, {
29674       base: 'Q',
29675       chars: "\u24C6\uFF31\uA756\uA758\u024A",
29676     }, {
29677       base: 'R',
29678       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
29679     }, {
29680       base: 'S',
29681       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
29682     }, {
29683       base: 'T',
29684       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
29685     }, {
29686       base: 'Th',
29687       chars: "\u00DE",
29688     }, {
29689       base: 'TZ',
29690       chars: "\uA728",
29691     }, {
29692       base: 'U',
29693       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",
29694     }, {
29695       base: 'V',
29696       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
29697     }, {
29698       base: 'VY',
29699       chars: "\uA760",
29700     }, {
29701       base: 'W',
29702       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
29703     }, {
29704       base: 'X',
29705       chars: "\u24CD\uFF38\u1E8A\u1E8C",
29706     }, {
29707       base: 'Y',
29708       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
29709     }, {
29710       base: 'Z',
29711       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
29712     }, {
29713       base: 'a',
29714       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",
29715     }, {
29716       base: 'aa',
29717       chars: "\uA733",
29718     }, {
29719       base: 'ae',
29720       chars: "\u00E6\u01FD\u01E3",
29721     }, {
29722       base: 'ao',
29723       chars: "\uA735",
29724     }, {
29725       base: 'au',
29726       chars: "\uA737",
29727     }, {
29728       base: 'av',
29729       chars: "\uA739\uA73B",
29730     }, {
29731       base: 'ay',
29732       chars: "\uA73D",
29733     }, {
29734       base: 'b',
29735       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
29736     }, {
29737       base: 'c',
29738       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
29739     }, {
29740       base: 'd',
29741       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
29742     }, {
29743       base: 'dh',
29744       chars: "\u00F0",
29745     }, {
29746       base: 'dz',
29747       chars: "\u01F3\u01C6",
29748     }, {
29749       base: 'e',
29750       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",
29751     }, {
29752       base: 'f',
29753       chars: "\u24D5\uFF46\u1E1F\u0192",
29754     }, {
29755       base: 'ff',
29756       chars: "\uFB00",
29757     }, {
29758       base: 'fi',
29759       chars: "\uFB01",
29760     }, {
29761       base: 'fl',
29762       chars: "\uFB02",
29763     }, {
29764       base: 'ffi',
29765       chars: "\uFB03",
29766     }, {
29767       base: 'ffl',
29768       chars: "\uFB04",
29769     }, {
29770       base: 'g',
29771       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
29772     }, {
29773       base: 'h',
29774       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
29775     }, {
29776       base: 'hv',
29777       chars: "\u0195",
29778     }, {
29779       base: 'i',
29780       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
29781     }, {
29782       base: 'j',
29783       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
29784     }, {
29785       base: 'k',
29786       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
29787     }, {
29788       base: 'l',
29789       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
29790     }, {
29791       base: 'lj',
29792       chars: "\u01C9",
29793     }, {
29794       base: 'm',
29795       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
29796     }, {
29797       base: 'n',
29798       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
29799     }, {
29800       base: 'nj',
29801       chars: "\u01CC",
29802     }, {
29803       base: 'o',
29804       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",
29805     }, {
29806       base: 'oe',
29807       chars: "\u0153",
29808     }, {
29809       base: 'oi',
29810       chars: "\u01A3",
29811     }, {
29812       base: 'oo',
29813       chars: "\uA74F",
29814     }, {
29815       base: 'ou',
29816       chars: "\u0223",
29817     }, {
29818       base: 'p',
29819       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
29820     }, {
29821       base: 'q',
29822       chars: "\u24E0\uFF51\u024B\uA757\uA759",
29823     }, {
29824       base: 'r',
29825       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
29826     }, {
29827       base: 's',
29828       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
29829     }, {
29830       base: 'ss',
29831       chars: "\xDF",
29832     }, {
29833       base: 't',
29834       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
29835     }, {
29836       base: 'th',
29837       chars: "\u00FE",
29838     }, {
29839       base: 'tz',
29840       chars: "\uA729",
29841     }, {
29842       base: 'u',
29843       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",
29844     }, {
29845       base: 'v',
29846       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
29847     }, {
29848       base: 'vy',
29849       chars: "\uA761",
29850     }, {
29851       base: 'w',
29852       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
29853     }, {
29854       base: 'x',
29855       chars: "\u24E7\uFF58\u1E8B\u1E8D",
29856     }, {
29857       base: 'y',
29858       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
29859     }, {
29860       base: 'z',
29861       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
29862     }
29863   ];
29864
29865   var diacriticsMap = {};
29866   for (var i = 0; i < replacementList.length; i += 1) {
29867     var chars = replacementList[i].chars;
29868     for (var j = 0; j < chars.length; j += 1) {
29869       diacriticsMap[chars[j]] = replacementList[i].base;
29870     }
29871   }
29872
29873   function removeDiacritics(str) {
29874     return str.replace(/[^\u0000-\u007e]/g, function(c) {
29875       return diacriticsMap[c] || c;
29876     });
29877   }
29878
29879   // see https://github.com/openstreetmap/iD/pull/3707
29880   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
29881
29882   var chars$1 = {
29883       // madda above alef
29884       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
29885
29886       // hamza above and below alef
29887       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
29888       // 1572 is ؤ
29889       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
29890       // 1574 is ئ
29891       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
29892       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
29893
29894       // 1577 ة
29895       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
29896
29897       1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
29898       1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
29899       1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
29900       1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
29901       1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
29902       1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
29903       1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
29904       1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
29905       1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
29906       1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
29907       1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
29908       1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
29909       1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
29910       1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
29911       1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
29912       1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
29913       1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
29914       1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
29915
29916       // 1595 ػ - may be very rare
29917
29918       1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
29919       1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
29920       1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
29921       1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
29922       1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
29923       1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
29924       1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
29925
29926       // 1609 ى
29927       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
29928       // 1610 ي
29929       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
29930
29931       // short vowel sounds / tashkil markings
29932
29933       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
29934
29935       1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
29936       1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
29937       1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
29938       1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
29939       1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
29940       5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
29941   };
29942
29943   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
29944
29945   function fixRTLTextForSvg(inputText) {
29946       var context = true;
29947       var ret = '';
29948       var rtlBuffer = [];
29949       var arabicRegex = /[\u0600-\u06FF]/g;
29950       var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
29951       var thaanaVowel = /[\u07A6-\u07B0]/;
29952       var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
29953
29954       if (!arabicRegex.test(inputText)) {
29955           // Hebrew or Thaana RTL script
29956           for (var n = 0; n < inputText.length; n++) {
29957               var c = inputText[n];
29958               if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
29959                   rtlBuffer[rtlBuffer.length - 1] += c;
29960               } else if (rtlRegex.test(c)) {
29961                   rtlBuffer.push(c);
29962               } else if (c === ' ' && rtlBuffer.length) {
29963                   // whitespace within RTL text
29964                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
29965               } else {
29966                   // non-RTL character
29967                   ret += rtlBuffer.reverse().join('') + c;
29968                   rtlBuffer = [];
29969               }
29970           }
29971       } else {
29972           for (var i = 0, l = inputText.length; i < l; i++) {
29973               var code = inputText[i].charCodeAt(0);
29974               var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
29975
29976               if (!chars$1[code]) {
29977                   if (code === 32 && rtlBuffer.length) {
29978                       // whitespace
29979                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
29980                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
29981                       // tashkil mark
29982                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
29983                   } else {
29984                       // non-RTL character
29985                       ret += rtlBuffer.reverse().join('') + inputText[i];
29986                       rtlBuffer = [];
29987                   }
29988                   continue;
29989               }
29990               if (context) {
29991                   if (i === l - 1 || nextCode === 32) {
29992                       rtlBuffer.push(chars$1[code].isolated);
29993                   } else {
29994                       // special case for لا
29995                       if (code === 1604 && nextCode === 1575) {
29996                           rtlBuffer.push(chars$1[5000].initial);
29997                           i++;
29998                           context = true;
29999                           continue;
30000                       }
30001                       rtlBuffer.push(chars$1[code].initial);
30002                   }
30003               } else {
30004                   if (i === l - 1 || nextCode === 32){
30005                       rtlBuffer.push(chars$1[code].final);
30006                   } else {
30007                       // special case for ﻼ
30008                       if (code === 1604 && nextCode === 1575){
30009                           rtlBuffer.push(chars$1[5000].final);
30010                           i++;
30011                           context = true;
30012                           continue;
30013                       }
30014                       if (chars$1[code].medial === ''){
30015                           rtlBuffer.push(chars$1[code].final);
30016                       } else {
30017                           rtlBuffer.push(chars$1[code].medial);
30018                       }
30019                   }
30020               }
30021               context = (chars$1[code].medial === '') || nextCode === 32;
30022           }
30023       }
30024       ret += rtlBuffer.reverse().join('');
30025       return ret;
30026   }
30027
30028   function utilTagText(entity) {
30029       return map$3(entity.tags, function(v, k) {
30030           return k + '=' + v;
30031       }).join(', ');
30032   }
30033
30034
30035   function utilEntitySelector(ids) {
30036       return ids.length ? '.' + ids.join(',.') : 'nothing';
30037   }
30038
30039
30040   function utilEntityOrMemberSelector(ids, graph) {
30041       var s = utilEntitySelector(ids);
30042
30043       ids.forEach(function(id) {
30044           var entity = graph.hasEntity(id);
30045           if (entity && entity.type === 'relation') {
30046               entity.members.forEach(function(member) {
30047                   s += ',.' + member.id;
30048               });
30049           }
30050       });
30051
30052       return s;
30053   }
30054
30055
30056   function utilEntityOrDeepMemberSelector(ids, graph) {
30057       var seen = {};
30058       var allIDs = [];
30059
30060       function addEntityAndMembersIfNotYetSeen(id) {
30061           // avoid infinite recursion for circular relations by skipping seen entities
30062           if (seen[id]) return;
30063           // mark the entity as seen
30064           seen[id] = true;
30065           // add the id;
30066           allIDs.push(id);
30067           if (graph.hasEntity(id)) {
30068               var entity = graph.entity(id);
30069               if (entity.type === 'relation' && entity.members) {
30070                   entity.members.forEach(function(member){
30071                       addEntityAndMembersIfNotYetSeen(member.id);
30072                   });
30073               }
30074           }
30075       }
30076
30077       ids.forEach(function(id) {
30078           addEntityAndMembersIfNotYetSeen(id);
30079       });
30080       return utilEntitySelector(allIDs);
30081   }
30082
30083
30084   // Adds or removes highlight styling for the specified entities
30085   function utilHighlightEntities(ids, highlighted, context) {
30086       context.surface()
30087           .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph()))
30088           .classed('highlighted', highlighted);
30089   }
30090
30091
30092   function utilGetAllNodes(ids, graph) {
30093       var seen = {};
30094       var nodes = [];
30095       ids.forEach(getNodes);
30096       return nodes;
30097
30098       function getNodes(id) {
30099           if (seen[id]) return;
30100           seen[id] = true;
30101
30102           var entity = graph.hasEntity(id);
30103           if (!entity) return;
30104
30105           if (entity.type === 'node') {
30106               nodes.push(entity);
30107           } else if (entity.type === 'way') {
30108               entity.nodes.forEach(getNodes);
30109           } else {
30110               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
30111           }
30112       }
30113   }
30114
30115
30116   function utilDisplayName(entity) {
30117       var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
30118       var name = entity.tags[localizedNameKey] || entity.tags.name || '';
30119       var network = entity.tags.cycle_network || entity.tags.network;
30120
30121       if (!name && entity.tags.ref) {
30122           name = entity.tags.ref;
30123           if (network) {
30124               name = network + ' ' + name;
30125           }
30126       }
30127
30128       return name;
30129   }
30130
30131
30132   function utilDisplayNameForPath(entity) {
30133       var name = utilDisplayName(entity);
30134       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
30135
30136       if (!isFirefox && name && rtlRegex.test(name)) {
30137           name = fixRTLTextForSvg(name);
30138       }
30139
30140       return name;
30141   }
30142
30143
30144   function utilDisplayType(id) {
30145       return {
30146           n: t('inspector.node'),
30147           w: t('inspector.way'),
30148           r: t('inspector.relation')
30149       }[id.charAt(0)];
30150   }
30151
30152
30153   function utilDisplayLabel(entity, context) {
30154       var displayName = utilDisplayName(entity);
30155       if (displayName) {
30156           // use the display name if there is one
30157           return displayName;
30158       }
30159       var preset = utilPreset(entity, context);
30160       if (preset && preset.name()) {
30161           // use the preset name if there is a match
30162           return preset.name();
30163       }
30164       // fallback to the display type (node/way/relation)
30165       return utilDisplayType(entity.id);
30166   }
30167
30168
30169   function utilPreset(entity, context) {
30170       return context.presets().match(entity, context.graph());
30171   }
30172
30173
30174   function utilEntityRoot(entityType) {
30175       return {
30176           node: 'n',
30177           way: 'w',
30178           relation: 'r'
30179       }[entityType];
30180   }
30181
30182
30183   function utilStringQs(str) {
30184       return str.split('&').reduce(function(obj, pair){
30185           var parts = pair.split('=');
30186           if (parts.length === 2) {
30187               obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
30188           }
30189           return obj;
30190       }, {});
30191   }
30192
30193
30194   function utilQsString(obj, noencode) {
30195       // encode everything except special characters used in certain hash parameters:
30196       // "/" in map states, ":", ",", {" and "}" in background
30197       function softEncode(s) {
30198           return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
30199       }
30200
30201       return Object.keys(obj).sort().map(function(key) {
30202           return encodeURIComponent(key) + '=' + (
30203               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
30204       }).join('&');
30205   }
30206
30207
30208   function utilPrefixDOMProperty(property) {
30209       var prefixes = ['webkit', 'ms', 'moz', 'o'];
30210       var i = -1;
30211       var n = prefixes.length;
30212       var s = document.body;
30213
30214       if (property in s)
30215           return property;
30216
30217       property = property.substr(0, 1).toUpperCase() + property.substr(1);
30218
30219       while (++i < n) {
30220           if (prefixes[i] + property in s) {
30221               return prefixes[i] + property;
30222           }
30223       }
30224
30225       return false;
30226   }
30227
30228
30229   function utilPrefixCSSProperty(property) {
30230       var prefixes = ['webkit', 'ms', 'Moz', 'O'];
30231       var i = -1;
30232       var n = prefixes.length;
30233       var s = document.body.style;
30234
30235       if (property.toLowerCase() in s) {
30236           return property.toLowerCase();
30237       }
30238
30239       while (++i < n) {
30240           if (prefixes[i] + property in s) {
30241               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
30242           }
30243       }
30244
30245       return false;
30246   }
30247
30248
30249   var transformProperty;
30250   function utilSetTransform(el, x, y, scale) {
30251       var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
30252       var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
30253           : 'translate3d(' + x + 'px,' + y + 'px,0)';
30254       return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
30255   }
30256
30257
30258   // Calculates Levenshtein distance between two strings
30259   // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
30260   // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
30261   function utilEditDistance(a, b) {
30262       a = remove$1(a.toLowerCase());
30263       b = remove$1(b.toLowerCase());
30264       if (a.length === 0) return b.length;
30265       if (b.length === 0) return a.length;
30266       var matrix = [];
30267       for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
30268       for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
30269       for (i = 1; i <= b.length; i++) {
30270           for (j = 1; j <= a.length; j++) {
30271               if (b.charAt(i-1) === a.charAt(j-1)) {
30272                   matrix[i][j] = matrix[i-1][j-1];
30273               } else {
30274                   matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
30275                       Math.min(matrix[i][j-1] + 1, // insertion
30276                       matrix[i-1][j] + 1)); // deletion
30277               }
30278           }
30279       }
30280       return matrix[b.length][a.length];
30281   }
30282
30283
30284   // a d3.mouse-alike which
30285   // 1. Only works on HTML elements, not SVG
30286   // 2. Does not cause style recalculation
30287   function utilFastMouse(container) {
30288       var rect = container.getBoundingClientRect();
30289       var rectLeft = rect.left;
30290       var rectTop = rect.top;
30291       var clientLeft = +container.clientLeft;
30292       var clientTop = +container.clientTop;
30293
30294       if (textDirection === 'rtl') {
30295           rectLeft = 0;
30296       }
30297       return function(e) {
30298           return [
30299               e.clientX - rectLeft - clientLeft,
30300               e.clientY - rectTop - clientTop];
30301       };
30302   }
30303
30304
30305   /* eslint-disable no-proto */
30306   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
30307   /* eslint-enable no-proto */
30308
30309
30310   function utilAsyncMap(inputs, func, callback) {
30311       var remaining = inputs.length;
30312       var results = [];
30313       var errors = [];
30314
30315       inputs.forEach(function(d, i) {
30316           func(d, function done(err, data) {
30317               errors[i] = err;
30318               results[i] = data;
30319               remaining--;
30320               if (!remaining) callback(errors, results);
30321           });
30322       });
30323   }
30324
30325
30326   // wraps an index to an interval [0..length-1]
30327   function utilWrap(index, length) {
30328       if (index < 0) {
30329           index += Math.ceil(-index/length)*length;
30330       }
30331       return index % length;
30332   }
30333
30334
30335   /**
30336    * a replacement for functor
30337    *
30338    * @param {*} value any value
30339    * @returns {Function} a function that returns that value or the value if it's a function
30340    */
30341   function utilFunctor(value) {
30342       if (typeof value === 'function') return value;
30343       return function() {
30344           return value;
30345       };
30346   }
30347
30348
30349   function utilNoAuto(selection) {
30350       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
30351
30352       return selection
30353           // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
30354           .attr('autocomplete', 'new-password')
30355           .attr('autocorrect', 'off')
30356           .attr('autocapitalize', 'off')
30357           .attr('spellcheck', isText ? 'true' : 'false');
30358   }
30359
30360
30361   // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
30362   // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
30363   function utilHashcode(str) {
30364       var hash = 0;
30365       if (str.length === 0) {
30366           return hash;
30367       }
30368       for (var i = 0; i < str.length; i++) {
30369           var char = str.charCodeAt(i);
30370           hash = ((hash << 5) - hash) + char;
30371           hash = hash & hash; // Convert to 32bit integer
30372       }
30373       return hash;
30374   }
30375
30376   // note the function should be of low priority
30377   // and should not be returning a value.
30378   function utilCallWhenIdle(func, timeout) {
30379       return function() {
30380           var args = arguments;
30381           var that = this;
30382           window.requestIdleCallback(function() {
30383               func.apply(that, args);
30384           }, {timeout: timeout});
30385       };
30386   }
30387
30388   function utilCleanTags(tags) {
30389       var out = {};
30390       for (var k in tags) {
30391           if (!k) continue;
30392           var v = tags[k];
30393           if (v !== undefined) {
30394               out[k] = cleanValue(k, v);
30395           }
30396       }
30397
30398       return out;
30399
30400
30401       function cleanValue(k, v) {
30402           function keepSpaces(k) {
30403               return /_hours|_times|:conditional$/.test(k);
30404           }
30405
30406           function skip(k) {
30407               return /^(description|note|fixme)$/.test(k);
30408           }
30409
30410           if (skip(k)) return v;
30411
30412           var cleaned = v
30413               .split(';')
30414               .map(function(s) { return s.trim(); })
30415               .join(keepSpaces(k) ? '; ' : ';');
30416
30417           // The code below is not intended to validate websites and emails.
30418           // It is only intended to prevent obvious copy-paste errors. (#2323)
30419           // clean website- and email-like tags
30420           if (k.indexOf('website') !== -1 ||
30421               k.indexOf('email') !== -1 ||
30422               cleaned.indexOf('http') === 0) {
30423               cleaned = cleaned
30424                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
30425
30426           }
30427
30428           return cleaned;
30429       }
30430   }
30431
30432   // Like selection.property('value', ...), but avoids no-op value sets,
30433   // which can result in layout/repaint thrashing in some situations.
30434   function utilGetSetValue(selection, value) {
30435       function d3_selection_value(value) {
30436           function valueNull() {
30437               delete this.value;
30438           }
30439
30440           function valueConstant() {
30441               if (this.value !== value) {
30442                   this.value = value;
30443               }
30444           }
30445
30446           function valueFunction() {
30447               var x = value.apply(this, arguments);
30448               if (x == null) {
30449                   delete this.value;
30450               } else if (this.value !== x) {
30451                   this.value = x;
30452               }
30453           }
30454
30455           return value == null
30456               ? valueNull : (typeof value === 'function'
30457               ? valueFunction : valueConstant);
30458       }
30459
30460       if (arguments.length === 1) {
30461           return selection.property('value');
30462       }
30463
30464       return selection.each(d3_selection_value(value));
30465   }
30466
30467   function utilIdleWorker(tasks, processor, callback) {
30468       var results = [], result;
30469       for (var i = 0; i < tasks.length; i++) {
30470           result = processor(tasks[i]);
30471           if (result) results.push(result);
30472       }
30473       callback(results);
30474
30475       // var processed = [];
30476       // var currentPos = 0;
30477       // var totalTasks = tasks.length;
30478
30479       // function worker(deadline) {
30480       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
30481       //         var result = processor(tasks[currentPos]);
30482
30483       //         // if falsy dont add to the processed list
30484       //         if (result) processed.push(result);
30485       //         currentPos++;
30486       //     }
30487
30488       //     // more tasks are left, we might need more idleCallbacks
30489       //     if (currentPos < totalTasks) {
30490       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
30491       //     }
30492
30493       //     // tasks are completed
30494       //     return callback(processed);
30495       // }
30496
30497       // window.requestIdleCallback(function(deadline) {worker(deadline);});
30498   }
30499
30500   // shim
30501   window.requestIdleCallback =
30502       window.requestIdleCallback ||
30503       function(cb) {
30504           var start = Date.now();
30505           return setTimeout(function() {
30506               cb({
30507                   didTimeout: false,
30508                   timeRemaining: function() {
30509                       return Math.max(0, 50 - (Date.now() - start));
30510                   }
30511               });
30512           }, 1);
30513       };
30514
30515   window.cancelIdleCallback =
30516       window.cancelIdleCallback ||
30517       function(id) {
30518           clearTimeout(id);
30519       };
30520
30521   function utilKeybinding(namespace) {
30522       var _keybindings = {};
30523
30524
30525       function testBindings(isCapturing) {
30526           var didMatch = false;
30527           var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
30528           var i, binding;
30529
30530           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
30531           // so we don't strictly match on the shift key, but we prioritize
30532           // shifted keybindings first, and fallback to unshifted only if no match.
30533           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
30534
30535           // priority match shifted keybindings first
30536           for (i = 0; i < bindings.length; i++) {
30537               binding = bindings[i];
30538               if (!binding.event.modifiers.shiftKey) continue;  // no shift
30539               if (!!binding.capture !== isCapturing) continue;
30540               if (matches(binding, true)) {
30541                   binding.callback();
30542                   didMatch = true;
30543               }
30544           }
30545
30546           // then unshifted keybindings
30547           if (didMatch) return;
30548           for (i = 0; i < bindings.length; i++) {
30549               binding = bindings[i];
30550               if (binding.event.modifiers.shiftKey) continue;   // shift
30551               if (!!binding.capture !== isCapturing) continue;
30552               if (matches(binding, false)) {
30553                   binding.callback();
30554               }
30555           }
30556
30557
30558           function matches(binding, testShift) {
30559               var event$1 = event;
30560               var isMatch = false;
30561               var tryKeyCode = true;
30562
30563               // Prefer a match on `KeyboardEvent.key`
30564               if (event$1.key !== undefined) {
30565                   tryKeyCode = (event$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
30566                   isMatch = true;
30567
30568                   if (binding.event.key === undefined) {
30569                       isMatch = false;
30570                   } else if (Array.isArray(binding.event.key)) {
30571                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1)
30572                           isMatch = false;
30573                   } else {
30574                       if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
30575                           isMatch = false;
30576                   }
30577               }
30578
30579               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
30580               // - browser doesn't support `KeyboardEvent.key`
30581               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
30582               if (!isMatch && tryKeyCode) {
30583                   isMatch = (event$1.keyCode === binding.event.keyCode);
30584               }
30585
30586               if (!isMatch) return false;
30587
30588               // test modifier keys
30589               if (!(event$1.ctrlKey && event$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
30590                   if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
30591                   if (event$1.altKey !== binding.event.modifiers.altKey) return false;
30592               }
30593               if (event$1.metaKey !== binding.event.modifiers.metaKey) return false;
30594               if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
30595
30596               return true;
30597           }
30598       }
30599
30600
30601       function capture() {
30602           testBindings(true);
30603       }
30604
30605
30606       function bubble() {
30607           var tagName = select(event.target).node().tagName;
30608           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
30609               return;
30610           }
30611           testBindings(false);
30612       }
30613
30614
30615       function keybinding(selection) {
30616           selection = selection || select(document);
30617           selection.on('keydown.capture.' + namespace, capture, true);
30618           selection.on('keydown.bubble.' + namespace, bubble, false);
30619           return keybinding;
30620       }
30621
30622       // was: keybinding.off()
30623       keybinding.unbind = function(selection) {
30624           _keybindings = [];
30625           selection = selection || select(document);
30626           selection.on('keydown.capture.' + namespace, null);
30627           selection.on('keydown.bubble.' + namespace, null);
30628           return keybinding;
30629       };
30630
30631
30632       keybinding.clear = function() {
30633           _keybindings = {};
30634           return keybinding;
30635       };
30636
30637
30638       // Remove one or more keycode bindings.
30639       keybinding.off = function(codes, capture) {
30640           var arr = uniq([].concat(codes));
30641
30642           for (var i = 0; i < arr.length; i++) {
30643               var id = arr[i] + (capture ? '-capture' : '-bubble');
30644               delete _keybindings[id];
30645           }
30646           return keybinding;
30647       };
30648
30649
30650       // Add one or more keycode bindings.
30651       keybinding.on = function(codes, callback, capture) {
30652           if (!isFunction(callback)) {
30653               return keybinding.off(codes, capture);
30654           }
30655
30656           var arr = uniq([].concat(codes));
30657
30658           for (var i = 0; i < arr.length; i++) {
30659               var id = arr[i] + (capture ? '-capture' : '-bubble');
30660               var binding = {
30661                   id: id,
30662                   capture: capture,
30663                   callback: callback,
30664                   event: {
30665                       key: undefined,  // preferred
30666                       keyCode: 0,      // fallback
30667                       modifiers: {
30668                           shiftKey: false,
30669                           ctrlKey: false,
30670                           altKey: false,
30671                           metaKey: false
30672                       }
30673                   }
30674               };
30675
30676               if (_keybindings[id]) {
30677                   console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
30678               }
30679
30680               _keybindings[id] = binding;
30681
30682               var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
30683               for (var j = 0; j < matches.length; j++) {
30684                   // Normalise matching errors
30685                   if (matches[j] === '++') matches[j] = '+';
30686
30687                   if (matches[j] in utilKeybinding.modifierCodes) {
30688                       var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
30689                       binding.event.modifiers[prop] = true;
30690                   } else {
30691                       binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
30692                       if (matches[j] in utilKeybinding.keyCodes) {
30693                           binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
30694                       }
30695                   }
30696               }
30697           }
30698
30699           return keybinding;
30700       };
30701
30702
30703       return keybinding;
30704   }
30705
30706
30707   /*
30708    * See https://github.com/keithamus/jwerty
30709    */
30710
30711   utilKeybinding.modifierCodes = {
30712       // Shift key, ⇧
30713       '⇧': 16, shift: 16,
30714       // CTRL key, on Mac: ⌃
30715       '⌃': 17, ctrl: 17,
30716       // ALT key, on Mac: ⌥ (Alt)
30717       '⌥': 18, alt: 18, option: 18,
30718       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
30719       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
30720   };
30721
30722   utilKeybinding.modifierProperties = {
30723       16: 'shiftKey',
30724       17: 'ctrlKey',
30725       18: 'altKey',
30726       91: 'metaKey'
30727   };
30728
30729   utilKeybinding.keys = {
30730       // Backspace key, on Mac: ⌫ (Backspace)
30731       '⌫': 'Backspace', backspace: 'Backspace',
30732       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30733       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
30734       // Return key, ↩
30735       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
30736       // Pause/Break key
30737       'pause': 'Pause', 'pause-break': 'Pause',
30738       // Caps Lock key, ⇪
30739       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
30740       // Escape key, on Mac: ⎋, on Windows: Esc
30741       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
30742       // Space key
30743       space: [' ', 'Spacebar'],
30744       // Page-Up key, or pgup, on Mac: ↖
30745       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
30746       // Page-Down key, or pgdown, on Mac: ↘
30747       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
30748       // END key, on Mac: ⇟
30749       '⇟': 'End', end: 'End',
30750       // HOME key, on Mac: ⇞
30751       '⇞': 'Home', home: 'Home',
30752       // Insert key, or ins
30753       ins: 'Insert', insert: 'Insert',
30754       // Delete key, on Mac: ⌦ (Delete)
30755       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
30756       // Left Arrow Key, or ←
30757       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
30758       // Up Arrow Key, or ↑
30759       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
30760       // Right Arrow Key, or →
30761       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
30762       // Up Arrow Key, or ↓
30763       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
30764       // odities, stuff for backward compatibility (browsers and code):
30765       // Num-Multiply, or *
30766       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
30767       // Num-Plus or +
30768       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
30769       // Num-Subtract, or -
30770       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
30771       // Semicolon
30772       semicolon: ';',
30773       // = or equals
30774       equals: '=',
30775       // Comma, or ,
30776       comma: ',',
30777       // Period, or ., or full-stop
30778       period: '.', 'full-stop': '.',
30779       // Slash, or /, or forward-slash
30780       slash: '/', 'forward-slash': '/',
30781       // Tick, or `, or back-quote
30782       tick: '`', 'back-quote': '`',
30783       // Open bracket, or [
30784       'open-bracket': '[',
30785       // Back slash, or \
30786       'back-slash': '\\',
30787       // Close backet, or ]
30788       'close-bracket': ']',
30789       // Apostrophe, or Quote, or '
30790       quote: '\'', apostrophe: '\'',
30791       // NUMPAD 0-9
30792       'num-0': '0',
30793       'num-1': '1',
30794       'num-2': '2',
30795       'num-3': '3',
30796       'num-4': '4',
30797       'num-5': '5',
30798       'num-6': '6',
30799       'num-7': '7',
30800       'num-8': '8',
30801       'num-9': '9',
30802       // F1-F25
30803       f1: 'F1',
30804       f2: 'F2',
30805       f3: 'F3',
30806       f4: 'F4',
30807       f5: 'F5',
30808       f6: 'F6',
30809       f7: 'F7',
30810       f8: 'F8',
30811       f9: 'F9',
30812       f10: 'F10',
30813       f11: 'F11',
30814       f12: 'F12',
30815       f13: 'F13',
30816       f14: 'F14',
30817       f15: 'F15',
30818       f16: 'F16',
30819       f17: 'F17',
30820       f18: 'F18',
30821       f19: 'F19',
30822       f20: 'F20',
30823       f21: 'F21',
30824       f22: 'F22',
30825       f23: 'F23',
30826       f24: 'F24',
30827       f25: 'F25'
30828   };
30829
30830   utilKeybinding.keyCodes = {
30831       // Backspace key, on Mac: ⌫ (Backspace)
30832       '⌫': 8, backspace: 8,
30833       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
30834       '⇥': 9, '⇆': 9, tab: 9,
30835       // Return key, ↩
30836       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
30837       // Pause/Break key
30838       'pause': 19, 'pause-break': 19,
30839       // Caps Lock key, ⇪
30840       '⇪': 20, caps: 20, 'caps-lock': 20,
30841       // Escape key, on Mac: ⎋, on Windows: Esc
30842       '⎋': 27, escape: 27, esc: 27,
30843       // Space key
30844       space: 32,
30845       // Page-Up key, or pgup, on Mac: ↖
30846       '↖': 33, pgup: 33, 'page-up': 33,
30847       // Page-Down key, or pgdown, on Mac: ↘
30848       '↘': 34, pgdown: 34, 'page-down': 34,
30849       // END key, on Mac: ⇟
30850       '⇟': 35, end: 35,
30851       // HOME key, on Mac: ⇞
30852       '⇞': 36, home: 36,
30853       // Insert key, or ins
30854       ins: 45, insert: 45,
30855       // Delete key, on Mac: ⌦ (Delete)
30856       '⌦': 46, del: 46, 'delete': 46,
30857       // Left Arrow Key, or ←
30858       '←': 37, left: 37, 'arrow-left': 37,
30859       // Up Arrow Key, or ↑
30860       '↑': 38, up: 38, 'arrow-up': 38,
30861       // Right Arrow Key, or →
30862       '→': 39, right: 39, 'arrow-right': 39,
30863       // Up Arrow Key, or ↓
30864       '↓': 40, down: 40, 'arrow-down': 40,
30865       // odities, printing characters that come out wrong:
30866       // Firefox Equals
30867       'ffequals': 61,
30868       // Num-Multiply, or *
30869       '*': 106, star: 106, asterisk: 106, multiply: 106,
30870       // Num-Plus or +
30871       '+': 107, 'plus': 107,
30872       // Num-Subtract, or -
30873       '-': 109, subtract: 109,
30874       // Firefox Plus
30875       'ffplus': 171,
30876       // Firefox Minus
30877       'ffminus': 173,
30878       // Semicolon
30879       ';': 186, semicolon: 186,
30880       // = or equals
30881       '=': 187, 'equals': 187,
30882       // Comma, or ,
30883       ',': 188, comma: 188,
30884       // Dash / Underscore key
30885       'dash': 189,
30886       // Period, or ., or full-stop
30887       '.': 190, period: 190, 'full-stop': 190,
30888       // Slash, or /, or forward-slash
30889       '/': 191, slash: 191, 'forward-slash': 191,
30890       // Tick, or `, or back-quote
30891       '`': 192, tick: 192, 'back-quote': 192,
30892       // Open bracket, or [
30893       '[': 219, 'open-bracket': 219,
30894       // Back slash, or \
30895       '\\': 220, 'back-slash': 220,
30896       // Close backet, or ]
30897       ']': 221, 'close-bracket': 221,
30898       // Apostrophe, or Quote, or '
30899       '\'': 222, quote: 222, apostrophe: 222
30900   };
30901
30902   // NUMPAD 0-9
30903   var i$1 = 95, n = 0;
30904   while (++i$1 < 106) {
30905       utilKeybinding.keyCodes['num-' + n] = i$1;
30906       ++n;
30907   }
30908
30909   // 0-9
30910   i$1 = 47; n = 0;
30911   while (++i$1 < 58) {
30912       utilKeybinding.keyCodes[n] = i$1;
30913       ++n;
30914   }
30915
30916   // F1-F25
30917   i$1 = 111; n = 1;
30918   while (++i$1 < 136) {
30919       utilKeybinding.keyCodes['f' + n] = i$1;
30920       ++n;
30921   }
30922
30923   // a-z
30924   i$1 = 64;
30925   while (++i$1 < 91) {
30926       utilKeybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
30927   }
30928
30929   // Copies a variable number of methods from source to target.
30930   function utilRebind(target, source) {
30931       var i = 1, n = arguments.length, method;
30932       while (++i < n) {
30933           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
30934       }
30935       return target;
30936   }
30937
30938   // Method is assumed to be a standard D3 getter-setter:
30939   // If passed with no arguments, gets the value.
30940   // If passed with arguments, sets the value and returns the target.
30941   function d3_rebind(target, source, method) {
30942       return function() {
30943           var value = method.apply(source, arguments);
30944           return value === source ? target : value;
30945       };
30946   }
30947
30948   // A per-domain session mutex backed by a cookie and dead man's
30949   // switch. If the session crashes, the mutex will auto-release
30950   // after 5 seconds.
30951
30952   // This accepts a string and returns an object that complies with utilSessionMutexType
30953   function utilSessionMutex(name) {
30954       var mutex = {};
30955       var intervalID;
30956
30957       function renew() {
30958           var expires = new Date();
30959           expires.setSeconds(expires.getSeconds() + 5);
30960           document.cookie = name + '=1; expires=' + expires.toUTCString();
30961       }
30962
30963       mutex.lock = function () {
30964           if (intervalID) return true;
30965           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
30966           if (cookie) return false;
30967           renew();
30968           intervalID = window.setInterval(renew, 4000);
30969           return true;
30970       };
30971
30972       mutex.unlock = function () {
30973           if (!intervalID) return;
30974           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
30975           clearInterval(intervalID);
30976           intervalID = null;
30977       };
30978
30979       mutex.locked = function () {
30980           return !!intervalID;
30981       };
30982
30983       return mutex;
30984   }
30985
30986   function utilTiler() {
30987       var _size = [256, 256];
30988       var _scale = 256;
30989       var _tileSize = 256;
30990       var _zoomExtent = [0, 20];
30991       var _translate = [_size[0] / 2, _size[1] / 2];
30992       var _margin = 0;
30993       var _skipNullIsland = false;
30994
30995
30996       function clamp(num, min, max) {
30997           return Math.max(min, Math.min(num, max));
30998       }
30999
31000
31001       function nearNullIsland(tile) {
31002           var x = tile[0];
31003           var y = tile[1];
31004           var z = tile[2];
31005           if (z >= 7) {
31006               var center = Math.pow(2, z - 1);
31007               var width = Math.pow(2, z - 6);
31008               var min = center - (width / 2);
31009               var max = center + (width / 2) - 1;
31010               return x >= min && x <= max && y >= min && y <= max;
31011           }
31012           return false;
31013       }
31014
31015
31016       function tiler() {
31017           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
31018           var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
31019           var tileMin = 0;
31020           var tileMax = Math.pow(2, z0) - 1;
31021           var log2ts = Math.log(_tileSize) * Math.LOG2E;
31022           var k = Math.pow(2, z - z0 + log2ts);
31023           var origin = [
31024               (_translate[0] - _scale / 2) / k,
31025               (_translate[1] - _scale / 2) / k
31026           ];
31027
31028           var cols = range(
31029               clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
31030               clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
31031           );
31032           var rows = range(
31033               clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
31034               clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
31035           );
31036
31037           var tiles = [];
31038           for (var i = 0; i < rows.length; i++) {
31039               var y = rows[i];
31040               for (var j = 0; j < cols.length; j++) {
31041                   var x = cols[j];
31042
31043                   if (i >= _margin && i <= rows.length - _margin &&
31044                       j >= _margin && j <= cols.length - _margin) {
31045                       tiles.unshift([x, y, z0]);  // tiles in view at beginning
31046                   } else {
31047                       tiles.push([x, y, z0]);     // tiles in margin at the end
31048                   }
31049               }
31050           }
31051
31052           tiles.translate = origin;
31053           tiles.scale = k;
31054
31055           return tiles;
31056       }
31057
31058
31059       /**
31060        * getTiles() returns an array of tiles that cover the map view
31061        */
31062       tiler.getTiles = function(projection) {
31063           var origin = [
31064               projection.scale() * Math.PI - projection.translate()[0],
31065               projection.scale() * Math.PI - projection.translate()[1]
31066           ];
31067
31068           this
31069               .size(projection.clipExtent()[1])
31070               .scale(projection.scale() * 2 * Math.PI)
31071               .translate(projection.translate());
31072
31073           var tiles = tiler();
31074           var ts = tiles.scale;
31075
31076           return tiles
31077               .map(function(tile) {
31078                   if (_skipNullIsland && nearNullIsland(tile)) {
31079                       return false;
31080                   }
31081                   var x = tile[0] * ts - origin[0];
31082                   var y = tile[1] * ts - origin[1];
31083                   return {
31084                       id: tile.toString(),
31085                       xyz: tile,
31086                       extent: geoExtent(
31087                           projection.invert([x, y + ts]),
31088                           projection.invert([x + ts, y])
31089                       )
31090                   };
31091               }).filter(Boolean);
31092       };
31093
31094
31095       /**
31096        * getGeoJSON() returns a FeatureCollection for debugging tiles
31097        */
31098       tiler.getGeoJSON = function(projection) {
31099           var features = tiler.getTiles(projection).map(function(tile) {
31100               return {
31101                   type: 'Feature',
31102                   properties: {
31103                       id: tile.id,
31104                       name: tile.id
31105                   },
31106                   geometry: {
31107                       type: 'Polygon',
31108                       coordinates: [ tile.extent.polygon() ]
31109                   }
31110               };
31111           });
31112
31113           return {
31114               type: 'FeatureCollection',
31115               features: features
31116           };
31117       };
31118
31119
31120       tiler.tileSize = function(val) {
31121           if (!arguments.length) return _tileSize;
31122           _tileSize = val;
31123           return tiler;
31124       };
31125
31126
31127       tiler.zoomExtent = function(val) {
31128           if (!arguments.length) return _zoomExtent;
31129           _zoomExtent = val;
31130           return tiler;
31131       };
31132
31133
31134       tiler.size = function(val) {
31135           if (!arguments.length) return _size;
31136           _size = val;
31137           return tiler;
31138       };
31139
31140
31141       tiler.scale = function(val) {
31142           if (!arguments.length) return _scale;
31143           _scale = val;
31144           return tiler;
31145       };
31146
31147
31148       tiler.translate = function(val) {
31149           if (!arguments.length) return _translate;
31150           _translate = val;
31151           return tiler;
31152       };
31153
31154
31155       // number to extend the rows/columns beyond those covering the viewport
31156       tiler.margin = function(val) {
31157           if (!arguments.length) return _margin;
31158           _margin = +val;
31159           return tiler;
31160       };
31161
31162
31163       tiler.skipNullIsland = function(val) {
31164           if (!arguments.length) return _skipNullIsland;
31165           _skipNullIsland = val;
31166           return tiler;
31167       };
31168
31169
31170       return tiler;
31171   }
31172
31173   function utilTriggerEvent(target, type) {
31174       target.each(function() {
31175           var evt = document.createEvent('HTMLEvents');
31176           evt.initEvent(type, true, true);
31177           this.dispatchEvent(evt);
31178       });
31179   }
31180
31181   function coreGraph(other, mutable) {
31182       if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
31183
31184       if (other instanceof coreGraph) {
31185           var base = other.base();
31186           this.entities = assign(Object.create(base.entities), other.entities);
31187           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
31188           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
31189
31190       } else {
31191           this.entities = Object.create({});
31192           this._parentWays = Object.create({});
31193           this._parentRels = Object.create({});
31194           this.rebase(other || [], [this]);
31195       }
31196
31197       this.transients = {};
31198       this._childNodes = {};
31199       this.frozen = !mutable;
31200   }
31201
31202
31203   coreGraph.prototype = {
31204
31205       hasEntity: function(id) {
31206           return this.entities[id];
31207       },
31208
31209
31210       entity: function(id) {
31211           var entity = this.entities[id];
31212
31213           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
31214           if (!entity) {
31215               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
31216           }
31217
31218           if (!entity) {
31219               throw new Error('entity ' + id + ' not found');
31220           }
31221           return entity;
31222       },
31223
31224
31225       transient: function(entity, key, fn) {
31226           var id = entity.id;
31227           var transients = this.transients[id] || (this.transients[id] = {});
31228
31229           if (transients[key] !== undefined) {
31230               return transients[key];
31231           }
31232
31233           transients[key] = fn.call(entity);
31234
31235           return transients[key];
31236       },
31237
31238
31239       parentWays: function(entity) {
31240           var parents = this._parentWays[entity.id];
31241           var result = [];
31242
31243           if (parents) {
31244               for (var i = 0; i < parents.length; i++) {
31245                   result.push(this.entity(parents[i]));
31246               }
31247           }
31248           return result;
31249       },
31250
31251
31252       isPoi: function(entity) {
31253           var parentWays = this._parentWays[entity.id];
31254           return !parentWays || parentWays.length === 0;
31255       },
31256
31257
31258       isShared: function(entity) {
31259           var parentWays = this._parentWays[entity.id];
31260           return parentWays && parentWays.length > 1;
31261       },
31262
31263
31264       parentRelations: function(entity) {
31265           var parents = this._parentRels[entity.id];
31266           var result = [];
31267
31268           if (parents) {
31269               for (var i = 0; i < parents.length; i++) {
31270                   result.push(this.entity(parents[i]));
31271               }
31272           }
31273           return result;
31274       },
31275
31276
31277       childNodes: function(entity) {
31278           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
31279           if (!entity.nodes) return [];
31280
31281           var nodes = [];
31282           for (var i = 0; i < entity.nodes.length; i++) {
31283               nodes[i] = this.entity(entity.nodes[i]);
31284           }
31285
31286           this._childNodes[entity.id] = nodes;
31287           return this._childNodes[entity.id];
31288       },
31289
31290
31291       base: function() {
31292           return {
31293               'entities': utilGetPrototypeOf(this.entities),
31294               'parentWays': utilGetPrototypeOf(this._parentWays),
31295               'parentRels': utilGetPrototypeOf(this._parentRels)
31296           };
31297       },
31298
31299
31300       // Unlike other graph methods, rebase mutates in place. This is because it
31301       // is used only during the history operation that merges newly downloaded
31302       // data into each state. To external consumers, it should appear as if the
31303       // graph always contained the newly downloaded data.
31304       rebase: function(entities, stack, force) {
31305           var base = this.base();
31306           var i, j, k, id;
31307
31308           for (i = 0; i < entities.length; i++) {
31309               var entity = entities[i];
31310
31311               if (!entity.visible || (!force && base.entities[entity.id]))
31312                   continue;
31313
31314               // Merging data into the base graph
31315               base.entities[entity.id] = entity;
31316               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
31317
31318               // Restore provisionally-deleted nodes that are discovered to have an extant parent
31319               if (entity.type === 'way') {
31320                   for (j = 0; j < entity.nodes.length; j++) {
31321                       id = entity.nodes[j];
31322                       for (k = 1; k < stack.length; k++) {
31323                           var ents = stack[k].entities;
31324                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
31325                               delete ents[id];
31326                           }
31327                       }
31328                   }
31329               }
31330           }
31331
31332           for (i = 0; i < stack.length; i++) {
31333               stack[i]._updateRebased();
31334           }
31335       },
31336
31337
31338       _updateRebased: function() {
31339           var base = this.base();
31340           var i, k, child, id, keys;
31341
31342           keys = Object.keys(this._parentWays);
31343           for (i = 0; i < keys.length; i++) {
31344               child = keys[i];
31345               if (base.parentWays[child]) {
31346                   for (k = 0; k < base.parentWays[child].length; k++) {
31347                       id = base.parentWays[child][k];
31348                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
31349                           this._parentWays[child].push(id);
31350                       }
31351                   }
31352               }
31353           }
31354
31355           keys = Object.keys(this._parentRels);
31356           for (i = 0; i < keys.length; i++) {
31357               child = keys[i];
31358               if (base.parentRels[child]) {
31359                   for (k = 0; k < base.parentRels[child].length; k++) {
31360                       id = base.parentRels[child][k];
31361                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
31362                           this._parentRels[child].push(id);
31363                       }
31364                   }
31365               }
31366           }
31367
31368           this.transients = {};
31369
31370           // this._childNodes is not updated, under the assumption that
31371           // ways are always downloaded with their child nodes.
31372       },
31373
31374
31375       // Updates calculated properties (parentWays, parentRels) for the specified change
31376       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
31377           parentWays = parentWays || this._parentWays;
31378           parentRels = parentRels || this._parentRels;
31379
31380           var type = entity && entity.type || oldentity && oldentity.type;
31381           var removed, added, ways, rels, i;
31382
31383           if (type === 'way') {   // Update parentWays
31384               if (oldentity && entity) {
31385                   removed = difference(oldentity.nodes, entity.nodes);
31386                   added = difference(entity.nodes, oldentity.nodes);
31387               } else if (oldentity) {
31388                   removed = oldentity.nodes;
31389                   added = [];
31390               } else if (entity) {
31391                   removed = [];
31392                   added = entity.nodes;
31393               }
31394               for (i = 0; i < removed.length; i++) {
31395                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
31396               }
31397               for (i = 0; i < added.length; i++) {
31398                   ways = without(parentWays[added[i]], entity.id);
31399                   ways.push(entity.id);
31400                   parentWays[added[i]] = ways;
31401               }
31402
31403           } else if (type === 'relation') {   // Update parentRels
31404               if (oldentity && entity) {
31405                   removed = difference(oldentity.members, entity.members);
31406                   added = difference(entity.members, oldentity);
31407               } else if (oldentity) {
31408                   removed = oldentity.members;
31409                   added = [];
31410               } else if (entity) {
31411                   removed = [];
31412                   added = entity.members;
31413               }
31414               for (i = 0; i < removed.length; i++) {
31415                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
31416               }
31417               for (i = 0; i < added.length; i++) {
31418                   rels = without(parentRels[added[i].id], entity.id);
31419                   rels.push(entity.id);
31420                   parentRels[added[i].id] = rels;
31421               }
31422           }
31423       },
31424
31425
31426       replace: function(entity) {
31427           if (this.entities[entity.id] === entity) return this;
31428
31429           return this.update(function() {
31430               this._updateCalculated(this.entities[entity.id], entity);
31431               this.entities[entity.id] = entity;
31432           });
31433       },
31434
31435
31436       remove: function(entity) {
31437           return this.update(function() {
31438               this._updateCalculated(entity, undefined);
31439               this.entities[entity.id] = undefined;
31440           });
31441       },
31442
31443
31444       revert: function(id) {
31445           var baseEntity = this.base().entities[id];
31446           var headEntity = this.entities[id];
31447           if (headEntity === baseEntity) return this;
31448
31449           return this.update(function() {
31450               this._updateCalculated(headEntity, baseEntity);
31451               delete this.entities[id];
31452           });
31453       },
31454
31455
31456       update: function() {
31457           var graph = this.frozen ? coreGraph(this, true) : this;
31458           for (var i = 0; i < arguments.length; i++) {
31459               arguments[i].call(graph, graph);
31460           }
31461
31462           if (this.frozen) graph.frozen = true;
31463
31464           return graph;
31465       },
31466
31467
31468       // Obliterates any existing entities
31469       load: function(entities) {
31470           var base = this.base();
31471           this.entities = Object.create(base.entities);
31472
31473           for (var i in entities) {
31474               this.entities[i] = entities[i];
31475               this._updateCalculated(base.entities[i], this.entities[i]);
31476           }
31477
31478           return this;
31479       }
31480   };
31481
31482   function coreTree(head) {
31483       var rtree = rbush_1(),
31484           bboxes = {},
31485           tree = {};
31486
31487
31488       function entityBBox(entity) {
31489           var bbox = entity.extent(head).bbox();
31490           bbox.id = entity.id;
31491           bboxes[entity.id] = bbox;
31492           return bbox;
31493       }
31494
31495
31496       function updateParents(entity, insertions, memo) {
31497           head.parentWays(entity).forEach(function(way) {
31498               if (bboxes[way.id]) {
31499                   rtree.remove(bboxes[way.id]);
31500                   insertions[way.id] = way;
31501               }
31502               updateParents(way, insertions, memo);
31503           });
31504
31505           head.parentRelations(entity).forEach(function(relation) {
31506               if (memo[entity.id]) return;
31507               memo[entity.id] = true;
31508               if (bboxes[relation.id]) {
31509                   rtree.remove(bboxes[relation.id]);
31510                   insertions[relation.id] = relation;
31511               }
31512               updateParents(relation, insertions, memo);
31513           });
31514       }
31515
31516
31517       tree.rebase = function(entities, force) {
31518           var insertions = {};
31519
31520           for (var i = 0; i < entities.length; i++) {
31521               var entity = entities[i];
31522
31523               if (!entity.visible)
31524                   continue;
31525
31526               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
31527                   if (!force) {
31528                       continue;
31529                   } else if (bboxes[entity.id]) {
31530                       rtree.remove(bboxes[entity.id]);
31531                   }
31532               }
31533
31534               insertions[entity.id] = entity;
31535               updateParents(entity, insertions, {});
31536           }
31537
31538           rtree.load(map$3(insertions, entityBBox));
31539
31540           return tree;
31541       };
31542
31543
31544       tree.intersects = function(extent, graph) {
31545           if (graph !== head) {
31546               var diff = coreDifference(head, graph),
31547                   insertions = {};
31548
31549               head = graph;
31550
31551               diff.deleted().forEach(function(entity) {
31552                   rtree.remove(bboxes[entity.id]);
31553                   delete bboxes[entity.id];
31554               });
31555
31556               diff.modified().forEach(function(entity) {
31557                   rtree.remove(bboxes[entity.id]);
31558                   insertions[entity.id] = entity;
31559                   updateParents(entity, insertions, {});
31560               });
31561
31562               diff.created().forEach(function(entity) {
31563                   insertions[entity.id] = entity;
31564               });
31565
31566               rtree.load(map$3(insertions, entityBBox));
31567           }
31568
31569           return rtree.search(extent.bbox()).map(function(bbox) {
31570               return head.entity(bbox.id);
31571           });
31572       };
31573
31574
31575       return tree;
31576   }
31577
31578   var _tooltipID = 0;
31579
31580   function tooltip() {
31581       var _id = _tooltipID++;
31582       var tooltip = function(selection) {
31583           selection.each(setup);
31584       };
31585       var _animation = utilFunctor(false);
31586       var _title = function() {
31587           var title = this.getAttribute('data-original-title');
31588           if (title) {
31589               return title;
31590           } else {
31591               title = this.getAttribute('title');
31592               this.removeAttribute('title');
31593               this.setAttribute('data-original-title', title);
31594           }
31595           return title;
31596       };
31597       var _html = utilFunctor(false);
31598       var _placement = utilFunctor('top');
31599
31600
31601       tooltip.title = function(val) {
31602           if (arguments.length) {
31603               _title = utilFunctor(val);
31604               return tooltip;
31605           } else {
31606               return _title;
31607           }
31608       };
31609
31610
31611       tooltip.html = function(val) {
31612           if (arguments.length) {
31613               _html = utilFunctor(val);
31614               return tooltip;
31615           } else {
31616               return _html;
31617           }
31618       };
31619
31620
31621       tooltip.placement = function(val) {
31622           if (arguments.length) {
31623               _placement = utilFunctor(val);
31624               return tooltip;
31625           } else {
31626               return _placement;
31627           }
31628       };
31629
31630
31631       tooltip.show = function(selection) {
31632           selection.each(show);
31633       };
31634
31635
31636       tooltip.hide = function(selection) {
31637           selection.each(hide);
31638       };
31639
31640
31641       tooltip.toggle = function(selection) {
31642           selection.each(toggle);
31643       };
31644
31645
31646       tooltip.destroy = function(selection, selector) {
31647           // by default, just destroy the current tooltip
31648           selector = selector || '.tooltip-' + _id;
31649
31650           selection
31651               .on('mouseenter.tooltip', null)
31652               .on('mouseleave.tooltip', null)
31653               .attr('title', function() {
31654                   return this.getAttribute('data-original-title') || this.getAttribute('title');
31655               })
31656               .attr('data-original-title', null)
31657               .selectAll(selector)
31658               .remove();
31659       };
31660
31661
31662       tooltip.destroyAny = function(selection) {
31663           selection.call(tooltip.destroy, '.tooltip');
31664       };
31665
31666
31667       function setup() {
31668           var root = select(this);
31669           var animate = _animation.apply(this, arguments);
31670           var tip = root.selectAll('.tooltip-' + _id)
31671               .data([0]);
31672
31673           var enter = tip.enter()
31674               .append('div')
31675               .attr('class', 'tooltip tooltip-' + _id);
31676
31677           enter
31678               .append('div')
31679               .attr('class', 'tooltip-arrow');
31680
31681           enter
31682               .append('div')
31683               .attr('class', 'tooltip-inner');
31684
31685           tip = enter
31686               .merge(tip);
31687
31688           if (animate) {
31689               tip.classed('fade', true);
31690           }
31691
31692           var place = _placement.apply(this, arguments);
31693           tip.classed(place, true);
31694
31695           root.on('mouseenter.tooltip', show);
31696           root.on('mouseleave.tooltip', hide);
31697       }
31698
31699
31700       function show() {
31701           var root = select(this);
31702           var content = _title.apply(this, arguments);
31703           var tip = root.selectAll('.tooltip-' + _id);
31704
31705           if (tip.empty()) {   // tooltip was removed somehow, put it back
31706               root.call(tooltip.destroy);
31707               root.each(setup);
31708               tip = root.selectAll('.tooltip-' + _id);
31709           }
31710
31711           tip.classed('in', true);
31712           var markup = _html.apply(this, arguments);
31713
31714           tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
31715           var place = _placement.apply(this, arguments);
31716           var outer = getPosition(root.node());
31717           var inner = getPosition(tip.node());
31718           var pos;
31719
31720           switch (place) {
31721               case 'top':
31722               pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
31723               break;
31724               case 'right':
31725               pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
31726               break;
31727               case 'left':
31728               pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
31729               break;
31730               case 'bottom':
31731               pos = { x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h };
31732               break;
31733           }
31734
31735           if (pos) {
31736               tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
31737           } else {
31738               tip.style('left', null).style('top', null);
31739           }
31740
31741           this.tooltipVisible = true;
31742
31743
31744           function getPosition(node) {
31745               var mode = select(node).style('position');
31746               if (mode === 'absolute' || mode === 'static') {
31747                   return {
31748                       x: node.offsetLeft,
31749                       y: node.offsetTop,
31750                       w: node.offsetWidth,
31751                       h: node.offsetHeight
31752                   };
31753               } else {
31754                   return {
31755                       x: 0,
31756                       y: 0,
31757                       w: node.offsetWidth,
31758                       h: node.offsetHeight
31759                   };
31760               }
31761           }
31762       }
31763
31764
31765       function hide() {
31766           select(this).selectAll('.tooltip-' + _id).classed('in', false);
31767           this.tooltipVisible = false;
31768       }
31769
31770
31771       function toggle() {
31772           if (this.tooltipVisible) {
31773               hide.apply(this, arguments);
31774           } else {
31775               show.apply(this, arguments);
31776           }
31777       }
31778
31779
31780       return tooltip;
31781   }
31782
31783   function behaviorEdit(context) {
31784
31785       function behavior() {
31786           context.map()
31787               .minzoom(context.minEditableZoom());
31788       }
31789
31790
31791       behavior.off = function() {
31792           context.map()
31793               .minzoom(0);
31794       };
31795
31796       return behavior;
31797   }
31798
31799   /*
31800      The hover behavior adds the `.hover` class on mouseover to all elements to which
31801      the identical datum is bound, and removes it on mouseout.
31802
31803      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
31804      representation may consist of several elements scattered throughout the DOM hierarchy.
31805      Only one of these elements can have the :hover pseudo-class, but all of them will
31806      have the .hover class.
31807    */
31808   function behaviorHover(context) {
31809       var dispatch$1 = dispatch('hover');
31810       var _selection = select(null);
31811       var _newNodeId = null;
31812       var _initialNodeID = null;
31813       var _buttonDown;
31814       var _altDisables;
31815       var _ignoreVertex;
31816       var _target;
31817
31818
31819       function keydown() {
31820           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
31821               _selection.selectAll('.hover')
31822                   .classed('hover-suppressed', true)
31823                   .classed('hover', false);
31824
31825               _selection
31826                   .classed('hover-disabled', true);
31827
31828               dispatch$1.call('hover', this, null);
31829           }
31830       }
31831
31832
31833       function keyup() {
31834           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
31835               _selection.selectAll('.hover-suppressed')
31836                   .classed('hover-suppressed', false)
31837                   .classed('hover', true);
31838
31839               _selection
31840                   .classed('hover-disabled', false);
31841
31842               dispatch$1.call('hover', this, _target ? _target.id : null);
31843           }
31844       }
31845
31846
31847       function behavior(selection) {
31848           _selection = selection;
31849
31850           if (_initialNodeID) {
31851               _newNodeId = _initialNodeID;
31852               _initialNodeID = null;
31853           } else {
31854               _newNodeId = null;
31855           }
31856
31857           _selection
31858               .on('mouseover.hover', mouseover)
31859               .on('mouseout.hover', mouseout)
31860               .on('mousedown.hover', mousedown);
31861
31862           select(window)
31863               .on('keydown.hover', keydown)
31864               .on('keyup.hover', keyup);
31865
31866
31867           function mouseover() {
31868               if (_buttonDown) return;
31869               var target = event.target;
31870               enter(target ? target.__data__ : null);
31871           }
31872
31873
31874           function mouseout() {
31875               if (_buttonDown) return;
31876               var target = event.relatedTarget;
31877               enter(target ? target.__data__ : null);
31878           }
31879
31880
31881           function mousedown() {
31882               _buttonDown = true;
31883               select(window)
31884                   .on('mouseup.hover', mouseup, true);
31885           }
31886
31887
31888           function mouseup() {
31889               _buttonDown = false;
31890               select(window)
31891                   .on('mouseup.hover', null, true);
31892           }
31893
31894           function allowsVertex(d) {
31895               return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
31896           }
31897
31898           function enter(datum) {
31899               if (datum === _target) return;
31900               _target = datum;
31901
31902               _selection.selectAll('.hover')
31903                   .classed('hover', false);
31904               _selection.selectAll('.hover-suppressed')
31905                   .classed('hover-suppressed', false);
31906
31907               // What are we hovering over?
31908               var entity, selector;
31909               if (datum && datum.__featurehash__) {
31910                   entity = datum;
31911                   selector = '.data' + datum.__featurehash__;
31912
31913               } else if (datum instanceof qaError) {
31914                   entity = datum;
31915                   selector = '.' + datum.service + '.error_id-' + datum.id;
31916
31917               } else if (datum instanceof osmNote) {
31918                   entity = datum;
31919                   selector = '.note-' + datum.id;
31920
31921               } else if (datum instanceof osmEntity) {
31922                   entity = datum;
31923                   selector = '.' + entity.id;
31924                   if (entity.type === 'relation') {
31925                       entity.members.forEach(function(member) { selector += ', .' + member.id; });
31926                   }
31927               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
31928                   entity = datum.properties.entity;
31929                   selector = '.' + entity.id;
31930                   if (entity.type === 'relation') {
31931                       entity.members.forEach(function(member) { selector += ', .' + member.id; });
31932                   }
31933               }
31934
31935               // Update hover state and dispatch event
31936               if (entity && entity.id !== _newNodeId) {
31937                   // If drawing a way, don't hover on a node that was just placed. #3974
31938                   var mode = context.mode() && context.mode().id;
31939                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newNodeId && entity.type === 'node') {
31940                       _newNodeId = entity.id;
31941                       return;
31942                   }
31943
31944                   var suppressed = (_altDisables && event && event.altKey) ||
31945                       (entity.type === 'node' && _ignoreVertex && !allowsVertex(entity));
31946                   _selection.selectAll(selector)
31947                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
31948
31949                   dispatch$1.call('hover', this, !suppressed && entity);
31950
31951               } else {
31952                   dispatch$1.call('hover', this, null);
31953               }
31954           }
31955       }
31956
31957
31958       behavior.off = function(selection) {
31959           selection.selectAll('.hover')
31960               .classed('hover', false);
31961           selection.selectAll('.hover-suppressed')
31962               .classed('hover-suppressed', false);
31963           selection
31964               .classed('hover-disabled', false);
31965
31966           selection
31967               .on('mouseover.hover', null)
31968               .on('mouseout.hover', null)
31969               .on('mousedown.hover', null);
31970
31971           select(window)
31972               .on('keydown.hover', null)
31973               .on('keyup.hover', null);
31974       };
31975
31976
31977       behavior.altDisables = function(val) {
31978           if (!arguments.length) return _altDisables;
31979           _altDisables = val;
31980           return behavior;
31981       };
31982
31983       behavior.ignoreVertex = function(val) {
31984           if (!arguments.length) return _ignoreVertex;
31985           _ignoreVertex = val;
31986           return behavior;
31987       };
31988
31989       behavior.initialNodeID = function(nodeId) {
31990           _initialNodeID = nodeId;
31991           return behavior;
31992       };
31993
31994       return utilRebind(behavior, dispatch$1, 'on');
31995   }
31996
31997   function refresh(selection, node) {
31998       var cr = node.getBoundingClientRect();
31999       var prop = [cr.width, cr.height];
32000       selection.property('__dimensions__', prop);
32001       return prop;
32002   }
32003
32004   function utilGetDimensions(selection, force) {
32005       if (!selection || selection.empty()) {
32006           return [0, 0];
32007       }
32008       var node = selection.node(),
32009           cached = selection.property('__dimensions__');
32010       return (!cached || force) ? refresh(selection, node) : cached;
32011   }
32012
32013
32014   function utilSetDimensions(selection, dimensions) {
32015       if (!selection || selection.empty()) {
32016           return selection;
32017       }
32018       var node = selection.node();
32019       if (dimensions === null) {
32020           refresh(selection, node);
32021           return selection;
32022       }
32023       return selection
32024           .property('__dimensions__', [dimensions[0], dimensions[1]])
32025           .attr('width', dimensions[0])
32026           .attr('height', dimensions[1]);
32027   }
32028
32029   function behaviorTail() {
32030       var container;
32031       var xmargin = 25;
32032       var tooltipSize = [0, 0];
32033       var selectionSize = [0, 0];
32034       var _text;
32035
32036
32037       function behavior(selection) {
32038           if (!_text) return;
32039
32040           select(window)
32041               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
32042
32043           container = select(document.body)
32044               .append('div')
32045               .style('display', 'none')
32046               .attr('class', 'tail tooltip-inner');
32047
32048           container.append('div')
32049               .text(_text);
32050
32051           selection
32052               .on('mousemove.tail', mousemove)
32053               .on('mouseenter.tail', mouseenter)
32054               .on('mouseleave.tail', mouseleave);
32055
32056           container
32057               .on('mousemove.tail', mousemove);
32058
32059           tooltipSize = utilGetDimensions(container);
32060           selectionSize = utilGetDimensions(selection);
32061
32062
32063           function show() {
32064               container.style('display', 'block');
32065               tooltipSize = utilGetDimensions(container);
32066           }
32067
32068
32069           function mousemove() {
32070               if (container.style('display') === 'none') show();
32071               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
32072                   -tooltipSize[0] - xmargin : xmargin;
32073               container.classed('left', xoffset > 0);
32074               utilSetTransform(container, event.clientX + xoffset, event.clientY);
32075           }
32076
32077
32078           function mouseleave() {
32079               if (event.relatedTarget !== container.node()) {
32080                   container.style('display', 'none');
32081               }
32082           }
32083
32084
32085           function mouseenter() {
32086               if (event.relatedTarget !== container.node()) {
32087                   show();
32088               }
32089           }
32090       }
32091
32092
32093       behavior.off = function(selection) {
32094           if (!_text) return;
32095
32096           container
32097               .on('mousemove.tail', null)
32098               .remove();
32099
32100           selection
32101               .on('mousemove.tail', null)
32102               .on('mouseenter.tail', null)
32103               .on('mouseleave.tail', null);
32104
32105           select(window)
32106               .on('resize.tail', null);
32107       };
32108
32109
32110       behavior.text = function(val) {
32111           if (!arguments.length) return _text;
32112           _text = val;
32113           return behavior;
32114       };
32115
32116
32117       return behavior;
32118   }
32119
32120   var _usedTails = {};
32121   var _disableSpace = false;
32122   var _lastSpace = null;
32123
32124
32125   function behaviorDraw(context) {
32126       var dispatch$1 = dispatch(
32127           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
32128       );
32129
32130       var keybinding = utilKeybinding('draw');
32131
32132       var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
32133           .on('hover', context.ui().sidebar.hover);
32134       var tail = behaviorTail();
32135       var edit = behaviorEdit(context);
32136
32137       var closeTolerance = 4;
32138       var tolerance = 12;
32139       var _mouseLeave = false;
32140       var _lastMouse = null;
32141
32142
32143       // related code
32144       // - `mode/drag_node.js` `datum()`
32145       function datum() {
32146           var mode = context.mode();
32147           var isNote = mode && (mode.id.indexOf('note') !== -1);
32148           if (event.altKey || isNote) return {};
32149
32150           var element;
32151           if (event.type === 'keydown') {
32152               element = _lastMouse && _lastMouse.target;
32153           } else {
32154               element = event.target;
32155           }
32156
32157           // When drawing, snap only to touch targets..
32158           // (this excludes area fills and active drawing elements)
32159           var d = element.__data__;
32160           return (d && d.properties && d.properties.target) ? d : {};
32161       }
32162
32163
32164       function mousedown() {
32165
32166           function point() {
32167               var p = context.container().node();
32168               return touchId !== null ? d3_touches(p).filter(function(p) {
32169                   return p.identifier === touchId;
32170               })[0] : mouse(p);
32171           }
32172
32173           var element = select(this);
32174           var touchId = event.touches ? event.changedTouches[0].identifier : null;
32175           var t1 = +new Date();
32176           var p1 = point();
32177
32178           element.on('mousemove.draw', null);
32179
32180           select(window).on('mouseup.draw', function() {
32181               var t2 = +new Date();
32182               var p2 = point();
32183               var dist = geoVecLength(p1, p2);
32184
32185               element.on('mousemove.draw', mousemove);
32186               select(window).on('mouseup.draw', null);
32187
32188               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
32189                   // Prevent a quick second click
32190                   select(window).on('click.draw-block', function() {
32191                       event.stopPropagation();
32192                   }, true);
32193
32194                   context.map().dblclickEnable(false);
32195
32196                   window.setTimeout(function() {
32197                       context.map().dblclickEnable(true);
32198                       select(window).on('click.draw-block', null);
32199                   }, 500);
32200
32201                   click();
32202               }
32203           }, true);
32204       }
32205
32206
32207       function mousemove() {
32208           _lastMouse = event;
32209           dispatch$1.call('move', this, datum());
32210       }
32211
32212
32213       function mouseenter() {
32214           _mouseLeave = false;
32215       }
32216
32217
32218       function mouseleave() {
32219           _mouseLeave = true;
32220       }
32221
32222       function allowsVertex(d) {
32223           return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
32224       }
32225
32226       // related code
32227       // - `mode/drag_node.js`     `doMode()`
32228       // - `behavior/draw.js`      `click()`
32229       // - `behavior/draw_way.js`  `move()`
32230       function click() {
32231           var d = datum();
32232           var target = d && d.properties && d.properties.entity;
32233
32234           if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
32235               dispatch$1.call('clickNode', this, target, d);
32236               return;
32237
32238           } else if (target && target.type === 'way') {   // Snap to a way
32239               var choice = geoChooseEdge(
32240                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
32241               );
32242               if (choice) {
32243                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
32244                   dispatch$1.call('clickWay', this, choice.loc, edge, d);
32245                   return;
32246               }
32247           }
32248           dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
32249       }
32250
32251
32252       function space() {
32253           event.preventDefault();
32254           event.stopPropagation();
32255
32256           var currSpace = context.mouse();
32257           if (_disableSpace && _lastSpace) {
32258               var dist = geoVecLength(_lastSpace, currSpace);
32259               if (dist > tolerance) {
32260                   _disableSpace = false;
32261               }
32262           }
32263
32264           if (_disableSpace || _mouseLeave || !_lastMouse) return;
32265
32266           // user must move mouse or release space bar to allow another click
32267           _lastSpace = currSpace;
32268           _disableSpace = true;
32269
32270           select(window).on('keyup.space-block', function() {
32271               event.preventDefault();
32272               event.stopPropagation();
32273               _disableSpace = false;
32274               select(window).on('keyup.space-block', null);
32275           });
32276
32277           click();
32278       }
32279
32280
32281       function backspace() {
32282           event.preventDefault();
32283           dispatch$1.call('undo');
32284       }
32285
32286
32287       function del() {
32288           event.preventDefault();
32289           dispatch$1.call('cancel');
32290       }
32291
32292
32293       function ret() {
32294           event.preventDefault();
32295           dispatch$1.call('finish');
32296       }
32297
32298
32299       function behavior(selection) {
32300           context.install(_hover);
32301           context.install(edit);
32302
32303           if (!context.inIntro() && !_usedTails[tail.text()]) {
32304               context.install(tail);
32305           }
32306
32307           keybinding
32308               .on('⌫', backspace)
32309               .on('⌦', del)
32310               .on('⎋', ret)
32311               .on('↩', ret)
32312               .on('space', space)
32313               .on('⌥space', space);
32314
32315           selection
32316               .on('mouseenter.draw', mouseenter)
32317               .on('mouseleave.draw', mouseleave)
32318               .on('mousedown.draw', mousedown)
32319               .on('mousemove.draw', mousemove);
32320
32321           select(document)
32322               .call(keybinding);
32323
32324           return behavior;
32325       }
32326
32327
32328       behavior.off = function(selection) {
32329           context.ui().sidebar.hover.cancel();
32330           context.uninstall(_hover);
32331           context.uninstall(edit);
32332
32333           if (!context.inIntro() && !_usedTails[tail.text()]) {
32334               context.uninstall(tail);
32335               _usedTails[tail.text()] = true;
32336           }
32337
32338           selection
32339               .on('mouseenter.draw', null)
32340               .on('mouseleave.draw', null)
32341               .on('mousedown.draw', null)
32342               .on('mousemove.draw', null);
32343
32344           select(window)
32345               .on('mouseup.draw', null);
32346               // note: keyup.space-block, click.draw-block should remain
32347
32348           select(document)
32349               .call(keybinding.unbind);
32350       };
32351
32352
32353       behavior.tail = function(_) {
32354           tail.text(_);
32355           return behavior;
32356       };
32357
32358       behavior.hover = function() {
32359           return _hover;
32360       };
32361
32362
32363       return utilRebind(behavior, dispatch$1, 'on');
32364   }
32365
32366   function modeAddArea(context) {
32367       var mode = {
32368           id: 'add-area',
32369           button: 'area',
32370           title: t('modes.add_area.title'),
32371           description: t('modes.add_area.description'),
32372           key: '3'
32373       };
32374
32375       var behavior = behaviorAddWay(context)
32376           .tail(t('modes.add_area.tail'))
32377           .on('start', start)
32378           .on('startFromWay', startFromWay)
32379           .on('startFromNode', startFromNode);
32380
32381       var defaultTags = { area: 'yes' };
32382
32383
32384       function actionClose(wayId) {
32385           return function (graph) {
32386               return graph.replace(graph.entity(wayId).close());
32387           };
32388       }
32389
32390
32391       function start(loc) {
32392           var startGraph = context.graph();
32393           var node = osmNode({ loc: loc });
32394           var way = osmWay({ tags: defaultTags });
32395
32396           context.perform(
32397               actionAddEntity(node),
32398               actionAddEntity(way),
32399               actionAddVertex(way.id, node.id),
32400               actionClose(way.id)
32401           );
32402
32403           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32404       }
32405
32406
32407       function startFromWay(loc, edge) {
32408           var startGraph = context.graph();
32409           var node = osmNode({ loc: loc });
32410           var way = osmWay({ tags: defaultTags });
32411
32412           context.perform(
32413               actionAddEntity(node),
32414               actionAddEntity(way),
32415               actionAddVertex(way.id, node.id),
32416               actionClose(way.id),
32417               actionAddMidpoint({ loc: loc, edge: edge }, node)
32418           );
32419
32420           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32421       }
32422
32423
32424       function startFromNode(node) {
32425           var startGraph = context.graph();
32426           var way = osmWay({ tags: defaultTags });
32427
32428           context.perform(
32429               actionAddEntity(way),
32430               actionAddVertex(way.id, node.id),
32431               actionClose(way.id)
32432           );
32433
32434           context.enter(modeDrawArea(context, way.id, startGraph, context.graph()));
32435       }
32436
32437
32438       mode.enter = function() {
32439           context.install(behavior);
32440       };
32441
32442
32443       mode.exit = function() {
32444           context.uninstall(behavior);
32445       };
32446
32447
32448       return mode;
32449   }
32450
32451   function modeAddLine(context) {
32452       var mode = {
32453           id: 'add-line',
32454           button: 'line',
32455           title: t('modes.add_line.title'),
32456           description: t('modes.add_line.description'),
32457           key: '2'
32458       };
32459
32460       var behavior = behaviorAddWay(context)
32461           .tail(t('modes.add_line.tail'))
32462           .on('start', start)
32463           .on('startFromWay', startFromWay)
32464           .on('startFromNode', startFromNode);
32465
32466
32467       function start(loc) {
32468           var startGraph = context.graph();
32469           var node = osmNode({ loc: loc });
32470           var way = osmWay();
32471
32472           context.perform(
32473               actionAddEntity(node),
32474               actionAddEntity(way),
32475               actionAddVertex(way.id, node.id)
32476           );
32477
32478           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32479       }
32480
32481
32482       function startFromWay(loc, edge) {
32483           var startGraph = context.graph();
32484           var node = osmNode({ loc: loc });
32485           var way = osmWay();
32486
32487           context.perform(
32488               actionAddEntity(node),
32489               actionAddEntity(way),
32490               actionAddVertex(way.id, node.id),
32491               actionAddMidpoint({ loc: loc, edge: edge }, node)
32492           );
32493
32494           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32495       }
32496
32497
32498       function startFromNode(node) {
32499           var startGraph = context.graph();
32500           var way = osmWay();
32501
32502           context.perform(
32503               actionAddEntity(way),
32504               actionAddVertex(way.id, node.id)
32505           );
32506
32507           context.enter(modeDrawLine(context, way.id, startGraph, context.graph()));
32508       }
32509
32510
32511       mode.enter = function() {
32512           context.install(behavior);
32513       };
32514
32515
32516       mode.exit = function() {
32517           context.uninstall(behavior);
32518       };
32519
32520       return mode;
32521   }
32522
32523   function modeAddPoint(context) {
32524       var mode = {
32525           id: 'add-point',
32526           button: 'point',
32527           title: t('modes.add_point.title'),
32528           description: t('modes.add_point.description'),
32529           key: '1'
32530       };
32531
32532       var behavior = behaviorDraw(context)
32533           .tail(t('modes.add_point.tail'))
32534           .on('click', add)
32535           .on('clickWay', addWay)
32536           .on('clickNode', addNode)
32537           .on('cancel', cancel)
32538           .on('finish', cancel);
32539
32540
32541       function add(loc) {
32542           var node = osmNode({ loc: loc });
32543
32544           context.perform(
32545               actionAddEntity(node),
32546               t('operations.add.annotation.point')
32547           );
32548
32549           context.enter(
32550               modeSelect(context, [node.id]).newFeature(true)
32551           );
32552       }
32553
32554
32555       function addWay(loc, edge) {
32556           var node =  osmNode();
32557
32558           context.perform(
32559               actionAddMidpoint({loc: loc, edge: edge}, node),
32560               t('operations.add.annotation.vertex')
32561           );
32562
32563           context.enter(
32564               modeSelect(context, [node.id]).newFeature(true)
32565           );
32566       }
32567
32568
32569       function addNode(node) {
32570           add(node.loc);
32571       }
32572
32573
32574       function cancel() {
32575           context.enter(modeBrowse(context));
32576       }
32577
32578
32579       mode.enter = function() {
32580           context.install(behavior);
32581       };
32582
32583
32584       mode.exit = function() {
32585           context.uninstall(behavior);
32586       };
32587
32588
32589       return mode;
32590   }
32591
32592   var localizeStrings = {"this node":"this_node","this way":"this_way","this relation":"this_relation","this one-way":"this_oneway","this highway":"this_highway","this railway":"this_railway","this waterway":"this_waterway","this cycleway":"this_cycleway","this footpath":"this_footpath","this cycleway/footpath":"this_cycleway_footpath","this riverbank":"this_riverbank","this crossing":"this_crossing","this railway crossing":"this_railway_crossing","this bridge":"this_bridge","this tunnel":"this_tunnel","this boundary":"this_boundary","this turn-restriction":"this_turn_restriction","this roundabout":"this_roundabout","this mini-roundabout":"this_mini_roundabout","this track":"this_track","this feature":"this_feature",highway:"highway",railway:"railway",waterway:"waterway",cycleway:"cycleway",cycleway_footpath:"cycleway/footpath",riverbank:"riverbank",place_of_worship:"place_of_worship",pub:"pub",restaurant:"restaurant",school:"school",university:"university",hospital:"hospital",library:"library",theatre:"theatre",courthouse:"courthouse",bank:"bank",cinema:"cinema",pharmacy:"pharmacy",cafe:"cafe",fast_food:"fast_food",fuel:"fuel",from:"from",to:"to","left-hand":"left_hand","right-hand":"right_hand"};
32593   var errorTypes = {"20":{title:"multiple nodes on the same spot",severity:"warning",description:"There is more than one node in this spot. Offending node IDs: $1",IDs:["20"],regex:"IDs: ((?:#\\d+,?)+)"},"30":{title:"non-closed_areas",severity:"error",description:"This way is tagged with '$1' and should be closed-loop.",IDs:["this",""],regex:"(this way) is tagged with '(.+)'"},"40":{title:"dead-ended one-ways",severity:"error",description:"The first node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"41":{title:"",severity:"error",description:"The last node (id $1) of this one-way is not connected to any other way",IDs:["n","this"],regex:"\\(id (\\d+)\\) of (this one-way)"},"42":{title:"",severity:"error",description:"This node cannot be reached because one-ways only lead away from here",IDs:["this"],regex:"(this node)"},"43":{title:"",severity:"error",description:"You cannot escape from this node because one-ways only lead to here",IDs:["this"],regex:"(this node)"},"50":{title:"almost-junctions",severity:"error",description:"This node is very close but not connected to way #$1",IDs:["this","w"],regex:"(this node) is very close but not connected to way #(\\d+)"},"60":{title:"deprecated tags",severity:"warning",description:"This $1 uses deprecated tag $2. Please use $3 instead!",IDs:["this","",""],regex:"(this (?:node|way|relation)) uses deprecated tag '(.+)'\\. Please use &quot;(.+)&quot;"},"70":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"71":{title:"",severity:"error",description:"This way has no tags",IDs:["this"],regex:"(this way)"},"72":{title:"",severity:"error",description:"This node is not member of any way and does not have any tags",IDs:["this"],regex:"(this node)"},"73":{title:"",severity:"error",description:"This way has a $1 tag but no highway tag",IDs:["this",""],regex:"(this way) has a (.+) tag"},"74":{title:"missing tags",severity:"error",description:"This $1 has an empty tag: $2",IDs:["this",""],regex:"(this (?:node|way|relation)) has an empty tag: &quot;(.+)=&quot;"},"75":{description:"This (node|way|relation) has a name \\((.+)\\) but no other tag",IDs:["this",""],regex:"(this (?:node|way|relation)) has a name \\((.+)\\)"},"90":{title:"motorways without ref",severity:"error",description:"This way is tagged as motorway and therefore needs a ref nat_ref or int_ref tag",IDs:["this"],regex:"(this way)"},"100":{title:"places of worship without religion",severity:"error",description:"This $1 is tagged as place of worship and therefore needs a religion tag",IDs:["this"],regex:"(this (?:node|way|relation))"},"110":{title:"point of interest without name",severity:"error",description:"This node is tagged as $1 and therefore needs a name tag",IDs:["this",""],regex:"(this (?:node|way|relation)) is tagged as (.+) and"},"120":{title:"ways without nodes",severity:"error",description:"This way has just one single node",IDs:["this"],regex:"(this way)"},"130":{title:"floating islands",severity:"error",description:"This way is not connected to the rest of the map",IDs:["this"],regex:"(this way)"},"150":{title:"railway crossing without tag",severity:"error",description:"This crossing of a highway and a railway needs to be tagged as railway=crossing or railway=level_crossing",IDs:["this"],regex:"(this crossing)"},"160":{title:"wrongly used railway tag",severity:"error",description:"There are ways in different layers coming together in this railway crossing. There are ways tagged as tunnel or bridge coming together in this railway crossing",IDs:["this"],regex:"(this railway crossing)"},"170":{title:"FIXME tagged items",severity:"error",description:"This feature has a FIXME tag: (.*)",IDs:["this"],regex:"(this feature) has a FIXME tag: (.*)"},"180":{title:"relations without type",severity:"error",description:"This relation has no type tag which is mandatory for relations",IDs:["this"],regex:"(this relation)"},"190":{title:"intersections without junctions",severity:"error",description:"This $1 intersects the $2 #$3 but there is no junction node",IDs:["this","","w"],regex:"(this .+) intersects the (.+) #(\\d+)"},"200":{title:"overlapping ways",severity:"error",description:"This $1 overlaps the $2 #$3",IDs:["this","","w"],regex:"(this .+) overlaps the (.+) #(\\d+)"},"210":{title:"loopings",severity:"error",description:"These errors contain self intersecting ways"},"211":{title:"",severity:"error",description:"This way contains more than one node at least twice. Nodes are $1.",IDs:["this","211"],regex:"(this way) contains more than one node at least twice. Nodes are ((?:#\\d+(?:, )?)+)\\."},"212":{title:"",severity:"error",description:"This way has only two different nodes and contains one of them more than once",IDs:["this"],regex:"(this way)"},"220":{title:"misspelled tags",severity:"error",description:"This $1 is tagged '$2' where $3 looks like $4",regex:"(this (?:node|way|relation)) is tagged '(.+)' where &quot;(.+)&quot; looks like &quot;(.+)&quot;"},"221":{title:"",severity:"error",description:"The key of this $1's tag is 'key': $2",regex:"(this (?:node|way|relation))\\'s tag is \\'key\\': (.+)"},"230":{title:"layer conflicts",severity:"error",description:"This node is a junction of ways on different layers.",IDs:["this"],regex:"(this node)"},"231":{title:"mixed layers intersection",severity:"error",description:"This node is a junction of ways on different layers: $1",IDs:["this","231"],regex:"(this node) is a junction of ways on different layers: (.+)"},"232":{title:"strange layers",severity:"error",description:"This $1 is tagged with layer $2. This need not be an error, but it looks strange",IDs:["this",""],regex:"(this (?:bridge|tunnel)) is tagged with layer (-?\\d+)\\."},"270":{title:"motorways connected directly",severity:"error",description:"This node is a junction of a motorway and a highway other than motorway, motorway_link, trunk, rest_area or construction. Service or unclassified is only valid if it has access=no/private or it leads to a motorway service area or if it is a service=parking_aisle.",IDs:["this"],regex:"(this node)"},"280":{title:"boundaries",severity:"error",description:"Administrative Boundaries can be expressed either by tagging ways or by adding them to a relation. They should be closed-loop sequences of ways, they must not self-intersect or split and they must have a name and an admin_level."},"281":{title:"missing name",severity:"error",description:"This boundary has no name",IDs:["this"],regex:"(this boundary)"},"282":{title:"missing admin level",severity:"error",description:"The boundary of $1 has no (?:valid numeric)?admin_level",regex:"of (.+) has"},"283":{title:"no closed loop",severity:"error",description:"The boundary of $1 is not closed-loop",regex:"boundary of (.+) is"},"284":{title:"splitting boundary",severity:"error",description:"The boundary of $1 splits here",regex:"boundary of (.+) splits"},"285":{title:"admin_level too high",severity:"error",description:"This boundary-way has admin_level $1 but belongs to a relation with lower admin_level (higher priority); it should have the lowest admin_level of all relations",IDs:["this",""],regex:"(this boundary)-way has admin_level (-?\\d+) but"},"290":{title:"restrictions",severity:"error",description:"Analyses all relations tagged type=restriction or following variations type=restriction:hgv type=restriction:caravan type=restriction:motorcar type=restriction:bus type=restriction:agricultural type=restriction:motorcycle type=restriction:bicycle and type=restriction:hazmat"},"291":{title:"missing type",severity:"error",description:"This turn-restriction has no (?:known )?restriction type",IDs:["this"],regex:"(this turn-restriction) has"},"292":{title:"missing from way",severity:"error",description:"This turn-restriction needs exactly one from member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"293":{title:"missing to way",severity:"error",description:"This turn-restriction needs exactly one to member. This one has $1",IDs:["this",""],regex:"(this turn-restriction) needs.+has (\\d+)"},"294":{title:"from or to not a way",severity:"error",description:"From- and To-members of this turn-restriction need to be ways. $1",IDs:["this","294"],regex:"(this turn-restriction)~.+ways\\. ((?:(?:from|to) (?:node|relation) #\\d+,?)+)"},"295":{title:"via is not on the way ends",severity:"error",description:"via (node #$1) is not the first or the last member of (from|to) (way #$3)",IDs:["this","n","","w"],regex:"(this turn-restriction)~via \\(node #(\\d+)\\).+ of (from|to) \\(way #(\\d+)\\)"},"296":{title:"wrong restriction angle",severity:"error",description:"This turn-restriction type is $1, but angle is $2 degrees. Maybe the restriction type is not appropriate?",IDs:["this","",""],regex:"(this turn-restriction)~.+is (\\w+), but angle is (-?\\d+)"},"297":{title:"wrong direction of to member",severity:"error",description:"wrong direction of to way $1",IDs:["this","w"],regex:"(this turn-restriction)~.+to way (\\d+)"},"298":{title:"already restricted by oneway",severity:"error",description:"entry already prohibited by oneway tag on $1",IDs:["this","w"],regex:"(this turn-restriction)~.+tag on (\\d+)"},"300":{title:"missing maxspeed",severity:"warning",description:"This highway is missing a maxspeed tag",IDs:["this"],regex:"(this highway)"},"310":{title:"roundabouts",severity:"error",description:"Analyses ways with tag junction=roundabout. More then one way can form a roundabout. It supports tag oneway=-1"},"311":{title:"not closed loop",severity:"error",description:"This way is part of a roundabout but is not closed-loop. (split carriageways approaching a roundabout should not be tagged as roundabout)",IDs:["this"],regex:"(this way)"},"312":{title:"wrong direction",severity:"error",description:"If this ((?:mini_)?roundabout) is in a country with (left|right)-hand traffic then its orientation goes the wrong way around",IDs:["this",""],regex:"(this (?:mini_)?roundabout) is in a country with ((?:left|right)-hand)"},"313":{title:"faintly connected",severity:"error",description:"This roundabout has only $1 other roads connected. Roundabouts typically have three",IDs:["this",""],regex:"(this roundabout) has only (\\d) other"},"320":{title:"*_link connections",severity:"error",description:"This way is tagged as highway=$1_link but doesn't have a connection to any other $1 or $1_link",IDs:["this","","","",""],regex:"(this way) is tagged as (highway=.+) but doesn't have a connection to any other (.+) or (.+)"},"350":{title:"bridge-tags",severity:"error",description:"This bridge does not have a tag in common with its surrounding ways that shows the purpose of this bridge. There should be one of these tags: (.+)",NOTE:"Group can be arbitrary list of form: key=value,key=value,key=value...",IDs:["this",""],regex:"(this bridge).*tags: (.+)"},"360":{title:"language unknown",severity:"warning",description:"It would be nice if this (node|way|relation) had an additional tag 'name:XX=(.+)' where XX shows the language of its name '\\2'",IDs:["this",""],regex:"(this (?:node|way|relation)) had an additional tag 'name:XX=(.+)' where"},"370":{title:"doubled places",severity:"error",description:"This node has tags in common with the surrounding way #$1 ((?:\\(including the name '.+'\\) )?)and seems to be redundand",IDs:["this","w","370"],regex:"(this node) has tags in common with the surrounding way #(\\d+) ((?:\\(including the name '.+'\\) )?)and"},"380":{title:"non-physical use of sport-tag",severity:"error",description:"This way is tagged sport=$1 but has no physical tag like e.g. leisure, building, amenity or highway",IDs:["this",""],regex:"(this way) is tagged (sport=.+) but"},"390":{title:"missing tracktype",severity:"warning",description:"This track doesn''t have a tracktype",IDs:["this"],regex:"(this track)"},"400":{title:"geometry glitches",severity:"error",description:""},"401":{title:"missing turn restriction",severity:"error",description:"ways $1 and $2 join in a very sharp angle here and there is no oneway tag or turn restriction that prevents turning( from way (\\1|\\2) to (\\1|\\2))?",IDs:["w","w"],regex:"ways (\\d+) and (\\d+) join"},"402":{title:"impossible angles",severity:"error",description:"this way bends in a very sharp angle here",IDs:["this"],regex:"(this way)"},"410":{title:"website",severity:"error",description:"Web pages are analyzed. Web page is defined by any of the following tags website=* url=* website:mobile=* contact:website=* contact:url=* image=* source:website=* or source:url=*"},"411":{title:"http error",severity:"error",description:"The URL (<a target=_blank href=$1>$1</a>) cannot be opened (HTTP status code $2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ code (\\d+)\\)"},"412":{title:"domain hijacking",severity:"error",description:"Possible domain squatting: <a target=_blank href=$1>$1</a>. Suspicious text is: \"$2\"",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ is: &quot;(.+)&quot;"},"413":{title:"non-match",severity:"error",description:"Content of the URL (<a target=_blank href=$1>$1</a>) did not contain these keywords: ($2)",IDs:["this","url",""],regex:"(this feature)~.+ href=([^>]+)>.+ keywords: \\((.+)\\)"}};
32594
32595   var tiler = utilTiler();
32596   var dispatch$1 = dispatch('loaded');
32597
32598   var _krCache;
32599   var _krZoom = 14;
32600   var _krUrlRoot = 'https://www.keepright.at/';
32601
32602   var _krRuleset = [
32603       // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
32604       30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
32605       190, 191, 192, 193, 194, 195, 196, 197, 198,
32606       200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
32607       230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
32608       290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
32609       320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
32610   ];
32611
32612
32613   function abortRequest(i) {
32614       if (i) {
32615           i.abort();
32616       }
32617   }
32618
32619   function abortUnwantedRequests(cache, tiles) {
32620       forEach(cache.inflightTile, function(v, k) {
32621           var wanted = find$1(tiles, function(tile) {
32622               return k === tile.id;
32623           });
32624           if (!wanted) {
32625               abortRequest(v);
32626               delete cache.inflightTile[k];
32627           }
32628       });
32629   }
32630
32631
32632   function encodeErrorRtree(d) {
32633       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
32634   }
32635
32636
32637   // replace or remove error from rtree
32638   function updateRtree(item, replace) {
32639       _krCache.rtree.remove(item, function isEql(a, b) {
32640           return a.data.id === b.data.id;
32641       });
32642
32643       if (replace) {
32644           _krCache.rtree.insert(item);
32645       }
32646   }
32647
32648
32649   function tokenReplacements(d) {
32650       if (!(d instanceof qaError)) return;
32651
32652       var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
32653       var replacements = {};
32654
32655       var errorTemplate = errorTypes[d.which_type];
32656       if (!errorTemplate) {
32657           /* eslint-disable no-console */
32658           console.log('No Template: ', d.which_type);
32659           console.log('  ', d.description);
32660           /* eslint-enable no-console */
32661           return;
32662       }
32663
32664       // some descriptions are just fixed text
32665       if (!errorTemplate.regex) return;
32666
32667       // regex pattern should match description with variable details captured
32668       var errorRegex = new RegExp(errorTemplate.regex, 'i');
32669       var errorMatch = errorRegex.exec(d.description);
32670       if (!errorMatch) {
32671           /* eslint-disable no-console */
32672           console.log('Unmatched: ', d.which_type);
32673           console.log('  ', d.description);
32674           console.log('  ', errorRegex);
32675           /* eslint-enable no-console */
32676           return;
32677       }
32678
32679       for (var i = 1; i < errorMatch.length; i++) {   // skip first
32680           var capture = errorMatch[i];
32681           var idType;
32682
32683           idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
32684           if (idType && capture) {   // link IDs if present in the capture
32685               capture = parseError(capture, idType);
32686           } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
32687               capture = '\\' +  capture + '\\';
32688           } else {
32689               var compare = capture.toLowerCase();
32690               if (localizeStrings[compare]) {   // some replacement strings can be localized
32691                   capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
32692               }
32693           }
32694
32695           replacements['var' + i] = capture;
32696       }
32697
32698       return replacements;
32699   }
32700
32701
32702   function parseError(capture, idType) {
32703       var compare = capture.toLowerCase();
32704       if (localizeStrings[compare]) {   // some replacement strings can be localized
32705           capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
32706       }
32707
32708       switch (idType) {
32709           // link a string like "this node"
32710           case 'this':
32711               capture = linkErrorObject(capture);
32712               break;
32713
32714           case 'url':
32715               capture = linkURL(capture);
32716               break;
32717
32718           // link an entity ID
32719           case 'n':
32720           case 'w':
32721           case 'r':
32722               capture = linkEntity(idType + capture);
32723               break;
32724
32725           // some errors have more complex ID lists/variance
32726           case '20':
32727               capture = parse20(capture);
32728               break;
32729           case '211':
32730               capture = parse211(capture);
32731               break;
32732           case '231':
32733               capture = parse231(capture);
32734               break;
32735           case '294':
32736               capture = parse294(capture);
32737               break;
32738           case '370':
32739               capture = parse370(capture);
32740               break;
32741       }
32742
32743       return capture;
32744
32745
32746       function linkErrorObject(d) {
32747           return '<a class="error_object_link">' + d + '</a>';
32748       }
32749
32750       function linkEntity(d) {
32751           return '<a class="error_entity_link">' + d + '</a>';
32752       }
32753
32754       function linkURL(d) {
32755           return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
32756       }
32757
32758       // arbitrary node list of form: #ID, #ID, #ID...
32759       function parse211(capture) {
32760           var newList = [];
32761           var items = capture.split(', ');
32762
32763           items.forEach(function(item) {
32764               // ID has # at the front
32765               var id = linkEntity('n' + item.slice(1));
32766               newList.push(id);
32767           });
32768
32769           return newList.join(', ');
32770       }
32771
32772       // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
32773       function parse231(capture) {
32774           var newList = [];
32775           // unfortunately 'layer' can itself contain commas, so we split on '),'
32776           var items = capture.split('),');
32777
32778           items.forEach(function(item) {
32779               var match = item.match(/\#(\d+)\((.+)\)?/);
32780               if (match !== null && match.length > 2) {
32781                   newList.push(linkEntity('w' + match[1]) + ' ' +
32782                       t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
32783                   );
32784               }
32785           });
32786
32787           return newList.join(', ');
32788       }
32789
32790       // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
32791       function parse294(capture) {
32792           var newList = [];
32793           var items = capture.split(',');
32794
32795           items.forEach(function(item) {
32796               var role;
32797               var idType;
32798               var id;
32799
32800               // item of form "from/to node/relation #ID"
32801               item = item.split(' ');
32802
32803               // to/from role is more clear in quotes
32804               role = '"' + item[0] + '"';
32805
32806               // first letter of node/relation provides the type
32807               idType = item[1].slice(0,1);
32808
32809               // ID has # at the front
32810               id = item[2].slice(1);
32811               id = linkEntity(idType + id);
32812
32813               item = [role, item[1], id].join(' ');
32814               newList.push(item);
32815           });
32816
32817           return newList.join(', ');
32818       }
32819
32820       // may or may not include the string "(including the name 'name')"
32821       function parse370(capture) {
32822           if (!capture) return '';
32823
32824           var match = capture.match(/\(including the name (\'.+\')\)/);
32825           if (match !== null && match.length) {
32826               return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
32827           }
32828           return '';
32829       }
32830
32831       // arbitrary node list of form: #ID,#ID,#ID...
32832       function parse20(capture) {
32833           var newList = [];
32834           var items = capture.split(',');
32835
32836           items.forEach(function(item) {
32837               // ID has # at the front
32838               var id = linkEntity('n' + item.slice(1));
32839               newList.push(id);
32840           });
32841
32842           return newList.join(', ');
32843       }
32844   }
32845
32846
32847   var serviceKeepRight = {
32848       init: function() {
32849           if (!_krCache) {
32850               this.reset();
32851           }
32852
32853           this.event = utilRebind(this, dispatch$1, 'on');
32854       },
32855
32856       reset: function() {
32857           if (_krCache) {
32858               forEach(_krCache.inflightTile, abortRequest);
32859           }
32860           _krCache = {
32861               data: {},
32862               loadedTile: {},
32863               inflightTile: {},
32864               inflightPost: {},
32865               closed: {},
32866               rtree: rbush_1()
32867           };
32868       },
32869
32870
32871       // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
32872       loadErrors: function(projection) {
32873           var options = { format: 'geojson' };
32874           var rules = _krRuleset.join();
32875
32876           // determine the needed tiles to cover the view
32877           var tiles = tiler
32878               .zoomExtent([_krZoom, _krZoom])
32879               .getTiles(projection);
32880
32881           // abort inflight requests that are no longer needed
32882           abortUnwantedRequests(_krCache, tiles);
32883
32884           // issue new requests..
32885           tiles.forEach(function(tile) {
32886               if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
32887
32888               var rect = tile.extent.rectangle();
32889               var params = assignIn({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
32890               var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
32891
32892               _krCache.inflightTile[tile.id] = d3_json(url,
32893                   function(err, data) {
32894                       delete _krCache.inflightTile[tile.id];
32895
32896                       if (err) return;
32897                       _krCache.loadedTile[tile.id] = true;
32898
32899                       if (!data.features || !data.features.length) return;
32900
32901                       data.features.forEach(function(feature) {
32902                           var loc = feature.geometry.coordinates;
32903                           var props = feature.properties;
32904
32905                           // if there is a parent, save its error type e.g.:
32906                           //  Error 191 = "highway-highway"
32907                           //  Error 190 = "intersections without junctions"  (parent)
32908                           var errorType = props.error_type;
32909                           var errorTemplate = errorTypes[errorType];
32910                           var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
32911
32912                           // try to handle error type directly, fallback to parent error type.
32913                           var whichType = errorTemplate ? errorType : parentErrorType;
32914                           var whichTemplate = errorTypes[whichType];
32915
32916                           // Rewrite a few of the errors at this point..
32917                           // This is done to make them easier to linkify and translate.
32918                           switch (whichType) {
32919                               case '170':
32920                                   props.description = 'This feature has a FIXME tag: ' + props.description;
32921                                   break;
32922                               case '292':
32923                               case '293':
32924                                   props.description = props.description.replace('A turn-', 'This turn-');
32925                                   break;
32926                               case '294':
32927                               case '295':
32928                               case '296':
32929                               case '297':
32930                               case '298':
32931                                   props.description = 'This turn-restriction~' + props.description;
32932                                   break;
32933                               case '300':
32934                                   props.description = 'This highway is missing a maxspeed tag';
32935                                   break;
32936                               case '411':
32937                               case '412':
32938                               case '413':
32939                                   props.description = 'This feature~' + props.description;
32940                                   break;
32941                           }
32942
32943                           // - move markers slightly so it doesn't obscure the geometry,
32944                           // - then move markers away from other coincident markers
32945                           var coincident = false;
32946                           do {
32947                               // first time, move marker up. after that, move marker right.
32948                               var delta = coincident ? [0.00001, 0] : [0, 0.00001];
32949                               loc = geoVecAdd(loc, delta);
32950                               var bbox = geoExtent(loc).bbox();
32951                               coincident = _krCache.rtree.search(bbox).length;
32952                           } while (coincident);
32953
32954                           var d = new qaError({
32955                               // Required values
32956                               loc: loc,
32957                               service: 'keepRight',
32958                               error_type: errorType,
32959                               // Extra values for this service
32960                               id: props.error_id,
32961                               comment: props.comment || null,
32962                               description: props.description || '',
32963                               error_id: props.error_id,
32964                               which_type: whichType,
32965                               parent_error_type: parentErrorType,
32966                               severity: whichTemplate.severity || 'error',
32967                               object_id: props.object_id,
32968                               object_type: props.object_type,
32969                               schema: props.schema,
32970                               title: props.title
32971                           });
32972
32973                           d.replacements = tokenReplacements(d);
32974
32975                           _krCache.data[d.id] = d;
32976                           _krCache.rtree.insert(encodeErrorRtree(d));
32977                       });
32978
32979                       dispatch$1.call('loaded');
32980                   }
32981               );
32982           });
32983       },
32984
32985
32986       postKeepRightUpdate: function(d, callback) {
32987           if (_krCache.inflightPost[d.id]) {
32988               return callback({ message: 'Error update already inflight', status: -2 }, d);
32989           }
32990
32991           var that = this;
32992           var params = { schema: d.schema, id: d.error_id };
32993
32994           if (d.state) {
32995               params.st = d.state;
32996           }
32997           if (d.newComment !== undefined) {
32998               params.co = d.newComment;
32999           }
33000
33001           // NOTE: This throws a CORS err, but it seems successful.
33002           // We don't care too much about the response, so this is fine.
33003           var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
33004           _krCache.inflightPost[d.id] = request(url)
33005               .post(function(err) {
33006                   delete _krCache.inflightPost[d.id];
33007
33008                   if (d.state === 'ignore') {   // ignore permanently (false positive)
33009                       that.removeError(d);
33010
33011                   } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
33012                       that.removeError(d);
33013                       _krCache.closed[d.schema + ':' + d.error_id] = true;
33014
33015                   } else {
33016                       d = that.replaceError(d.update({
33017                           comment: d.newComment,
33018                           newComment: undefined,
33019                           state: undefined
33020                       }));
33021                   }
33022
33023                   return callback(err, d);
33024               });
33025
33026       },
33027
33028
33029       // get all cached errors covering the viewport
33030       getErrors: function(projection) {
33031           var viewport = projection.clipExtent();
33032           var min = [viewport[0][0], viewport[1][1]];
33033           var max = [viewport[1][0], viewport[0][1]];
33034           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
33035
33036           return _krCache.rtree.search(bbox).map(function(d) {
33037               return d.data;
33038           });
33039       },
33040
33041
33042       // get a single error from the cache
33043       getError: function(id) {
33044           return _krCache.data[id];
33045       },
33046
33047
33048       // replace a single error in the cache
33049       replaceError: function(error) {
33050           if (!(error instanceof qaError) || !error.id) return;
33051
33052           _krCache.data[error.id] = error;
33053           updateRtree(encodeErrorRtree(error), true); // true = replace
33054           return error;
33055       },
33056
33057
33058       // remove a single error from the cache
33059       removeError: function(error) {
33060           if (!(error instanceof qaError) || !error.id) return;
33061
33062           delete _krCache.data[error.id];
33063           updateRtree(encodeErrorRtree(error), false); // false = remove
33064       },
33065
33066
33067       errorURL: function(error) {
33068           return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
33069       },
33070
33071
33072       // Get an array of errors closed during this session.
33073       // Used to populate `closed:keepright` changeset tag
33074       getClosedIDs: function() {
33075           return Object.keys(_krCache.closed).sort();
33076       }
33077
33078   };
33079
33080   var tiler$1 = utilTiler();
33081   var dispatch$2 = dispatch('loaded');
33082
33083   var _erCache;
33084   var _erZoom = 14;
33085
33086   var _impOsmUrls = {
33087       ow: 'https://directionofflow.skobbler.net/directionOfFlowService',
33088       mr: 'https://missingroads.skobbler.net/missingGeoService',
33089       tr: 'https://turnrestrictionservice.skobbler.net/turnRestrictionService'
33090   };
33091
33092   function abortRequest$1(i) {
33093       forEach(i, function(v) {
33094           if (v) {
33095               v.abort();
33096           }
33097       });
33098   }
33099
33100   function abortUnwantedRequests$1(cache, tiles) {
33101       forEach(cache.inflightTile, function(v, k) {
33102           var wanted = find$1(tiles, function(tile) {
33103               return k === tile.id;
33104           });
33105           if (!wanted) {
33106               abortRequest$1(v);
33107               delete cache.inflightTile[k];
33108           }
33109       });
33110   }
33111
33112
33113   function encodeErrorRtree$1(d) {
33114       return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
33115   }
33116
33117
33118   // replace or remove error from rtree
33119   function updateRtree$1(item, replace) {
33120       _erCache.rtree.remove(item, function isEql(a, b) {
33121           return a.data.id === b.data.id;
33122       });
33123
33124       if (replace) {
33125           _erCache.rtree.insert(item);
33126       }
33127   }
33128
33129   function linkErrorObject(d) {
33130       return '<a class="error_object_link">' + d + '</a>';
33131   }
33132
33133   function linkEntity(d) {
33134       return '<a class="error_entity_link">' + d + '</a>';
33135   }
33136
33137   function pointAverage(points) {
33138       var x = 0;
33139       var y = 0;
33140
33141       forEach(points, function(v) {
33142           x += v.lon;
33143           y += v.lat;
33144       });
33145
33146       x /= points.length;
33147       y /= points.length;
33148
33149       return [x, y];
33150   }
33151
33152   function relativeBearing(p1, p2) {
33153       var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
33154       if (angle < 0) {
33155           angle += 2 * Math.PI;
33156       }
33157
33158       // Return degrees
33159       return angle * 180 / Math.PI;
33160   }
33161
33162   // Assuming range [0,360)
33163   function cardinalDirection(bearing) {
33164       var dir = 45 * Math.round(bearing / 45);
33165       var compass = {
33166           0: 'north',
33167           45: 'northeast',
33168           90: 'east',
33169           135: 'southeast',
33170           180: 'south',
33171           225: 'southwest',
33172           270: 'west',
33173           315: 'northwest',
33174           360: 'north'
33175       };
33176
33177       return t('QA.improveOSM.directions.' + compass[dir]);
33178   }
33179
33180   // Errors shouldn't obscure eachother
33181   function preventCoincident(loc, bumpUp) {
33182       var coincident = false;
33183       do {
33184           // first time, move marker up. after that, move marker right.
33185           var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
33186           loc = geoVecAdd(loc, delta);
33187           var bbox = geoExtent(loc).bbox();
33188           coincident = _erCache.rtree.search(bbox).length;
33189       } while (coincident);
33190
33191       return loc;
33192   }
33193
33194   var serviceImproveOSM = {
33195       init: function() {
33196           if (!_erCache) {
33197               this.reset();
33198           }
33199
33200           this.event = utilRebind(this, dispatch$2, 'on');
33201       },
33202
33203       reset: function() {
33204           if (_erCache) {
33205               forEach(_erCache.inflightTile, abortRequest$1);
33206           }
33207           _erCache = {
33208               data: {},
33209               loadedTile: {},
33210               inflightTile: {},
33211               inflightPost: {},
33212               closed: {},
33213               rtree: rbush_1()
33214           };
33215       },
33216
33217       loadErrors: function(projection) {
33218           var options = {
33219               client: 'iD',
33220               status: 'OPEN',
33221               zoom: '19' // Use a high zoom so that clusters aren't returned
33222           };
33223
33224           // determine the needed tiles to cover the view
33225           var tiles = tiler$1
33226               .zoomExtent([_erZoom, _erZoom])
33227               .getTiles(projection);
33228
33229           // abort inflight requests that are no longer needed
33230           abortUnwantedRequests$1(_erCache, tiles);
33231
33232           // issue new requests..
33233           tiles.forEach(function(tile) {
33234               if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
33235
33236               var rect = tile.extent.rectangle();
33237               var params = assignIn({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
33238
33239               // 3 separate requests to store for each tile
33240               var requests = {};
33241
33242               forEach(_impOsmUrls, function(v, k) {
33243                   // We exclude WATER from missing geometry as it doesn't seem useful
33244                   // We use most confident one-way and turn restrictions only, still have false positives
33245                   var kParams = assignIn({}, params, (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' });
33246                   var url = v + '/search?' + utilQsString(kParams);
33247
33248                   requests[k] = d3_json(url,
33249                       function(err, data) {
33250                           delete _erCache.inflightTile[tile.id];
33251
33252                           if (err) return;
33253                           _erCache.loadedTile[tile.id] = true;
33254
33255                           // Road segments at high zoom == oneways
33256                           if (data.roadSegments) {
33257                               data.roadSegments.forEach(function(feature) {
33258                                   // Position error at the approximate middle of the segment
33259                                   var points = feature.points;
33260                                   var mid = points.length / 2;
33261                                   var loc;
33262
33263                                   // Even number of points, find midpoint of the middle two
33264                                   // Odd number of points, use position of very middle point
33265                                   if (mid % 1 === 0) {
33266                                       loc = pointAverage([points[mid - 1], points[mid]]);
33267                                   } else {
33268                                       mid = points[Math.floor(mid)];
33269                                       loc = [mid.lon, mid.lat];
33270                                   }
33271
33272                                   // One-ways can land on same segment in opposite direction
33273                                   loc = preventCoincident(loc, false);
33274
33275                                   var d = new qaError({
33276                                       // Info required for every error
33277                                       loc: loc,
33278                                       service: 'improveOSM',
33279                                       error_type: k,
33280                                       // Extra details needed for this service
33281                                       error_key: k,
33282                                       identifier: { // this is used to post changes to the error
33283                                           wayId: feature.wayId,
33284                                           fromNodeId: feature.fromNodeId,
33285                                           toNodeId: feature.toNodeId
33286                                       },
33287                                       object_id: feature.wayId,
33288                                       object_type: 'way',
33289                                       status: feature.status
33290                                   });
33291
33292                                   // Variables used in the description
33293                                   d.replacements = {
33294                                       percentage: feature.percentOfTrips,
33295                                       num_trips: feature.numberOfTrips,
33296                                       highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
33297                                       from_node: linkEntity('n' + feature.fromNodeId),
33298                                       to_node: linkEntity('n' + feature.toNodeId)
33299                                   };
33300
33301                                   _erCache.data[d.id] = d;
33302                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33303                               });
33304                           }
33305
33306                           // Tiles at high zoom == missing roads
33307                           if (data.tiles) {
33308                               data.tiles.forEach(function(feature) {
33309                                   var geoType = feature.type.toLowerCase();
33310
33311                                   // Average of recorded points should land on the missing geometry
33312                                   // Missing geometry could happen to land on another error
33313                                   var loc = pointAverage(feature.points);
33314                                   loc = preventCoincident(loc, false);
33315
33316                                   var d = new qaError({
33317                                       // Info required for every error
33318                                       loc: loc,
33319                                       service: 'improveOSM',
33320                                       error_type: k + '-' + geoType,
33321                                       // Extra details needed for this service
33322                                       error_key: k,
33323                                       identifier: { x: feature.x, y: feature.y },
33324                                       status: feature.status
33325                                   });
33326
33327                                   d.replacements = {
33328                                       num_trips: feature.numberOfTrips,
33329                                       geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
33330                                   };
33331
33332                                   // -1 trips indicates data came from a 3rd party
33333                                   if (feature.numberOfTrips === -1) {
33334                                       d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
33335                                   }
33336
33337                                   _erCache.data[d.id] = d;
33338                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33339                               });
33340                           }
33341
33342                           // Entities at high zoom == turn restrictions
33343                           if (data.entities) {
33344                               data.entities.forEach(function(feature) {
33345                                   // Turn restrictions could be missing at same junction
33346                                   // We also want to bump the error up so node is accessible
33347                                   var loc = feature.point;
33348                                   loc = preventCoincident([loc.lon, loc.lat], true);
33349
33350                                   // Elements are presented in a strange way
33351                                   var ids = feature.id.split(',');
33352                                   var from_way = ids[0];
33353                                   var via_node = ids[3];
33354                                   var to_way = ids[2].split(':')[1];
33355
33356                                   var d = new qaError({
33357                                       // Info required for every error
33358                                       loc: loc,
33359                                       service: 'improveOSM',
33360                                       error_type: k,
33361                                       // Extra details needed for this service
33362                                       error_key: k,
33363                                       identifier: feature.id,
33364                                       object_id: via_node,
33365                                       object_type: 'node',
33366                                       status: feature.status
33367                                   });
33368
33369                                   // Travel direction along from_way clarifies the turn restriction
33370                                   var p1 = feature.segments[0].points[0];
33371                                   var p2 = feature.segments[0].points[1];
33372
33373                                   var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
33374
33375                                   // Variables used in the description
33376                                   d.replacements = {
33377                                       num_passed: feature.numberOfPasses,
33378                                       num_trips: feature.segments[0].numberOfTrips,
33379                                       turn_restriction: feature.turnType.toLowerCase(),
33380                                       from_way: linkEntity('w' + from_way),
33381                                       to_way: linkEntity('w' + to_way),
33382                                       travel_direction: dir_of_travel,
33383                                       junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
33384                                   };
33385
33386                                   _erCache.data[d.id] = d;
33387                                   _erCache.rtree.insert(encodeErrorRtree$1(d));
33388                               });
33389                           }
33390                       }
33391                   );
33392               });
33393
33394               _erCache.inflightTile[tile.id] = requests;
33395               dispatch$2.call('loaded');
33396           });
33397       },
33398
33399       getComments: function(d, callback) {
33400           // If comments already retrieved no need to do so again
33401           if (d.comments !== undefined) { return callback({}, d); }
33402
33403           var key = d.error_key;
33404           var qParams = {};
33405
33406           if (key === 'ow') {
33407               qParams = d.identifier;
33408           } else if (key === 'mr') {
33409               qParams.tileX = d.identifier.x;
33410               qParams.tileY = d.identifier.y;
33411           } else if (key === 'tr') {
33412               qParams.targetId = d.identifier;
33413           }
33414
33415           var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
33416
33417           var that = this;
33418           d3_json(url, function(err, data) {
33419               // comments are served newest to oldest
33420               var comments = data.comments ? data.comments.reverse() : [];
33421
33422               that.replaceError(d.update({
33423                   comments: comments
33424               }));
33425               return callback(err, d);
33426           });
33427       },
33428
33429       postUpdate: function(d, callback) {
33430           if (!services.osm.authenticated()) { // Username required in payload
33431               return callback({ message: 'Not Authenticated', status: -3}, d);
33432           }
33433           if (_erCache.inflightPost[d.id]) {
33434               return callback({ message: 'Error update already inflight', status: -2 }, d);
33435           }
33436
33437           var that = this;
33438
33439           // Payload can only be sent once username is established
33440           services.osm.userDetails(sendPayload);
33441
33442           function sendPayload(err, user) {
33443               if (err) { return callback(err, d); }
33444
33445               var key = d.error_key;
33446               var url = _impOsmUrls[key] + '/comment';
33447               var payload = {
33448                   username: user.display_name
33449               };
33450
33451               // Each error type has different data for identification
33452               if (key === 'ow') {
33453                   payload.roadSegments = [ d.identifier ];
33454               } else if (key === 'mr') {
33455                   payload.tiles = [ d.identifier ];
33456               } else if (key === 'tr') {
33457                   payload.targetIds = [ d.identifier ];
33458               }
33459
33460               if (d.newStatus !== undefined) {
33461                   payload.status = d.newStatus;
33462                   payload.text = 'status changed';
33463               }
33464
33465               // Comment take place of default text
33466               if (d.newComment !== undefined) {
33467                   payload.text = d.newComment;
33468               }
33469
33470               _erCache.inflightPost[d.id] = request(url)
33471                   .header('Content-Type', 'application/json')
33472                   .post(JSON.stringify(payload), function(err) {
33473                       delete _erCache.inflightPost[d.id];
33474
33475                       // Unsuccessful response status, keep issue open
33476                       if (err.status !== 200) { return callback(err, d); }
33477
33478                       // Just a comment, update error in cache
33479                       if (d.newStatus === undefined) {
33480                           var now = new Date();
33481                           var comments = d.comments ? d.comments : [];
33482
33483                           comments.push({
33484                               username: payload.username,
33485                               text: payload.text,
33486                               timestamp: now.getTime() / 1000
33487                           });
33488
33489                           that.replaceError(d.update({
33490                               comments: comments,
33491                               newComment: undefined
33492                           }));
33493                       } else {
33494                           that.removeError(d);
33495
33496                           if (d.newStatus === 'SOLVED') {
33497                               // No pretty identifier, so we just use coordinates
33498                               var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
33499                               _erCache.closed[key + ':' + closedID] = true;
33500                           }
33501                       }
33502
33503                       return callback(err, d);
33504                   });
33505           }
33506       },
33507
33508       // get all cached errors covering the viewport
33509       getErrors: function(projection) {
33510           var viewport = projection.clipExtent();
33511           var min = [viewport[0][0], viewport[1][1]];
33512           var max = [viewport[1][0], viewport[0][1]];
33513           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
33514
33515           return _erCache.rtree.search(bbox).map(function(d) {
33516               return d.data;
33517           });
33518       },
33519
33520       // get a single error from the cache
33521       getError: function(id) {
33522           return _erCache.data[id];
33523       },
33524
33525       // replace a single error in the cache
33526       replaceError: function(error) {
33527           if (!(error instanceof qaError) || !error.id) return;
33528
33529           _erCache.data[error.id] = error;
33530           updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
33531           return error;
33532       },
33533
33534       // remove a single error from the cache
33535       removeError: function(error) {
33536           if (!(error instanceof qaError) || !error.id) return;
33537
33538           delete _erCache.data[error.id];
33539           updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
33540       },
33541
33542       // Used to populate `closed:improveosm` changeset tag
33543       getClosedIDs: function() {
33544           return Object.keys(_erCache.closed).sort();
33545       }
33546   };
33547
33548   function svgAreas(projection, context) {
33549       // Patterns only work in Firefox when set directly on element.
33550       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
33551       var patterns = {
33552           // tag - pattern name
33553           // -or-
33554           // tag - value - pattern name
33555           // -or-
33556           // tag - value - rules (optional tag-values, pattern name)
33557           // (matches earlier rules first, so fallback should be last entry)
33558           amenity: {
33559               grave_yard: 'cemetery',
33560               fountain: 'water_standing'
33561           },
33562           landuse: {
33563               cemetery: [
33564                   { religion: 'christian', pattern: 'cemetery_christian' },
33565                   { religion: 'buddhist', pattern: 'cemetery_buddhist' },
33566                   { religion: 'muslim', pattern: 'cemetery_muslim' },
33567                   { religion: 'jewish', pattern: 'cemetery_jewish' },
33568                   { pattern: 'cemetery' }
33569               ],
33570               construction: 'construction',
33571               farmland: 'farmland',
33572               farmyard: 'farmyard',
33573               forest: [
33574                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
33575                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
33576                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
33577                   { pattern: 'forest' } // same as 'leaf_type:mixed'
33578               ],
33579               grave_yard: 'cemetery',
33580               grass: 'grass',
33581               landfill: 'landfill',
33582               meadow: 'meadow',
33583               military: 'construction',
33584               orchard: 'orchard',
33585               reservoir: 'water_standing',
33586               quarry: 'quarry',
33587               vineyard: 'vineyard'
33588           },
33589           natural: {
33590               beach: 'beach',
33591               grassland: 'grass',
33592               sand: 'beach',
33593               scrub: 'scrub',
33594               water: [
33595                   { water: 'pond', pattern: 'pond' },
33596                   { water: 'reservoir', pattern: 'water_standing' },
33597                   { pattern: 'waves' }
33598               ],
33599               wetland: [
33600                   { wetland: 'marsh', pattern: 'wetland_marsh' },
33601                   { wetland: 'swamp', pattern: 'wetland_swamp' },
33602                   { wetland: 'bog', pattern: 'wetland_bog' },
33603                   { wetland: 'reedbed', pattern: 'wetland_reedbed' },
33604                   { pattern: 'wetland' }
33605               ],
33606               wood: [
33607                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
33608                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
33609                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
33610                   { pattern: 'forest' } // same as 'leaf_type:mixed'
33611               ]
33612           },
33613           traffic_calming: {
33614               island: [
33615                   { surface: 'grass', pattern: 'grass' },
33616               ],
33617               chicane: [
33618                   { surface: 'grass', pattern: 'grass' },
33619               ],
33620               choker: [
33621                   { surface: 'grass', pattern: 'grass' },
33622               ]
33623           }
33624       };
33625
33626       function setPattern(entity) {
33627           // Skip pattern filling if this is a building (buildings don't get patterns applied)
33628           if (entity.tags.building && entity.tags.building !== 'no') {
33629               this.style.fill = this.style.stroke = '';
33630               return;
33631           }
33632
33633           for (var tag in patterns) {
33634               var entityValue = entity.tags[tag];
33635               if (!entityValue) continue;
33636
33637               if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
33638                   this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
33639                   return;
33640               } else {
33641                   var values = patterns[tag];
33642                   for (var value in values) {
33643                       if (entityValue !== value) continue;
33644
33645                       var rules = values[value];
33646                       if (typeof rules === 'string') { // short syntax - pattern name
33647                           this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
33648                           return;
33649                       } else { // long syntax - rule array
33650                           for (var ruleKey in rules) {
33651                               var rule = rules[ruleKey];
33652
33653                               var pass = true;
33654                               for (var criterion in rule) {
33655                                   if (criterion !== 'pattern') { // reserved for pattern name
33656                                       // The only rule is a required tag-value pair
33657                                       var v = entity.tags[criterion];
33658                                       if (!v || v !== rule[criterion]) {
33659                                           pass = false;
33660                                           break;
33661                                       }
33662                                   }
33663                               }
33664
33665                               if (pass) {
33666                                   this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
33667                                   return;
33668                               }
33669                           }
33670                       }
33671                   }
33672               }
33673           }
33674
33675           this.style.fill = this.style.stroke = '';
33676       }
33677
33678
33679       function drawTargets(selection, graph, entities, filter) {
33680           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
33681           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
33682           var getPath = svgPath(projection).geojson;
33683           var activeID = context.activeID();
33684
33685           // The targets and nopes will be MultiLineString sub-segments of the ways
33686           var data = { targets: [], nopes: [] };
33687
33688           entities.forEach(function(way) {
33689               var features = svgSegmentWay(way, graph, activeID);
33690               data.targets.push.apply(data.targets, features.passive);
33691               data.nopes.push.apply(data.nopes, features.active);
33692           });
33693
33694
33695           // Targets allow hover and vertex snapping
33696           var targetData = data.targets.filter(getPath);
33697           var targets = selection.selectAll('.area.target-allowed')
33698               .filter(function(d) { return filter(d.properties.entity); })
33699               .data(targetData, function key(d) { return d.id; });
33700
33701           // exit
33702           targets.exit()
33703               .remove();
33704
33705           // enter/update
33706           targets.enter()
33707               .append('path')
33708               .merge(targets)
33709               .attr('d', getPath)
33710               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
33711
33712
33713           // NOPE
33714           var nopeData = data.nopes.filter(getPath);
33715           var nopes = selection.selectAll('.area.target-nope')
33716               .filter(function(d) { return filter(d.properties.entity); })
33717               .data(nopeData, function key(d) { return d.id; });
33718
33719           // exit
33720           nopes.exit()
33721               .remove();
33722
33723           // enter/update
33724           nopes.enter()
33725               .append('path')
33726               .merge(nopes)
33727               .attr('d', getPath)
33728               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
33729       }
33730
33731
33732       function drawAreas(selection, graph, entities, filter) {
33733           var path = svgPath(projection, graph, true);
33734           var areas = {};
33735           var multipolygon;
33736
33737           for (var i = 0; i < entities.length; i++) {
33738               var entity = entities[i];
33739               if (entity.geometry(graph) !== 'area') continue;
33740
33741               multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
33742               if (multipolygon) {
33743                   areas[multipolygon.id] = {
33744                       entity: multipolygon.mergeTags(entity.tags),
33745                       area: Math.abs(entity.area(graph))
33746                   };
33747               } else if (!areas[entity.id]) {
33748                   areas[entity.id] = {
33749                       entity: entity,
33750                       area: Math.abs(entity.area(graph))
33751                   };
33752               }
33753           }
33754
33755           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
33756           areas.sort(function areaSort(a, b) { return b.area - a.area; });
33757           areas = map$3(areas, 'entity');
33758
33759           var strokes = areas.filter(function(area) {
33760               return area.type === 'way';
33761           });
33762
33763           var data = {
33764               clip: areas,
33765               shadow: strokes,
33766               stroke: strokes,
33767               fill: areas
33768           };
33769
33770           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
33771              .filter(filter)
33772              .data(data.clip, osmEntity.key);
33773
33774           clipPaths.exit()
33775              .remove();
33776
33777           var clipPathsEnter = clipPaths.enter()
33778              .append('clipPath')
33779              .attr('class', 'clipPath-osm')
33780              .attr('id', function(entity) { return entity.id + '-clippath'; });
33781
33782           clipPathsEnter
33783              .append('path');
33784
33785           clipPaths.merge(clipPathsEnter)
33786              .selectAll('path')
33787              .attr('d', path);
33788
33789
33790           var drawLayer = selection.selectAll('.layer-osm.areas');
33791           var touchLayer = selection.selectAll('.layer-touch.areas');
33792
33793           // Draw areas..
33794           var areagroup = drawLayer
33795               .selectAll('g.areagroup')
33796               .data(['fill', 'shadow', 'stroke']);
33797
33798           areagroup = areagroup.enter()
33799               .append('g')
33800               .attr('class', function(d) { return 'areagroup area-' + d; })
33801               .merge(areagroup);
33802
33803           var paths = areagroup
33804               .selectAll('path')
33805               .filter(filter)
33806               .data(function(layer) { return data[layer]; }, osmEntity.key);
33807
33808           paths.exit()
33809               .remove();
33810
33811           var fills = selection.selectAll('.area-fill path.area').nodes();
33812
33813           var bisect = bisector(function(node) {
33814               return -node.__data__.area(graph);
33815           }).left;
33816
33817           function sortedByArea(entity) {
33818               if (this._parent.__data__ === 'fill') {
33819                   return fills[bisect(fills, -entity.area(graph))];
33820               }
33821           }
33822
33823           paths = paths.enter()
33824               .insert('path', sortedByArea)
33825               .merge(paths)
33826               .each(function(entity) {
33827                   var layer = this.parentNode.__data__;
33828                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
33829
33830                   if (layer === 'fill') {
33831                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
33832                       setPattern.call(this, entity);
33833                   }
33834               })
33835               .call(svgTagClasses())
33836               .attr('d', path);
33837
33838
33839           // Draw touch targets..
33840           touchLayer
33841               .call(drawTargets, graph, data.stroke, filter);
33842       }
33843
33844       return drawAreas;
33845   }
33846
33847   /**
33848    * A specialized version of `_.reduce` for arrays without support for
33849    * iteratee shorthands.
33850    *
33851    * @private
33852    * @param {Array} [array] The array to iterate over.
33853    * @param {Function} iteratee The function invoked per iteration.
33854    * @param {*} [accumulator] The initial value.
33855    * @param {boolean} [initAccum] Specify using the first element of `array` as
33856    *  the initial value.
33857    * @returns {*} Returns the accumulated value.
33858    */
33859   function arrayReduce(array, iteratee, accumulator, initAccum) {
33860     var index = -1,
33861         length = array == null ? 0 : array.length;
33862
33863     if (initAccum && length) {
33864       accumulator = array[++index];
33865     }
33866     while (++index < length) {
33867       accumulator = iteratee(accumulator, array[index], index, array);
33868     }
33869     return accumulator;
33870   }
33871
33872   /**
33873    * The base implementation of `_.reduce` and `_.reduceRight`, without support
33874    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
33875    *
33876    * @private
33877    * @param {Array|Object} collection The collection to iterate over.
33878    * @param {Function} iteratee The function invoked per iteration.
33879    * @param {*} accumulator The initial value.
33880    * @param {boolean} initAccum Specify using the first or last element of
33881    *  `collection` as the initial value.
33882    * @param {Function} eachFunc The function to iterate over `collection`.
33883    * @returns {*} Returns the accumulated value.
33884    */
33885   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
33886     eachFunc(collection, function(value, index, collection) {
33887       accumulator = initAccum
33888         ? (initAccum = false, value)
33889         : iteratee(accumulator, value, index, collection);
33890     });
33891     return accumulator;
33892   }
33893
33894   /**
33895    * Reduces `collection` to a value which is the accumulated result of running
33896    * each element in `collection` thru `iteratee`, where each successive
33897    * invocation is supplied the return value of the previous. If `accumulator`
33898    * is not given, the first element of `collection` is used as the initial
33899    * value. The iteratee is invoked with four arguments:
33900    * (accumulator, value, index|key, collection).
33901    *
33902    * Many lodash methods are guarded to work as iteratees for methods like
33903    * `_.reduce`, `_.reduceRight`, and `_.transform`.
33904    *
33905    * The guarded methods are:
33906    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
33907    * and `sortBy`
33908    *
33909    * @static
33910    * @memberOf _
33911    * @since 0.1.0
33912    * @category Collection
33913    * @param {Array|Object} collection The collection to iterate over.
33914    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
33915    * @param {*} [accumulator] The initial value.
33916    * @returns {*} Returns the accumulated value.
33917    * @see _.reduceRight
33918    * @example
33919    *
33920    * _.reduce([1, 2], function(sum, n) {
33921    *   return sum + n;
33922    * }, 0);
33923    * // => 3
33924    *
33925    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
33926    *   (result[value] || (result[value] = [])).push(key);
33927    *   return result;
33928    * }, {});
33929    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
33930    */
33931   function reduce(collection, iteratee, accumulator) {
33932     var func = isArray(collection) ? arrayReduce : baseReduce,
33933         initAccum = arguments.length < 3;
33934
33935     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
33936   }
33937
33938   /** Error message constants. */
33939   var FUNC_ERROR_TEXT$3 = 'Expected a function';
33940
33941   /**
33942    * Creates a throttled function that only invokes `func` at most once per
33943    * every `wait` milliseconds. The throttled function comes with a `cancel`
33944    * method to cancel delayed `func` invocations and a `flush` method to
33945    * immediately invoke them. Provide `options` to indicate whether `func`
33946    * should be invoked on the leading and/or trailing edge of the `wait`
33947    * timeout. The `func` is invoked with the last arguments provided to the
33948    * throttled function. Subsequent calls to the throttled function return the
33949    * result of the last `func` invocation.
33950    *
33951    * **Note:** If `leading` and `trailing` options are `true`, `func` is
33952    * invoked on the trailing edge of the timeout only if the throttled function
33953    * is invoked more than once during the `wait` timeout.
33954    *
33955    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
33956    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
33957    *
33958    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
33959    * for details over the differences between `_.throttle` and `_.debounce`.
33960    *
33961    * @static
33962    * @memberOf _
33963    * @since 0.1.0
33964    * @category Function
33965    * @param {Function} func The function to throttle.
33966    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
33967    * @param {Object} [options={}] The options object.
33968    * @param {boolean} [options.leading=true]
33969    *  Specify invoking on the leading edge of the timeout.
33970    * @param {boolean} [options.trailing=true]
33971    *  Specify invoking on the trailing edge of the timeout.
33972    * @returns {Function} Returns the new throttled function.
33973    * @example
33974    *
33975    * // Avoid excessively updating the position while scrolling.
33976    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
33977    *
33978    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
33979    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
33980    * jQuery(element).on('click', throttled);
33981    *
33982    * // Cancel the trailing throttled invocation.
33983    * jQuery(window).on('popstate', throttled.cancel);
33984    */
33985   function throttle(func, wait, options) {
33986     var leading = true,
33987         trailing = true;
33988
33989     if (typeof func != 'function') {
33990       throw new TypeError(FUNC_ERROR_TEXT$3);
33991     }
33992     if (isObject(options)) {
33993       leading = 'leading' in options ? !!options.leading : leading;
33994       trailing = 'trailing' in options ? !!options.trailing : trailing;
33995     }
33996     return debounce(func, wait, {
33997       'leading': leading,
33998       'maxWait': wait,
33999       'trailing': trailing
34000     });
34001   }
34002
34003   var fastJsonStableStringify = function (data, opts) {
34004       if (!opts) opts = {};
34005       if (typeof opts === 'function') opts = { cmp: opts };
34006       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
34007
34008       var cmp = opts.cmp && (function (f) {
34009           return function (node) {
34010               return function (a, b) {
34011                   var aobj = { key: a, value: node[a] };
34012                   var bobj = { key: b, value: node[b] };
34013                   return f(aobj, bobj);
34014               };
34015           };
34016       })(opts.cmp);
34017
34018       var seen = [];
34019       return (function stringify (node) {
34020           if (node && node.toJSON && typeof node.toJSON === 'function') {
34021               node = node.toJSON();
34022           }
34023
34024           if (node === undefined) return;
34025           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
34026           if (typeof node !== 'object') return JSON.stringify(node);
34027
34028           var i, out;
34029           if (Array.isArray(node)) {
34030               out = '[';
34031               for (i = 0; i < node.length; i++) {
34032                   if (i) out += ',';
34033                   out += stringify(node[i]) || 'null';
34034               }
34035               return out + ']';
34036           }
34037
34038           if (node === null) return 'null';
34039
34040           if (seen.indexOf(node) !== -1) {
34041               if (cycles) return JSON.stringify('__cycle__');
34042               throw new TypeError('Converting circular structure to JSON');
34043           }
34044
34045           var seenIndex = seen.push(node) - 1;
34046           var keys = Object.keys(node).sort(cmp && cmp(node));
34047           out = '';
34048           for (i = 0; i < keys.length; i++) {
34049               var key = keys[i];
34050               var value = stringify(node[key]);
34051
34052               if (!value) continue;
34053               if (out) out += ',';
34054               out += JSON.stringify(key) + ':' + value;
34055           }
34056           seen.splice(seenIndex, 1);
34057           return '{' + out + '}';
34058       })(data);
34059   };
34060
34061   //[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]
34062   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
34063   //[5]         Name       ::=          NameStartChar (NameChar)*
34064   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
34065   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
34066   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
34067   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
34068   //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(',')
34069
34070   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
34071   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
34072   var S_TAG = 0;//tag name offerring
34073   var S_ATTR = 1;//attr name offerring 
34074   var S_ATTR_SPACE=2;//attr name end and space offer
34075   var S_EQ = 3;//=space?
34076   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
34077   var S_ATTR_END = 5;//attr value end and no space(quot end)
34078   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
34079   var S_TAG_CLOSE = 7;//closed el<el />
34080
34081   function XMLReader(){
34082         
34083   }
34084
34085   XMLReader.prototype = {
34086         parse:function(source,defaultNSMap,entityMap){
34087                 var domBuilder = this.domBuilder;
34088                 domBuilder.startDocument();
34089                 _copy(defaultNSMap ,defaultNSMap = {});
34090                 parse(source,defaultNSMap,entityMap,
34091                                 domBuilder,this.errorHandler);
34092                 domBuilder.endDocument();
34093         }
34094   };
34095   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
34096         function fixedFromCharCode(code) {
34097                 // String.prototype.fromCharCode does not supports
34098                 // > 2 bytes unicode chars directly
34099                 if (code > 0xffff) {
34100                         code -= 0x10000;
34101                         var surrogate1 = 0xd800 + (code >> 10)
34102                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
34103
34104                         return String.fromCharCode(surrogate1, surrogate2);
34105                 } else {
34106                         return String.fromCharCode(code);
34107                 }
34108         }
34109         function entityReplacer(a){
34110                 var k = a.slice(1,-1);
34111                 if(k in entityMap){
34112                         return entityMap[k]; 
34113                 }else if(k.charAt(0) === '#'){
34114                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
34115                 }else{
34116                         errorHandler.error('entity not found:'+a);
34117                         return a;
34118                 }
34119         }
34120         function appendText(end){//has some bugs
34121                 if(end>start){
34122                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
34123                         locator&&position(start);
34124                         domBuilder.characters(xt,0,end-start);
34125                         start = end;
34126                 }
34127         }
34128         function position(p,m){
34129                 while(p>=lineEnd && (m = linePattern.exec(source))){
34130                         lineStart = m.index;
34131                         lineEnd = lineStart + m[0].length;
34132                         locator.lineNumber++;
34133                         //console.log('line++:',locator,startPos,endPos)
34134                 }
34135                 locator.columnNumber = p-lineStart+1;
34136         }
34137         var lineStart = 0;
34138         var lineEnd = 0;
34139         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
34140         var locator = domBuilder.locator;
34141         
34142         var parseStack = [{currentNSMap:defaultNSMapCopy}];
34143         var closeMap = {};
34144         var start = 0;
34145         while(true){
34146                 try{
34147                         var tagStart = source.indexOf('<',start);
34148                         if(tagStart<0){
34149                                 if(!source.substr(start).match(/^\s*$/)){
34150                                         var doc = domBuilder.doc;
34151                                 var text = doc.createTextNode(source.substr(start));
34152                                 doc.appendChild(text);
34153                                 domBuilder.currentElement = text;
34154                                 }
34155                                 return;
34156                         }
34157                         if(tagStart>start){
34158                                 appendText(tagStart);
34159                         }
34160                         switch(source.charAt(tagStart+1)){
34161                         case '/':
34162                                 var end = source.indexOf('>',tagStart+3);
34163                                 var tagName = source.substring(tagStart+2,end);
34164                                 var config = parseStack.pop();
34165                                 if(end<0){
34166                                         
34167                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
34168                                 //console.error('#@@@@@@'+tagName)
34169                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
34170                                 end = tagStart+1+tagName.length;
34171                         }else if(tagName.match(/\s</)){
34172                                 tagName = tagName.replace(/[\s<].*/,'');
34173                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
34174                                 end = tagStart+1+tagName.length;
34175                                 }
34176                                 //console.error(parseStack.length,parseStack)
34177                                 //console.error(config);
34178                                 var localNSMap = config.localNSMap;
34179                                 var endMatch = config.tagName == tagName;
34180                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
34181                         if(endIgnoreCaseMach){
34182                                 domBuilder.endElement(config.uri,config.localName,tagName);
34183                                         if(localNSMap){
34184                                                 for(var prefix in localNSMap){
34185                                                         domBuilder.endPrefixMapping(prefix) ;
34186                                                 }
34187                                         }
34188                                         if(!endMatch){
34189                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
34190                                         }
34191                         }else{
34192                                 parseStack.push(config);
34193                         }
34194                                 
34195                                 end++;
34196                                 break;
34197                                 // end elment
34198                         case '?':// <?...?>
34199                                 locator&&position(tagStart);
34200                                 end = parseInstruction(source,tagStart,domBuilder);
34201                                 break;
34202                         case '!':// <!doctype,<![CDATA,<!--
34203                                 locator&&position(tagStart);
34204                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
34205                                 break;
34206                         default:
34207                                 locator&&position(tagStart);
34208                                 var el = new ElementAttributes();
34209                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
34210                                 //elStartEnd
34211                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
34212                                 var len = el.length;
34213                                 
34214                                 
34215                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
34216                                         el.closed = true;
34217                                         if(!entityMap.nbsp){
34218                                                 errorHandler.warning('unclosed xml attribute');
34219                                         }
34220                                 }
34221                                 if(locator && len){
34222                                         var locator2 = copyLocator(locator,{});
34223                                         //try{//attribute position fixed
34224                                         for(var i = 0;i<len;i++){
34225                                                 var a = el[i];
34226                                                 position(a.offset);
34227                                                 a.locator = copyLocator(locator,{});
34228                                         }
34229                                         //}catch(e){console.error('@@@@@'+e)}
34230                                         domBuilder.locator = locator2;
34231                                         if(appendElement(el,domBuilder,currentNSMap)){
34232                                                 parseStack.push(el);
34233                                         }
34234                                         domBuilder.locator = locator;
34235                                 }else{
34236                                         if(appendElement(el,domBuilder,currentNSMap)){
34237                                                 parseStack.push(el);
34238                                         }
34239                                 }
34240                                 
34241                                 
34242                                 
34243                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
34244                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
34245                                 }else{
34246                                         end++;
34247                                 }
34248                         }
34249                 }catch(e){
34250                         errorHandler.error('element parse error: '+e);
34251                         //errorHandler.error('element parse error: '+e);
34252                         end = -1;
34253                         //throw e;
34254                 }
34255                 if(end>start){
34256                         start = end;
34257                 }else{
34258                         //TODO: 这里有可能sax回退,有位置错误风险
34259                         appendText(Math.max(tagStart,start)+1);
34260                 }
34261         }
34262   }
34263   function copyLocator(f,t){
34264         t.lineNumber = f.lineNumber;
34265         t.columnNumber = f.columnNumber;
34266         return t;
34267   }
34268
34269   /**
34270    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
34271    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
34272    */
34273   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
34274         var attrName;
34275         var value;
34276         var p = ++start;
34277         var s = S_TAG;//status
34278         while(true){
34279                 var c = source.charAt(p);
34280                 switch(c){
34281                 case '=':
34282                         if(s === S_ATTR){//attrName
34283                                 attrName = source.slice(start,p);
34284                                 s = S_EQ;
34285                         }else if(s === S_ATTR_SPACE){
34286                                 s = S_EQ;
34287                         }else{
34288                                 //fatalError: equal must after attrName or space after attrName
34289                                 throw new Error('attribute equal must after attrName');
34290                         }
34291                         break;
34292                 case '\'':
34293                 case '"':
34294                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
34295                                 ){//equal
34296                                 if(s === S_ATTR){
34297                                         errorHandler.warning('attribute value must after "="');
34298                                         attrName = source.slice(start,p);
34299                                 }
34300                                 start = p+1;
34301                                 p = source.indexOf(c,start);
34302                                 if(p>0){
34303                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34304                                         el.add(attrName,value,start-1);
34305                                         s = S_ATTR_END;
34306                                 }else{
34307                                         //fatalError: no end quot match
34308                                         throw new Error('attribute value no end \''+c+'\' match');
34309                                 }
34310                         }else if(s == S_ATTR_NOQUOT_VALUE){
34311                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34312                                 //console.log(attrName,value,start,p)
34313                                 el.add(attrName,value,start);
34314                                 //console.dir(el)
34315                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
34316                                 start = p+1;
34317                                 s = S_ATTR_END;
34318                         }else{
34319                                 //fatalError: no equal before
34320                                 throw new Error('attribute value must after "="');
34321                         }
34322                         break;
34323                 case '/':
34324                         switch(s){
34325                         case S_TAG:
34326                                 el.setTagName(source.slice(start,p));
34327                         case S_ATTR_END:
34328                         case S_TAG_SPACE:
34329                         case S_TAG_CLOSE:
34330                                 s =S_TAG_CLOSE;
34331                                 el.closed = true;
34332                         case S_ATTR_NOQUOT_VALUE:
34333                         case S_ATTR:
34334                         case S_ATTR_SPACE:
34335                                 break;
34336                         //case S_EQ:
34337                         default:
34338                                 throw new Error("attribute invalid close char('/')")
34339                         }
34340                         break;
34341                 case ''://end document
34342                         //throw new Error('unexpected end of input')
34343                         errorHandler.error('unexpected end of input');
34344                         if(s == S_TAG){
34345                                 el.setTagName(source.slice(start,p));
34346                         }
34347                         return p;
34348                 case '>':
34349                         switch(s){
34350                         case S_TAG:
34351                                 el.setTagName(source.slice(start,p));
34352                         case S_ATTR_END:
34353                         case S_TAG_SPACE:
34354                         case S_TAG_CLOSE:
34355                                 break;//normal
34356                         case S_ATTR_NOQUOT_VALUE://Compatible state
34357                         case S_ATTR:
34358                                 value = source.slice(start,p);
34359                                 if(value.slice(-1) === '/'){
34360                                         el.closed  = true;
34361                                         value = value.slice(0,-1);
34362                                 }
34363                         case S_ATTR_SPACE:
34364                                 if(s === S_ATTR_SPACE){
34365                                         value = attrName;
34366                                 }
34367                                 if(s == S_ATTR_NOQUOT_VALUE){
34368                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
34369                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
34370                                 }else{
34371                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
34372                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
34373                                         }
34374                                         el.add(value,value,start);
34375                                 }
34376                                 break;
34377                         case S_EQ:
34378                                 throw new Error('attribute value missed!!');
34379                         }
34380   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
34381                         return p;
34382                 /*xml space '\x20' | #x9 | #xD | #xA; */
34383                 case '\u0080':
34384                         c = ' ';
34385                 default:
34386                         if(c<= ' '){//space
34387                                 switch(s){
34388                                 case S_TAG:
34389                                         el.setTagName(source.slice(start,p));//tagName
34390                                         s = S_TAG_SPACE;
34391                                         break;
34392                                 case S_ATTR:
34393                                         attrName = source.slice(start,p);
34394                                         s = S_ATTR_SPACE;
34395                                         break;
34396                                 case S_ATTR_NOQUOT_VALUE:
34397                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
34398                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
34399                                         el.add(attrName,value,start);
34400                                 case S_ATTR_END:
34401                                         s = S_TAG_SPACE;
34402                                         break;
34403                                 //case S_TAG_SPACE:
34404                                 //case S_EQ:
34405                                 //case S_ATTR_SPACE:
34406                                 //      void();break;
34407                                 //case S_TAG_CLOSE:
34408                                         //ignore warning
34409                                 }
34410                         }else{//not space
34411   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
34412   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
34413                                 switch(s){
34414                                 //case S_TAG:void();break;
34415                                 //case S_ATTR:void();break;
34416                                 //case S_ATTR_NOQUOT_VALUE:void();break;
34417                                 case S_ATTR_SPACE:
34418                                         var tagName =  el.tagName;
34419                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
34420                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
34421                                         }
34422                                         el.add(attrName,attrName,start);
34423                                         start = p;
34424                                         s = S_ATTR;
34425                                         break;
34426                                 case S_ATTR_END:
34427                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
34428                                 case S_TAG_SPACE:
34429                                         s = S_ATTR;
34430                                         start = p;
34431                                         break;
34432                                 case S_EQ:
34433                                         s = S_ATTR_NOQUOT_VALUE;
34434                                         start = p;
34435                                         break;
34436                                 case S_TAG_CLOSE:
34437                                         throw new Error("elements closed character '/' and '>' must be connected to");
34438                                 }
34439                         }
34440                 }//end outer switch
34441                 //console.log('p++',p)
34442                 p++;
34443         }
34444   }
34445   /**
34446    * @return true if has new namespace define
34447    */
34448   function appendElement(el,domBuilder,currentNSMap){
34449         var tagName = el.tagName;
34450         var localNSMap = null;
34451         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
34452         var i = el.length;
34453         while(i--){
34454                 var a = el[i];
34455                 var qName = a.qName;
34456                 var value = a.value;
34457                 var nsp = qName.indexOf(':');
34458                 if(nsp>0){
34459                         var prefix = a.prefix = qName.slice(0,nsp);
34460                         var localName = qName.slice(nsp+1);
34461                         var nsPrefix = prefix === 'xmlns' && localName;
34462                 }else{
34463                         localName = qName;
34464                         prefix = null;
34465                         nsPrefix = qName === 'xmlns' && '';
34466                 }
34467                 //can not set prefix,because prefix !== ''
34468                 a.localName = localName ;
34469                 //prefix == null for no ns prefix attribute 
34470                 if(nsPrefix !== false){//hack!!
34471                         if(localNSMap == null){
34472                                 localNSMap = {};
34473                                 //console.log(currentNSMap,0)
34474                                 _copy(currentNSMap,currentNSMap={});
34475                                 //console.log(currentNSMap,1)
34476                         }
34477                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
34478                         a.uri = 'http://www.w3.org/2000/xmlns/';
34479                         domBuilder.startPrefixMapping(nsPrefix, value); 
34480                 }
34481         }
34482         var i = el.length;
34483         while(i--){
34484                 a = el[i];
34485                 var prefix = a.prefix;
34486                 if(prefix){//no prefix attribute has no namespace
34487                         if(prefix === 'xml'){
34488                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
34489                         }if(prefix !== 'xmlns'){
34490                                 a.uri = currentNSMap[prefix || ''];
34491                                 
34492                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
34493                         }
34494                 }
34495         }
34496         var nsp = tagName.indexOf(':');
34497         if(nsp>0){
34498                 prefix = el.prefix = tagName.slice(0,nsp);
34499                 localName = el.localName = tagName.slice(nsp+1);
34500         }else{
34501                 prefix = null;//important!!
34502                 localName = el.localName = tagName;
34503         }
34504         //no prefix element has default namespace
34505         var ns = el.uri = currentNSMap[prefix || ''];
34506         domBuilder.startElement(ns,localName,tagName,el);
34507         //endPrefixMapping and startPrefixMapping have not any help for dom builder
34508         //localNSMap = null
34509         if(el.closed){
34510                 domBuilder.endElement(ns,localName,tagName);
34511                 if(localNSMap){
34512                         for(prefix in localNSMap){
34513                                 domBuilder.endPrefixMapping(prefix); 
34514                         }
34515                 }
34516         }else{
34517                 el.currentNSMap = currentNSMap;
34518                 el.localNSMap = localNSMap;
34519                 //parseStack.push(el);
34520                 return true;
34521         }
34522   }
34523   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
34524         if(/^(?:script|textarea)$/i.test(tagName)){
34525                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
34526                 var text = source.substring(elStartEnd+1,elEndStart);
34527                 if(/[&<]/.test(text)){
34528                         if(/^script$/i.test(tagName)){
34529                                 //if(!/\]\]>/.test(text)){
34530                                         //lexHandler.startCDATA();
34531                                         domBuilder.characters(text,0,text.length);
34532                                         //lexHandler.endCDATA();
34533                                         return elEndStart;
34534                                 //}
34535                         }//}else{//text area
34536                                 text = text.replace(/&#?\w+;/g,entityReplacer);
34537                                 domBuilder.characters(text,0,text.length);
34538                                 return elEndStart;
34539                         //}
34540                         
34541                 }
34542         }
34543         return elStartEnd+1;
34544   }
34545   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
34546         //if(tagName in closeMap){
34547         var pos = closeMap[tagName];
34548         if(pos == null){
34549                 //console.log(tagName)
34550                 pos =  source.lastIndexOf('</'+tagName+'>');
34551                 if(pos<elStartEnd){//忘记闭合
34552                         pos = source.lastIndexOf('</'+tagName);
34553                 }
34554                 closeMap[tagName] =pos;
34555         }
34556         return pos<elStartEnd;
34557         //} 
34558   }
34559   function _copy(source,target){
34560         for(var n in source){target[n] = source[n];}
34561   }
34562   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
34563         var next= source.charAt(start+2);
34564         switch(next){
34565         case '-':
34566                 if(source.charAt(start + 3) === '-'){
34567                         var end = source.indexOf('-->',start+4);
34568                         //append comment source.substring(4,end)//<!--
34569                         if(end>start){
34570                                 domBuilder.comment(source,start+4,end-start-4);
34571                                 return end+3;
34572                         }else{
34573                                 errorHandler.error("Unclosed comment");
34574                                 return -1;
34575                         }
34576                 }else{
34577                         //error
34578                         return -1;
34579                 }
34580         default:
34581                 if(source.substr(start+3,6) == 'CDATA['){
34582                         var end = source.indexOf(']]>',start+9);
34583                         domBuilder.startCDATA();
34584                         domBuilder.characters(source,start+9,end-start-9);
34585                         domBuilder.endCDATA(); 
34586                         return end+3;
34587                 }
34588                 //<!DOCTYPE
34589                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
34590                 var matchs = split(source,start);
34591                 var len = matchs.length;
34592                 if(len>1 && /!doctype/i.test(matchs[0][0])){
34593                         var name = matchs[1][0];
34594                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
34595                         var sysid = len>4 && matchs[4][0];
34596                         var lastMatch = matchs[len-1];
34597                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
34598                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
34599                         domBuilder.endDTD();
34600                         
34601                         return lastMatch.index+lastMatch[0].length
34602                 }
34603         }
34604         return -1;
34605   }
34606
34607
34608
34609   function parseInstruction(source,start,domBuilder){
34610         var end = source.indexOf('?>',start);
34611         if(end){
34612                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
34613                 if(match){
34614                         var len = match[0].length;
34615                         domBuilder.processingInstruction(match[1], match[2]) ;
34616                         return end+2;
34617                 }else{//error
34618                         return -1;
34619                 }
34620         }
34621         return -1;
34622   }
34623
34624   /**
34625    * @param source
34626    */
34627   function ElementAttributes(source){
34628         
34629   }
34630   ElementAttributes.prototype = {
34631         setTagName:function(tagName){
34632                 if(!tagNamePattern.test(tagName)){
34633                         throw new Error('invalid tagName:'+tagName)
34634                 }
34635                 this.tagName = tagName;
34636         },
34637         add:function(qName,value,offset){
34638                 if(!tagNamePattern.test(qName)){
34639                         throw new Error('invalid attribute:'+qName)
34640                 }
34641                 this[this.length++] = {qName:qName,value:value,offset:offset};
34642         },
34643         length:0,
34644         getLocalName:function(i){return this[i].localName},
34645         getLocator:function(i){return this[i].locator},
34646         getQName:function(i){return this[i].qName},
34647         getURI:function(i){return this[i].uri},
34648         getValue:function(i){return this[i].value}
34649   //    ,getIndex:function(uri, localName)){
34650   //            if(localName){
34651   //                    
34652   //            }else{
34653   //                    var qName = uri
34654   //            }
34655   //    },
34656   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
34657   //    getType:function(uri,localName){}
34658   //    getType:function(i){},
34659   };
34660
34661
34662
34663
34664   function _set_proto_(thiz,parent){
34665         thiz.__proto__ = parent;
34666         return thiz;
34667   }
34668   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
34669         _set_proto_ = function(thiz,parent){
34670                 function p(){}          p.prototype = parent;
34671                 p = new p();
34672                 for(parent in thiz){
34673                         p[parent] = thiz[parent];
34674                 }
34675                 return p;
34676         };
34677   }
34678
34679   function split(source,start){
34680         var match;
34681         var buf = [];
34682         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
34683         reg.lastIndex = start;
34684         reg.exec(source);//skip <
34685         while(match = reg.exec(source)){
34686                 buf.push(match);
34687                 if(match[1])return buf;
34688         }
34689   }
34690
34691   var XMLReader_1 = XMLReader;
34692
34693   var sax = {
34694         XMLReader: XMLReader_1
34695   };
34696
34697   /*
34698    * DOM Level 2
34699    * Object DOMException
34700    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
34701    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
34702    */
34703
34704   function copy$1(src,dest){
34705         for(var p in src){
34706                 dest[p] = src[p];
34707         }
34708   }
34709   /**
34710   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
34711   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
34712    */
34713   function _extends(Class,Super){
34714         var pt = Class.prototype;
34715         if(Object.create){
34716                 var ppt = Object.create(Super.prototype);
34717                 pt.__proto__ = ppt;
34718         }
34719         if(!(pt instanceof Super)){
34720                 function t(){}          t.prototype = Super.prototype;
34721                 t = new t();
34722                 copy$1(pt,t);
34723                 Class.prototype = pt = t;
34724         }
34725         if(pt.constructor != Class){
34726                 if(typeof Class != 'function'){
34727                         console.error("unknow Class:"+Class);
34728                 }
34729                 pt.constructor = Class;
34730         }
34731   }
34732   var htmlns = 'http://www.w3.org/1999/xhtml' ;
34733   // Node Types
34734   var NodeType = {};
34735   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
34736   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
34737   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
34738   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
34739   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
34740   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
34741   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
34742   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
34743   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
34744   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
34745   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
34746   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
34747
34748   // ExceptionCode
34749   var ExceptionCode = {};
34750   var ExceptionMessage = {};
34751   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
34752   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
34753   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
34754   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
34755   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
34756   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
34757   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
34758   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
34759   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
34760   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
34761   //level2
34762   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
34763   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
34764   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
34765   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
34766   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
34767
34768
34769   function DOMException(code, message) {
34770         if(message instanceof Error){
34771                 var error = message;
34772         }else{
34773                 error = this;
34774                 Error.call(this, ExceptionMessage[code]);
34775                 this.message = ExceptionMessage[code];
34776                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
34777         }
34778         error.code = code;
34779         if(message) this.message = this.message + ": " + message;
34780         return error;
34781   }DOMException.prototype = Error.prototype;
34782   copy$1(ExceptionCode,DOMException);
34783   /**
34784    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
34785    * 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.
34786    * The items in the NodeList are accessible via an integral index, starting from 0.
34787    */
34788   function NodeList() {
34789   }NodeList.prototype = {
34790         /**
34791          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
34792          * @standard level1
34793          */
34794         length:0, 
34795         /**
34796          * 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.
34797          * @standard level1
34798          * @param index  unsigned long 
34799          *   Index into the collection.
34800          * @return Node
34801          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
34802          */
34803         item: function(index) {
34804                 return this[index] || null;
34805         },
34806         toString:function(isHTML,nodeFilter){
34807                 for(var buf = [], i = 0;i<this.length;i++){
34808                         serializeToString(this[i],buf,isHTML,nodeFilter);
34809                 }
34810                 return buf.join('');
34811         }
34812   };
34813   function LiveNodeList(node,refresh){
34814         this._node = node;
34815         this._refresh = refresh;
34816         _updateLiveList(this);
34817   }
34818   function _updateLiveList(list){
34819         var inc = list._node._inc || list._node.ownerDocument._inc;
34820         if(list._inc != inc){
34821                 var ls = list._refresh(list._node);
34822                 //console.log(ls.length)
34823                 __set__(list,'length',ls.length);
34824                 copy$1(ls,list);
34825                 list._inc = inc;
34826         }
34827   }
34828   LiveNodeList.prototype.item = function(i){
34829         _updateLiveList(this);
34830         return this[i];
34831   };
34832
34833   _extends(LiveNodeList,NodeList);
34834   /**
34835    * 
34836    * 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.
34837    * NamedNodeMap objects in the DOM are live.
34838    * used for attributes or DocumentType entities 
34839    */
34840   function NamedNodeMap() {
34841   }
34842   function _findNodeIndex(list,node){
34843         var i = list.length;
34844         while(i--){
34845                 if(list[i] === node){return i}
34846         }
34847   }
34848
34849   function _addNamedNode(el,list,newAttr,oldAttr){
34850         if(oldAttr){
34851                 list[_findNodeIndex(list,oldAttr)] = newAttr;
34852         }else{
34853                 list[list.length++] = newAttr;
34854         }
34855         if(el){
34856                 newAttr.ownerElement = el;
34857                 var doc = el.ownerDocument;
34858                 if(doc){
34859                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
34860                         _onAddAttribute(doc,el,newAttr);
34861                 }
34862         }
34863   }
34864   function _removeNamedNode(el,list,attr){
34865         //console.log('remove attr:'+attr)
34866         var i = _findNodeIndex(list,attr);
34867         if(i>=0){
34868                 var lastIndex = list.length-1;
34869                 while(i<lastIndex){
34870                         list[i] = list[++i];
34871                 }
34872                 list.length = lastIndex;
34873                 if(el){
34874                         var doc = el.ownerDocument;
34875                         if(doc){
34876                                 _onRemoveAttribute(doc,el,attr);
34877                                 attr.ownerElement = null;
34878                         }
34879                 }
34880         }else{
34881                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
34882         }
34883   }
34884   NamedNodeMap.prototype = {
34885         length:0,
34886         item:NodeList.prototype.item,
34887         getNamedItem: function(key) {
34888   //            if(key.indexOf(':')>0 || key == 'xmlns'){
34889   //                    return null;
34890   //            }
34891                 //console.log()
34892                 var i = this.length;
34893                 while(i--){
34894                         var attr = this[i];
34895                         //console.log(attr.nodeName,key)
34896                         if(attr.nodeName == key){
34897                                 return attr;
34898                         }
34899                 }
34900         },
34901         setNamedItem: function(attr) {
34902                 var el = attr.ownerElement;
34903                 if(el && el!=this._ownerElement){
34904                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
34905                 }
34906                 var oldAttr = this.getNamedItem(attr.nodeName);
34907                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
34908                 return oldAttr;
34909         },
34910         /* returns Node */
34911         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
34912                 var el = attr.ownerElement, oldAttr;
34913                 if(el && el!=this._ownerElement){
34914                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
34915                 }
34916                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
34917                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
34918                 return oldAttr;
34919         },
34920
34921         /* returns Node */
34922         removeNamedItem: function(key) {
34923                 var attr = this.getNamedItem(key);
34924                 _removeNamedNode(this._ownerElement,this,attr);
34925                 return attr;
34926                 
34927                 
34928         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
34929         
34930         //for level2
34931         removeNamedItemNS:function(namespaceURI,localName){
34932                 var attr = this.getNamedItemNS(namespaceURI,localName);
34933                 _removeNamedNode(this._ownerElement,this,attr);
34934                 return attr;
34935         },
34936         getNamedItemNS: function(namespaceURI, localName) {
34937                 var i = this.length;
34938                 while(i--){
34939                         var node = this[i];
34940                         if(node.localName == localName && node.namespaceURI == namespaceURI){
34941                                 return node;
34942                         }
34943                 }
34944                 return null;
34945         }
34946   };
34947   /**
34948    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
34949    */
34950   function DOMImplementation(/* Object */ features) {
34951         this._features = {};
34952         if (features) {
34953                 for (var feature in features) {
34954                          this._features = features[feature];
34955                 }
34956         }
34957   }
34958   DOMImplementation.prototype = {
34959         hasFeature: function(/* string */ feature, /* string */ version) {
34960                 var versions = this._features[feature.toLowerCase()];
34961                 if (versions && (!version || version in versions)) {
34962                         return true;
34963                 } else {
34964                         return false;
34965                 }
34966         },
34967         // Introduced in DOM Level 2:
34968         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
34969                 var doc = new Document();
34970                 doc.implementation = this;
34971                 doc.childNodes = new NodeList();
34972                 doc.doctype = doctype;
34973                 if(doctype){
34974                         doc.appendChild(doctype);
34975                 }
34976                 if(qualifiedName){
34977                         var root = doc.createElementNS(namespaceURI,qualifiedName);
34978                         doc.appendChild(root);
34979                 }
34980                 return doc;
34981         },
34982         // Introduced in DOM Level 2:
34983         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
34984                 var node = new DocumentType();
34985                 node.name = qualifiedName;
34986                 node.nodeName = qualifiedName;
34987                 node.publicId = publicId;
34988                 node.systemId = systemId;
34989                 // Introduced in DOM Level 2:
34990                 //readonly attribute DOMString        internalSubset;
34991                 
34992                 //TODO:..
34993                 //  readonly attribute NamedNodeMap     entities;
34994                 //  readonly attribute NamedNodeMap     notations;
34995                 return node;
34996         }
34997   };
34998
34999
35000   /**
35001    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
35002    */
35003
35004   function Node$2() {
35005   }
35006   Node$2.prototype = {
35007         firstChild : null,
35008         lastChild : null,
35009         previousSibling : null,
35010         nextSibling : null,
35011         attributes : null,
35012         parentNode : null,
35013         childNodes : null,
35014         ownerDocument : null,
35015         nodeValue : null,
35016         namespaceURI : null,
35017         prefix : null,
35018         localName : null,
35019         // Modified in DOM Level 2:
35020         insertBefore:function(newChild, refChild){//raises 
35021                 return _insertBefore(this,newChild,refChild);
35022         },
35023         replaceChild:function(newChild, oldChild){//raises 
35024                 this.insertBefore(newChild,oldChild);
35025                 if(oldChild){
35026                         this.removeChild(oldChild);
35027                 }
35028         },
35029         removeChild:function(oldChild){
35030                 return _removeChild(this,oldChild);
35031         },
35032         appendChild:function(newChild){
35033                 return this.insertBefore(newChild,null);
35034         },
35035         hasChildNodes:function(){
35036                 return this.firstChild != null;
35037         },
35038         cloneNode:function(deep){
35039                 return cloneNode(this.ownerDocument||this,this,deep);
35040         },
35041         // Modified in DOM Level 2:
35042         normalize:function(){
35043                 var child = this.firstChild;
35044                 while(child){
35045                         var next = child.nextSibling;
35046                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
35047                                 this.removeChild(next);
35048                                 child.appendData(next.data);
35049                         }else{
35050                                 child.normalize();
35051                                 child = next;
35052                         }
35053                 }
35054         },
35055         // Introduced in DOM Level 2:
35056         isSupported:function(feature, version){
35057                 return this.ownerDocument.implementation.hasFeature(feature,version);
35058         },
35059       // Introduced in DOM Level 2:
35060       hasAttributes:function(){
35061         return this.attributes.length>0;
35062       },
35063       lookupPrefix:function(namespaceURI){
35064         var el = this;
35065         while(el){
35066                 var map = el._nsMap;
35067                 //console.dir(map)
35068                 if(map){
35069                         for(var n in map){
35070                                 if(map[n] == namespaceURI){
35071                                         return n;
35072                                 }
35073                         }
35074                 }
35075                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
35076         }
35077         return null;
35078       },
35079       // Introduced in DOM Level 3:
35080       lookupNamespaceURI:function(prefix){
35081         var el = this;
35082         while(el){
35083                 var map = el._nsMap;
35084                 //console.dir(map)
35085                 if(map){
35086                         if(prefix in map){
35087                                 return map[prefix] ;
35088                         }
35089                 }
35090                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
35091         }
35092         return null;
35093       },
35094       // Introduced in DOM Level 3:
35095       isDefaultNamespace:function(namespaceURI){
35096         var prefix = this.lookupPrefix(namespaceURI);
35097         return prefix == null;
35098       }
35099   };
35100
35101
35102   function _xmlEncoder(c){
35103         return c == '<' && '&lt;' ||
35104            c == '>' && '&gt;' ||
35105            c == '&' && '&amp;' ||
35106            c == '"' && '&quot;' ||
35107            '&#'+c.charCodeAt()+';'
35108   }
35109
35110
35111   copy$1(NodeType,Node$2);
35112   copy$1(NodeType,Node$2.prototype);
35113
35114   /**
35115    * @param callback return true for continue,false for break
35116    * @return boolean true: break visit;
35117    */
35118   function _visitNode(node,callback){
35119         if(callback(node)){
35120                 return true;
35121         }
35122         if(node = node.firstChild){
35123                 do{
35124                         if(_visitNode(node,callback)){return true}
35125           }while(node=node.nextSibling)
35126       }
35127   }
35128
35129
35130
35131   function Document(){
35132   }
35133   function _onAddAttribute(doc,el,newAttr){
35134         doc && doc._inc++;
35135         var ns = newAttr.namespaceURI ;
35136         if(ns == 'http://www.w3.org/2000/xmlns/'){
35137                 //update namespace
35138                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
35139         }
35140   }
35141   function _onRemoveAttribute(doc,el,newAttr,remove){
35142         doc && doc._inc++;
35143         var ns = newAttr.namespaceURI ;
35144         if(ns == 'http://www.w3.org/2000/xmlns/'){
35145                 //update namespace
35146                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
35147         }
35148   }
35149   function _onUpdateChild(doc,el,newChild){
35150         if(doc && doc._inc){
35151                 doc._inc++;
35152                 //update childNodes
35153                 var cs = el.childNodes;
35154                 if(newChild){
35155                         cs[cs.length++] = newChild;
35156                 }else{
35157                         //console.log(1)
35158                         var child = el.firstChild;
35159                         var i = 0;
35160                         while(child){
35161                                 cs[i++] = child;
35162                                 child =child.nextSibling;
35163                         }
35164                         cs.length = i;
35165                 }
35166         }
35167   }
35168
35169   /**
35170    * attributes;
35171    * children;
35172    * 
35173    * writeable properties:
35174    * nodeValue,Attr:value,CharacterData:data
35175    * prefix
35176    */
35177   function _removeChild(parentNode,child){
35178         var previous = child.previousSibling;
35179         var next = child.nextSibling;
35180         if(previous){
35181                 previous.nextSibling = next;
35182         }else{
35183                 parentNode.firstChild = next;
35184         }
35185         if(next){
35186                 next.previousSibling = previous;
35187         }else{
35188                 parentNode.lastChild = previous;
35189         }
35190         _onUpdateChild(parentNode.ownerDocument,parentNode);
35191         return child;
35192   }
35193   /**
35194    * preformance key(refChild == null)
35195    */
35196   function _insertBefore(parentNode,newChild,nextChild){
35197         var cp = newChild.parentNode;
35198         if(cp){
35199                 cp.removeChild(newChild);//remove and update
35200         }
35201         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
35202                 var newFirst = newChild.firstChild;
35203                 if (newFirst == null) {
35204                         return newChild;
35205                 }
35206                 var newLast = newChild.lastChild;
35207         }else{
35208                 newFirst = newLast = newChild;
35209         }
35210         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
35211
35212         newFirst.previousSibling = pre;
35213         newLast.nextSibling = nextChild;
35214         
35215         
35216         if(pre){
35217                 pre.nextSibling = newFirst;
35218         }else{
35219                 parentNode.firstChild = newFirst;
35220         }
35221         if(nextChild == null){
35222                 parentNode.lastChild = newLast;
35223         }else{
35224                 nextChild.previousSibling = newLast;
35225         }
35226         do{
35227                 newFirst.parentNode = parentNode;
35228         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
35229         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
35230         //console.log(parentNode.lastChild.nextSibling == null)
35231         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
35232                 newChild.firstChild = newChild.lastChild = null;
35233         }
35234         return newChild;
35235   }
35236   function _appendSingleChild(parentNode,newChild){
35237         var cp = newChild.parentNode;
35238         if(cp){
35239                 var pre = parentNode.lastChild;
35240                 cp.removeChild(newChild);//remove and update
35241                 var pre = parentNode.lastChild;
35242         }
35243         var pre = parentNode.lastChild;
35244         newChild.parentNode = parentNode;
35245         newChild.previousSibling = pre;
35246         newChild.nextSibling = null;
35247         if(pre){
35248                 pre.nextSibling = newChild;
35249         }else{
35250                 parentNode.firstChild = newChild;
35251         }
35252         parentNode.lastChild = newChild;
35253         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
35254         return newChild;
35255         //console.log("__aa",parentNode.lastChild.nextSibling == null)
35256   }
35257   Document.prototype = {
35258         //implementation : null,
35259         nodeName :  '#document',
35260         nodeType :  DOCUMENT_NODE,
35261         doctype :  null,
35262         documentElement :  null,
35263         _inc : 1,
35264         
35265         insertBefore :  function(newChild, refChild){//raises 
35266                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
35267                         var child = newChild.firstChild;
35268                         while(child){
35269                                 var next = child.nextSibling;
35270                                 this.insertBefore(child,refChild);
35271                                 child = next;
35272                         }
35273                         return newChild;
35274                 }
35275                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
35276                         this.documentElement = newChild;
35277                 }
35278                 
35279                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
35280         },
35281         removeChild :  function(oldChild){
35282                 if(this.documentElement == oldChild){
35283                         this.documentElement = null;
35284                 }
35285                 return _removeChild(this,oldChild);
35286         },
35287         // Introduced in DOM Level 2:
35288         importNode : function(importedNode,deep){
35289                 return importNode(this,importedNode,deep);
35290         },
35291         // Introduced in DOM Level 2:
35292         getElementById :        function(id){
35293                 var rtv = null;
35294                 _visitNode(this.documentElement,function(node){
35295                         if(node.nodeType == ELEMENT_NODE){
35296                                 if(node.getAttribute('id') == id){
35297                                         rtv = node;
35298                                         return true;
35299                                 }
35300                         }
35301                 });
35302                 return rtv;
35303         },
35304         
35305         //document factory method:
35306         createElement : function(tagName){
35307                 var node = new Element();
35308                 node.ownerDocument = this;
35309                 node.nodeName = tagName;
35310                 node.tagName = tagName;
35311                 node.childNodes = new NodeList();
35312                 var attrs       = node.attributes = new NamedNodeMap();
35313                 attrs._ownerElement = node;
35314                 return node;
35315         },
35316         createDocumentFragment :        function(){
35317                 var node = new DocumentFragment();
35318                 node.ownerDocument = this;
35319                 node.childNodes = new NodeList();
35320                 return node;
35321         },
35322         createTextNode :        function(data){
35323                 var node = new Text();
35324                 node.ownerDocument = this;
35325                 node.appendData(data);
35326                 return node;
35327         },
35328         createComment : function(data){
35329                 var node = new Comment();
35330                 node.ownerDocument = this;
35331                 node.appendData(data);
35332                 return node;
35333         },
35334         createCDATASection :    function(data){
35335                 var node = new CDATASection();
35336                 node.ownerDocument = this;
35337                 node.appendData(data);
35338                 return node;
35339         },
35340         createProcessingInstruction :   function(target,data){
35341                 var node = new ProcessingInstruction();
35342                 node.ownerDocument = this;
35343                 node.tagName = node.target = target;
35344                 node.nodeValue= node.data = data;
35345                 return node;
35346         },
35347         createAttribute :       function(name){
35348                 var node = new Attr();
35349                 node.ownerDocument      = this;
35350                 node.name = name;
35351                 node.nodeName   = name;
35352                 node.localName = name;
35353                 node.specified = true;
35354                 return node;
35355         },
35356         createEntityReference : function(name){
35357                 var node = new EntityReference();
35358                 node.ownerDocument      = this;
35359                 node.nodeName   = name;
35360                 return node;
35361         },
35362         // Introduced in DOM Level 2:
35363         createElementNS :       function(namespaceURI,qualifiedName){
35364                 var node = new Element();
35365                 var pl = qualifiedName.split(':');
35366                 var attrs       = node.attributes = new NamedNodeMap();
35367                 node.childNodes = new NodeList();
35368                 node.ownerDocument = this;
35369                 node.nodeName = qualifiedName;
35370                 node.tagName = qualifiedName;
35371                 node.namespaceURI = namespaceURI;
35372                 if(pl.length == 2){
35373                         node.prefix = pl[0];
35374                         node.localName = pl[1];
35375                 }else{
35376                         //el.prefix = null;
35377                         node.localName = qualifiedName;
35378                 }
35379                 attrs._ownerElement = node;
35380                 return node;
35381         },
35382         // Introduced in DOM Level 2:
35383         createAttributeNS :     function(namespaceURI,qualifiedName){
35384                 var node = new Attr();
35385                 var pl = qualifiedName.split(':');
35386                 node.ownerDocument = this;
35387                 node.nodeName = qualifiedName;
35388                 node.name = qualifiedName;
35389                 node.namespaceURI = namespaceURI;
35390                 node.specified = true;
35391                 if(pl.length == 2){
35392                         node.prefix = pl[0];
35393                         node.localName = pl[1];
35394                 }else{
35395                         //el.prefix = null;
35396                         node.localName = qualifiedName;
35397                 }
35398                 return node;
35399         }
35400   };
35401   _extends(Document,Node$2);
35402
35403
35404   function Element() {
35405         this._nsMap = {};
35406   }Element.prototype = {
35407         nodeType : ELEMENT_NODE,
35408         hasAttribute : function(name){
35409                 return this.getAttributeNode(name)!=null;
35410         },
35411         getAttribute : function(name){
35412                 var attr = this.getAttributeNode(name);
35413                 return attr && attr.value || '';
35414         },
35415         getAttributeNode : function(name){
35416                 return this.attributes.getNamedItem(name);
35417         },
35418         setAttribute : function(name, value){
35419                 var attr = this.ownerDocument.createAttribute(name);
35420                 attr.value = attr.nodeValue = "" + value;
35421                 this.setAttributeNode(attr);
35422         },
35423         removeAttribute : function(name){
35424                 var attr = this.getAttributeNode(name);
35425                 attr && this.removeAttributeNode(attr);
35426         },
35427         
35428         //four real opeartion method
35429         appendChild:function(newChild){
35430                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
35431                         return this.insertBefore(newChild,null);
35432                 }else{
35433                         return _appendSingleChild(this,newChild);
35434                 }
35435         },
35436         setAttributeNode : function(newAttr){
35437                 return this.attributes.setNamedItem(newAttr);
35438         },
35439         setAttributeNodeNS : function(newAttr){
35440                 return this.attributes.setNamedItemNS(newAttr);
35441         },
35442         removeAttributeNode : function(oldAttr){
35443                 //console.log(this == oldAttr.ownerElement)
35444                 return this.attributes.removeNamedItem(oldAttr.nodeName);
35445         },
35446         //get real attribute name,and remove it by removeAttributeNode
35447         removeAttributeNS : function(namespaceURI, localName){
35448                 var old = this.getAttributeNodeNS(namespaceURI, localName);
35449                 old && this.removeAttributeNode(old);
35450         },
35451         
35452         hasAttributeNS : function(namespaceURI, localName){
35453                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
35454         },
35455         getAttributeNS : function(namespaceURI, localName){
35456                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
35457                 return attr && attr.value || '';
35458         },
35459         setAttributeNS : function(namespaceURI, qualifiedName, value){
35460                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
35461                 attr.value = attr.nodeValue = "" + value;
35462                 this.setAttributeNode(attr);
35463         },
35464         getAttributeNodeNS : function(namespaceURI, localName){
35465                 return this.attributes.getNamedItemNS(namespaceURI, localName);
35466         },
35467         
35468         getElementsByTagName : function(tagName){
35469                 return new LiveNodeList(this,function(base){
35470                         var ls = [];
35471                         _visitNode(base,function(node){
35472                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
35473                                         ls.push(node);
35474                                 }
35475                         });
35476                         return ls;
35477                 });
35478         },
35479         getElementsByTagNameNS : function(namespaceURI, localName){
35480                 return new LiveNodeList(this,function(base){
35481                         var ls = [];
35482                         _visitNode(base,function(node){
35483                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
35484                                         ls.push(node);
35485                                 }
35486                         });
35487                         return ls;
35488                         
35489                 });
35490         }
35491   };
35492   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
35493   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
35494
35495
35496   _extends(Element,Node$2);
35497   function Attr() {
35498   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
35499   _extends(Attr,Node$2);
35500
35501
35502   function CharacterData() {
35503   }CharacterData.prototype = {
35504         data : '',
35505         substringData : function(offset, count) {
35506                 return this.data.substring(offset, offset+count);
35507         },
35508         appendData: function(text) {
35509                 text = this.data+text;
35510                 this.nodeValue = this.data = text;
35511                 this.length = text.length;
35512         },
35513         insertData: function(offset,text) {
35514                 this.replaceData(offset,0,text);
35515         
35516         },
35517         appendChild:function(newChild){
35518                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
35519         },
35520         deleteData: function(offset, count) {
35521                 this.replaceData(offset,count,"");
35522         },
35523         replaceData: function(offset, count, text) {
35524                 var start = this.data.substring(0,offset);
35525                 var end = this.data.substring(offset+count);
35526                 text = start + text + end;
35527                 this.nodeValue = this.data = text;
35528                 this.length = text.length;
35529         }
35530   };
35531   _extends(CharacterData,Node$2);
35532   function Text() {
35533   }Text.prototype = {
35534         nodeName : "#text",
35535         nodeType : TEXT_NODE,
35536         splitText : function(offset) {
35537                 var text = this.data;
35538                 var newText = text.substring(offset);
35539                 text = text.substring(0, offset);
35540                 this.data = this.nodeValue = text;
35541                 this.length = text.length;
35542                 var newNode = this.ownerDocument.createTextNode(newText);
35543                 if(this.parentNode){
35544                         this.parentNode.insertBefore(newNode, this.nextSibling);
35545                 }
35546                 return newNode;
35547         }
35548   };
35549   _extends(Text,CharacterData);
35550   function Comment() {
35551   }Comment.prototype = {
35552         nodeName : "#comment",
35553         nodeType : COMMENT_NODE
35554   };
35555   _extends(Comment,CharacterData);
35556
35557   function CDATASection() {
35558   }CDATASection.prototype = {
35559         nodeName : "#cdata-section",
35560         nodeType : CDATA_SECTION_NODE
35561   };
35562   _extends(CDATASection,CharacterData);
35563
35564
35565   function DocumentType() {
35566   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
35567   _extends(DocumentType,Node$2);
35568
35569   function Notation() {
35570   }Notation.prototype.nodeType = NOTATION_NODE;
35571   _extends(Notation,Node$2);
35572
35573   function Entity() {
35574   }Entity.prototype.nodeType = ENTITY_NODE;
35575   _extends(Entity,Node$2);
35576
35577   function EntityReference() {
35578   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
35579   _extends(EntityReference,Node$2);
35580
35581   function DocumentFragment() {
35582   }DocumentFragment.prototype.nodeName =        "#document-fragment";
35583   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
35584   _extends(DocumentFragment,Node$2);
35585
35586
35587   function ProcessingInstruction() {
35588   }
35589   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
35590   _extends(ProcessingInstruction,Node$2);
35591   function XMLSerializer$1(){}
35592   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
35593         return nodeSerializeToString.call(node,isHtml,nodeFilter);
35594   };
35595   Node$2.prototype.toString = nodeSerializeToString;
35596   function nodeSerializeToString(isHtml,nodeFilter){
35597         var buf = [];
35598         var refNode = this.nodeType == 9?this.documentElement:this;
35599         var prefix = refNode.prefix;
35600         var uri = refNode.namespaceURI;
35601         
35602         if(uri && prefix == null){
35603                 //console.log(prefix)
35604                 var prefix = refNode.lookupPrefix(uri);
35605                 if(prefix == null){
35606                         //isHTML = true;
35607                         var visibleNamespaces=[
35608                         {namespace:uri,prefix:null}
35609                         //{namespace:uri,prefix:''}
35610                         ];
35611                 }
35612         }
35613         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
35614         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
35615         return buf.join('');
35616   }
35617   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
35618         var prefix = node.prefix||'';
35619         var uri = node.namespaceURI;
35620         if (!prefix && !uri){
35621                 return false;
35622         }
35623         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
35624                 || uri == 'http://www.w3.org/2000/xmlns/'){
35625                 return false;
35626         }
35627         
35628         var i = visibleNamespaces.length; 
35629         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
35630         while (i--) {
35631                 var ns = visibleNamespaces[i];
35632                 // get namespace prefix
35633                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
35634                 if (ns.prefix == prefix){
35635                         return ns.namespace != uri;
35636                 }
35637         }
35638         //console.log(isHTML,uri,prefix=='')
35639         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
35640         //      return false;
35641         //}
35642         //node.flag = '11111'
35643         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
35644         return true;
35645   }
35646   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
35647         if(nodeFilter){
35648                 node = nodeFilter(node);
35649                 if(node){
35650                         if(typeof node == 'string'){
35651                                 buf.push(node);
35652                                 return;
35653                         }
35654                 }else{
35655                         return;
35656                 }
35657                 //buf.sort.apply(attrs, attributeSorter);
35658         }
35659         switch(node.nodeType){
35660         case ELEMENT_NODE:
35661                 if (!visibleNamespaces) visibleNamespaces = [];
35662                 var startVisibleNamespaces = visibleNamespaces.length;
35663                 var attrs = node.attributes;
35664                 var len = attrs.length;
35665                 var child = node.firstChild;
35666                 var nodeName = node.tagName;
35667                 
35668                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
35669                 buf.push('<',nodeName);
35670                 
35671                 
35672                 
35673                 for(var i=0;i<len;i++){
35674                         // add namespaces for attributes
35675                         var attr = attrs.item(i);
35676                         if (attr.prefix == 'xmlns') {
35677                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
35678                         }else if(attr.nodeName == 'xmlns'){
35679                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
35680                         }
35681                 }
35682                 for(var i=0;i<len;i++){
35683                         var attr = attrs.item(i);
35684                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
35685                                 var prefix = attr.prefix||'';
35686                                 var uri = attr.namespaceURI;
35687                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
35688                                 buf.push(ns, '="' , uri , '"');
35689                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
35690                         }
35691                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
35692                 }
35693                 // add namespace for current node               
35694                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
35695                         var prefix = node.prefix||'';
35696                         var uri = node.namespaceURI;
35697                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
35698                         buf.push(ns, '="' , uri , '"');
35699                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
35700                 }
35701                 
35702                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
35703                         buf.push('>');
35704                         //if is cdata child node
35705                         if(isHTML && /^script$/i.test(nodeName)){
35706                                 while(child){
35707                                         if(child.data){
35708                                                 buf.push(child.data);
35709                                         }else{
35710                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35711                                         }
35712                                         child = child.nextSibling;
35713                                 }
35714                         }else
35715                         {
35716                                 while(child){
35717                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35718                                         child = child.nextSibling;
35719                                 }
35720                         }
35721                         buf.push('</',nodeName,'>');
35722                 }else{
35723                         buf.push('/>');
35724                 }
35725                 // remove added visible namespaces
35726                 //visibleNamespaces.length = startVisibleNamespaces;
35727                 return;
35728         case DOCUMENT_NODE:
35729         case DOCUMENT_FRAGMENT_NODE:
35730                 var child = node.firstChild;
35731                 while(child){
35732                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
35733                         child = child.nextSibling;
35734                 }
35735                 return;
35736         case ATTRIBUTE_NODE:
35737                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
35738         case TEXT_NODE:
35739                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
35740         case CDATA_SECTION_NODE:
35741                 return buf.push( '<![CDATA[',node.data,']]>');
35742         case COMMENT_NODE:
35743                 return buf.push( "<!--",node.data,"-->");
35744         case DOCUMENT_TYPE_NODE:
35745                 var pubid = node.publicId;
35746                 var sysid = node.systemId;
35747                 buf.push('<!DOCTYPE ',node.name);
35748                 if(pubid){
35749                         buf.push(' PUBLIC "',pubid);
35750                         if (sysid && sysid!='.') {
35751                                 buf.push( '" "',sysid);
35752                         }
35753                         buf.push('">');
35754                 }else if(sysid && sysid!='.'){
35755                         buf.push(' SYSTEM "',sysid,'">');
35756                 }else{
35757                         var sub = node.internalSubset;
35758                         if(sub){
35759                                 buf.push(" [",sub,"]");
35760                         }
35761                         buf.push(">");
35762                 }
35763                 return;
35764         case PROCESSING_INSTRUCTION_NODE:
35765                 return buf.push( "<?",node.target," ",node.data,"?>");
35766         case ENTITY_REFERENCE_NODE:
35767                 return buf.push( '&',node.nodeName,';');
35768         //case ENTITY_NODE:
35769         //case NOTATION_NODE:
35770         default:
35771                 buf.push('??',node.nodeName);
35772         }
35773   }
35774   function importNode(doc,node,deep){
35775         var node2;
35776         switch (node.nodeType) {
35777         case ELEMENT_NODE:
35778                 node2 = node.cloneNode(false);
35779                 node2.ownerDocument = doc;
35780                 //var attrs = node2.attributes;
35781                 //var len = attrs.length;
35782                 //for(var i=0;i<len;i++){
35783                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
35784                 //}
35785         case DOCUMENT_FRAGMENT_NODE:
35786                 break;
35787         case ATTRIBUTE_NODE:
35788                 deep = true;
35789                 break;
35790         //case ENTITY_REFERENCE_NODE:
35791         //case PROCESSING_INSTRUCTION_NODE:
35792         ////case TEXT_NODE:
35793         //case CDATA_SECTION_NODE:
35794         //case COMMENT_NODE:
35795         //      deep = false;
35796         //      break;
35797         //case DOCUMENT_NODE:
35798         //case DOCUMENT_TYPE_NODE:
35799         //cannot be imported.
35800         //case ENTITY_NODE:
35801         //case NOTATION_NODE:
35802         //can not hit in level3
35803         //default:throw e;
35804         }
35805         if(!node2){
35806                 node2 = node.cloneNode(false);//false
35807         }
35808         node2.ownerDocument = doc;
35809         node2.parentNode = null;
35810         if(deep){
35811                 var child = node.firstChild;
35812                 while(child){
35813                         node2.appendChild(importNode(doc,child,deep));
35814                         child = child.nextSibling;
35815                 }
35816         }
35817         return node2;
35818   }
35819   //
35820   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
35821   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
35822   function cloneNode(doc,node,deep){
35823         var node2 = new node.constructor();
35824         for(var n in node){
35825                 var v = node[n];
35826                 if(typeof v != 'object' ){
35827                         if(v != node2[n]){
35828                                 node2[n] = v;
35829                         }
35830                 }
35831         }
35832         if(node.childNodes){
35833                 node2.childNodes = new NodeList();
35834         }
35835         node2.ownerDocument = doc;
35836         switch (node2.nodeType) {
35837         case ELEMENT_NODE:
35838                 var attrs       = node.attributes;
35839                 var attrs2      = node2.attributes = new NamedNodeMap();
35840                 var len = attrs.length;
35841                 attrs2._ownerElement = node2;
35842                 for(var i=0;i<len;i++){
35843                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
35844                 }
35845                 break;
35846         case ATTRIBUTE_NODE:
35847                 deep = true;
35848         }
35849         if(deep){
35850                 var child = node.firstChild;
35851                 while(child){
35852                         node2.appendChild(cloneNode(doc,child,deep));
35853                         child = child.nextSibling;
35854                 }
35855         }
35856         return node2;
35857   }
35858
35859   function __set__(object,key,value){
35860         object[key] = value;
35861   }
35862   //do dynamic
35863   try{
35864         if(Object.defineProperty){
35865                 Object.defineProperty(LiveNodeList.prototype,'length',{
35866                         get:function(){
35867                                 _updateLiveList(this);
35868                                 return this.$$length;
35869                         }
35870                 });
35871                 Object.defineProperty(Node$2.prototype,'textContent',{
35872                         get:function(){
35873                                 return getTextContent(this);
35874                         },
35875                         set:function(data){
35876                                 switch(this.nodeType){
35877                                 case ELEMENT_NODE:
35878                                 case DOCUMENT_FRAGMENT_NODE:
35879                                         while(this.firstChild){
35880                                                 this.removeChild(this.firstChild);
35881                                         }
35882                                         if(data || String(data)){
35883                                                 this.appendChild(this.ownerDocument.createTextNode(data));
35884                                         }
35885                                         break;
35886                                 default:
35887                                         //TODO:
35888                                         this.data = data;
35889                                         this.value = data;
35890                                         this.nodeValue = data;
35891                                 }
35892                         }
35893                 });
35894                 
35895                 function getTextContent(node){
35896                         switch(node.nodeType){
35897                         case ELEMENT_NODE:
35898                         case DOCUMENT_FRAGMENT_NODE:
35899                                 var buf = [];
35900                                 node = node.firstChild;
35901                                 while(node){
35902                                         if(node.nodeType!==7 && node.nodeType !==8){
35903                                                 buf.push(getTextContent(node));
35904                                         }
35905                                         node = node.nextSibling;
35906                                 }
35907                                 return buf.join('');
35908                         default:
35909                                 return node.nodeValue;
35910                         }
35911                 }
35912                 __set__ = function(object,key,value){
35913                         //console.log(value)
35914                         object['$$'+key] = value;
35915                 };
35916         }
35917   }catch(e){//ie8
35918   }
35919
35920   //if(typeof require == 'function'){
35921         var DOMImplementation_1 = DOMImplementation;
35922         var XMLSerializer_1 = XMLSerializer$1;
35923   //}
35924
35925   var dom = {
35926         DOMImplementation: DOMImplementation_1,
35927         XMLSerializer: XMLSerializer_1
35928   };
35929
35930   var domParser = createCommonjsModule(function (module, exports) {
35931   function DOMParser(options){
35932         this.options = options ||{locator:{}};
35933         
35934   }
35935   DOMParser.prototype.parseFromString = function(source,mimeType){
35936         var options = this.options;
35937         var sax =  new XMLReader();
35938         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
35939         var errorHandler = options.errorHandler;
35940         var locator = options.locator;
35941         var defaultNSMap = options.xmlns||{};
35942         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
35943         if(locator){
35944                 domBuilder.setDocumentLocator(locator);
35945         }
35946         
35947         sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
35948         sax.domBuilder = options.domBuilder || domBuilder;
35949         if(/\/x?html?$/.test(mimeType)){
35950                 entityMap.nbsp = '\xa0';
35951                 entityMap.copy = '\xa9';
35952                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
35953         }
35954         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
35955         if(source){
35956                 sax.parse(source,defaultNSMap,entityMap);
35957         }else{
35958                 sax.errorHandler.error("invalid doc source");
35959         }
35960         return domBuilder.doc;
35961   };
35962   function buildErrorHandler(errorImpl,domBuilder,locator){
35963         if(!errorImpl){
35964                 if(domBuilder instanceof DOMHandler){
35965                         return domBuilder;
35966                 }
35967                 errorImpl = domBuilder ;
35968         }
35969         var errorHandler = {};
35970         var isCallback = errorImpl instanceof Function;
35971         locator = locator||{};
35972         function build(key){
35973                 var fn = errorImpl[key];
35974                 if(!fn && isCallback){
35975                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
35976                 }
35977                 errorHandler[key] = fn && function(msg){
35978                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
35979                 }||function(){};
35980         }
35981         build('warning');
35982         build('error');
35983         build('fatalError');
35984         return errorHandler;
35985   }
35986
35987   //console.log('#\n\n\n\n\n\n\n####')
35988   /**
35989    * +ContentHandler+ErrorHandler
35990    * +LexicalHandler+EntityResolver2
35991    * -DeclHandler-DTDHandler 
35992    * 
35993    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
35994    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
35995    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
35996    */
35997   function DOMHandler() {
35998       this.cdata = false;
35999   }
36000   function position(locator,node){
36001         node.lineNumber = locator.lineNumber;
36002         node.columnNumber = locator.columnNumber;
36003   }
36004   /**
36005    * @see org.xml.sax.ContentHandler#startDocument
36006    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
36007    */ 
36008   DOMHandler.prototype = {
36009         startDocument : function() {
36010         this.doc = new DOMImplementation().createDocument(null, null, null);
36011         if (this.locator) {
36012                 this.doc.documentURI = this.locator.systemId;
36013         }
36014         },
36015         startElement:function(namespaceURI, localName, qName, attrs) {
36016                 var doc = this.doc;
36017             var el = doc.createElementNS(namespaceURI, qName||localName);
36018             var len = attrs.length;
36019             appendElement(this, el);
36020             this.currentElement = el;
36021             
36022                 this.locator && position(this.locator,el);
36023             for (var i = 0 ; i < len; i++) {
36024                 var namespaceURI = attrs.getURI(i);
36025                 var value = attrs.getValue(i);
36026                 var qName = attrs.getQName(i);
36027                         var attr = doc.createAttributeNS(namespaceURI, qName);
36028                         this.locator &&position(attrs.getLocator(i),attr);
36029                         attr.value = attr.nodeValue = value;
36030                         el.setAttributeNode(attr);
36031             }
36032         },
36033         endElement:function(namespaceURI, localName, qName) {
36034                 var current = this.currentElement;
36035                 var tagName = current.tagName;
36036                 this.currentElement = current.parentNode;
36037         },
36038         startPrefixMapping:function(prefix, uri) {
36039         },
36040         endPrefixMapping:function(prefix) {
36041         },
36042         processingInstruction:function(target, data) {
36043             var ins = this.doc.createProcessingInstruction(target, data);
36044             this.locator && position(this.locator,ins);
36045             appendElement(this, ins);
36046         },
36047         ignorableWhitespace:function(ch, start, length) {
36048         },
36049         characters:function(chars, start, length) {
36050                 chars = _toString.apply(this,arguments);
36051                 //console.log(chars)
36052                 if(chars){
36053                         if (this.cdata) {
36054                                 var charNode = this.doc.createCDATASection(chars);
36055                         } else {
36056                                 var charNode = this.doc.createTextNode(chars);
36057                         }
36058                         if(this.currentElement){
36059                                 this.currentElement.appendChild(charNode);
36060                         }else if(/^\s*$/.test(chars)){
36061                                 this.doc.appendChild(charNode);
36062                                 //process xml
36063                         }
36064                         this.locator && position(this.locator,charNode);
36065                 }
36066         },
36067         skippedEntity:function(name) {
36068         },
36069         endDocument:function() {
36070                 this.doc.normalize();
36071         },
36072         setDocumentLocator:function (locator) {
36073             if(this.locator = locator){// && !('lineNumber' in locator)){
36074                 locator.lineNumber = 0;
36075             }
36076         },
36077         //LexicalHandler
36078         comment:function(chars, start, length) {
36079                 chars = _toString.apply(this,arguments);
36080             var comm = this.doc.createComment(chars);
36081             this.locator && position(this.locator,comm);
36082             appendElement(this, comm);
36083         },
36084         
36085         startCDATA:function() {
36086             //used in characters() methods
36087             this.cdata = true;
36088         },
36089         endCDATA:function() {
36090             this.cdata = false;
36091         },
36092         
36093         startDTD:function(name, publicId, systemId) {
36094                 var impl = this.doc.implementation;
36095             if (impl && impl.createDocumentType) {
36096                 var dt = impl.createDocumentType(name, publicId, systemId);
36097                 this.locator && position(this.locator,dt);
36098                 appendElement(this, dt);
36099             }
36100         },
36101         /**
36102          * @see org.xml.sax.ErrorHandler
36103          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
36104          */
36105         warning:function(error) {
36106                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
36107         },
36108         error:function(error) {
36109                 console.error('[xmldom error]\t'+error,_locator(this.locator));
36110         },
36111         fatalError:function(error) {
36112                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
36113             throw error;
36114         }
36115   };
36116   function _locator(l){
36117         if(l){
36118                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
36119         }
36120   }
36121   function _toString(chars,start,length){
36122         if(typeof chars == 'string'){
36123                 return chars.substr(start,length)
36124         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
36125                 if(chars.length >= start+length || start){
36126                         return new java.lang.String(chars,start,length)+'';
36127                 }
36128                 return chars;
36129         }
36130   }
36131
36132   /*
36133    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
36134    * used method of org.xml.sax.ext.LexicalHandler:
36135    *  #comment(chars, start, length)
36136    *  #startCDATA()
36137    *  #endCDATA()
36138    *  #startDTD(name, publicId, systemId)
36139    *
36140    *
36141    * IGNORED method of org.xml.sax.ext.LexicalHandler:
36142    *  #endDTD()
36143    *  #startEntity(name)
36144    *  #endEntity(name)
36145    *
36146    *
36147    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
36148    * IGNORED method of org.xml.sax.ext.DeclHandler
36149    *    #attributeDecl(eName, aName, type, mode, value)
36150    *  #elementDecl(name, model)
36151    *  #externalEntityDecl(name, publicId, systemId)
36152    *  #internalEntityDecl(name, value)
36153    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
36154    * IGNORED method of org.xml.sax.EntityResolver2
36155    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
36156    *  #resolveEntity(publicId, systemId)
36157    *  #getExternalSubset(name, baseURI)
36158    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
36159    * IGNORED method of org.xml.sax.DTDHandler
36160    *  #notationDecl(name, publicId, systemId) {};
36161    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
36162    */
36163   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
36164         DOMHandler.prototype[key] = function(){return null};
36165   });
36166
36167   /* 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 */
36168   function appendElement (hander,node) {
36169       if (!hander.currentElement) {
36170           hander.doc.appendChild(node);
36171       } else {
36172           hander.currentElement.appendChild(node);
36173       }
36174   }//appendChild and setAttributeNS are preformance key
36175
36176   //if(typeof require == 'function'){
36177         var XMLReader = sax.XMLReader;
36178         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
36179         exports.XMLSerializer = dom.XMLSerializer ;
36180         exports.DOMParser = DOMParser;
36181   //}
36182   });
36183   var domParser_1 = domParser.DOMImplementation;
36184   var domParser_2 = domParser.XMLSerializer;
36185   var domParser_3 = domParser.DOMParser;
36186
36187   var togeojson = createCommonjsModule(function (module, exports) {
36188   var toGeoJSON = (function() {
36189
36190       var removeSpace = /\s*/g,
36191           trimSpace = /^\s*|\s*$/g,
36192           splitSpace = /\s+/;
36193       // generate a short, numeric hash of a string
36194       function okhash(x) {
36195           if (!x || !x.length) return 0;
36196           for (var i = 0, h = 0; i < x.length; i++) {
36197               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
36198           } return h;
36199       }
36200       // all Y children of X
36201       function get(x, y) { return x.getElementsByTagName(y); }
36202       function attr(x, y) { return x.getAttribute(y); }
36203       function attrf(x, y) { return parseFloat(attr(x, y)); }
36204       // one Y child of X, if any, otherwise null
36205       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
36206       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
36207       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
36208       // cast array x into numbers
36209       function numarray(x) {
36210           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
36211           return o;
36212       }
36213       // get the content of a text node, if any
36214       function nodeVal(x) {
36215           if (x) { norm(x); }
36216           return (x && x.textContent) || '';
36217       }
36218       // get the contents of multiple text nodes, if present
36219       function getMulti(x, ys) {
36220           var o = {}, n, k;
36221           for (k = 0; k < ys.length; k++) {
36222               n = get1(x, ys[k]);
36223               if (n) o[ys[k]] = nodeVal(n);
36224           }
36225           return o;
36226       }
36227       // add properties of Y to X, overwriting if present in both
36228       function extend(x, y) { for (var k in y) x[k] = y[k]; }
36229       // get one coordinate from a coordinate array, if any
36230       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
36231       // get all coordinates from a coordinate array as [[],[]]
36232       function coord(v) {
36233           var coords = v.replace(trimSpace, '').split(splitSpace),
36234               o = [];
36235           for (var i = 0; i < coords.length; i++) {
36236               o.push(coord1(coords[i]));
36237           }
36238           return o;
36239       }
36240       function coordPair(x) {
36241           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
36242               ele = get1(x, 'ele'),
36243               // handle namespaced attribute in browser
36244               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
36245               time = get1(x, 'time'),
36246               e;
36247           if (ele) {
36248               e = parseFloat(nodeVal(ele));
36249               if (!isNaN(e)) {
36250                   ll.push(e);
36251               }
36252           }
36253           return {
36254               coordinates: ll,
36255               time: time ? nodeVal(time) : null,
36256               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
36257           };
36258       }
36259
36260       // create a new feature collection parent object
36261       function fc() {
36262           return {
36263               type: 'FeatureCollection',
36264               features: []
36265           };
36266       }
36267
36268       var serializer;
36269       if (typeof XMLSerializer !== 'undefined') {
36270           /* istanbul ignore next */
36271           serializer = new XMLSerializer();
36272       // only require xmldom in a node environment
36273       } else if (typeof process === 'object' && !process.browser) {
36274           serializer = new (domParser.XMLSerializer)();
36275       }
36276       function xml2str(str) {
36277           // IE9 will create a new XMLSerializer but it'll crash immediately.
36278           // This line is ignored because we don't run coverage tests in IE9
36279           /* istanbul ignore next */
36280           if (str.xml !== undefined) return str.xml;
36281           return serializer.serializeToString(str);
36282       }
36283
36284       var t = {
36285           kml: function(doc) {
36286
36287               var gj = fc(),
36288                   // styleindex keeps track of hashed styles in order to match features
36289                   styleIndex = {}, styleByHash = {},
36290                   // stylemapindex keeps track of style maps to expose in properties
36291                   styleMapIndex = {},
36292                   // atomic geospatial types supported by KML - MultiGeometry is
36293                   // handled separately
36294                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
36295                   // all root placemarks in the file
36296                   placemarks = get(doc, 'Placemark'),
36297                   styles = get(doc, 'Style'),
36298                   styleMaps = get(doc, 'StyleMap');
36299
36300               for (var k = 0; k < styles.length; k++) {
36301                   var hash = okhash(xml2str(styles[k])).toString(16);
36302                   styleIndex['#' + attr(styles[k], 'id')] = hash;
36303                   styleByHash[hash] = styles[k];
36304               }
36305               for (var l = 0; l < styleMaps.length; l++) {
36306                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
36307                   var pairs = get(styleMaps[l], 'Pair');
36308                   var pairsMap = {};
36309                   for (var m = 0; m < pairs.length; m++) {
36310                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
36311                   }
36312                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
36313
36314               }
36315               for (var j = 0; j < placemarks.length; j++) {
36316                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
36317               }
36318               function kmlColor(v) {
36319                   var color, opacity;
36320                   v = v || '';
36321                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
36322                   if (v.length === 6 || v.length === 3) { color = v; }
36323                   if (v.length === 8) {
36324                       opacity = parseInt(v.substr(0, 2), 16) / 255;
36325                       color = '#' + v.substr(6, 2) +
36326                           v.substr(4, 2) +
36327                           v.substr(2, 2);
36328                   }
36329                   return [color, isNaN(opacity) ? undefined : opacity];
36330               }
36331               function gxCoord(v) { return numarray(v.split(' ')); }
36332               function gxCoords(root) {
36333                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
36334                   if (elems.length === 0) elems = get(root, 'gx:coord');
36335                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
36336                   var timeElems = get(root, 'when');
36337                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
36338                   return {
36339                       coords: coords,
36340                       times: times
36341                   };
36342               }
36343               function getGeometry(root) {
36344                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
36345                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
36346                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
36347                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
36348                   for (i = 0; i < geotypes.length; i++) {
36349                       geomNodes = get(root, geotypes[i]);
36350                       if (geomNodes) {
36351                           for (j = 0; j < geomNodes.length; j++) {
36352                               geomNode = geomNodes[j];
36353                               if (geotypes[i] === 'Point') {
36354                                   geoms.push({
36355                                       type: 'Point',
36356                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
36357                                   });
36358                               } else if (geotypes[i] === 'LineString') {
36359                                   geoms.push({
36360                                       type: 'LineString',
36361                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
36362                                   });
36363                               } else if (geotypes[i] === 'Polygon') {
36364                                   var rings = get(geomNode, 'LinearRing'),
36365                                       coords = [];
36366                                   for (k = 0; k < rings.length; k++) {
36367                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
36368                                   }
36369                                   geoms.push({
36370                                       type: 'Polygon',
36371                                       coordinates: coords
36372                                   });
36373                               } else if (geotypes[i] === 'Track' ||
36374                                   geotypes[i] === 'gx:Track') {
36375                                   var track = gxCoords(geomNode);
36376                                   geoms.push({
36377                                       type: 'LineString',
36378                                       coordinates: track.coords
36379                                   });
36380                                   if (track.times.length) coordTimes.push(track.times);
36381                               }
36382                           }
36383                       }
36384                   }
36385                   return {
36386                       geoms: geoms,
36387                       coordTimes: coordTimes
36388                   };
36389               }
36390               function getPlacemark(root) {
36391                   var geomsAndTimes = getGeometry(root), i, properties = {},
36392                       name = nodeVal(get1(root, 'name')),
36393                       address = nodeVal(get1(root, 'address')),
36394                       styleUrl = nodeVal(get1(root, 'styleUrl')),
36395                       description = nodeVal(get1(root, 'description')),
36396                       timeSpan = get1(root, 'TimeSpan'),
36397                       timeStamp = get1(root, 'TimeStamp'),
36398                       extendedData = get1(root, 'ExtendedData'),
36399                       lineStyle = get1(root, 'LineStyle'),
36400                       polyStyle = get1(root, 'PolyStyle'),
36401                       visibility = get1(root, 'visibility');
36402
36403                   if (!geomsAndTimes.geoms.length) return [];
36404                   if (name) properties.name = name;
36405                   if (address) properties.address = address;
36406                   if (styleUrl) {
36407                       if (styleUrl[0] !== '#') {
36408                           styleUrl = '#' + styleUrl;
36409                       }
36410
36411                       properties.styleUrl = styleUrl;
36412                       if (styleIndex[styleUrl]) {
36413                           properties.styleHash = styleIndex[styleUrl];
36414                       }
36415                       if (styleMapIndex[styleUrl]) {
36416                           properties.styleMapHash = styleMapIndex[styleUrl];
36417                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
36418                       }
36419                       // Try to populate the lineStyle or polyStyle since we got the style hash
36420                       var style = styleByHash[properties.styleHash];
36421                       if (style) {
36422                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
36423                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
36424                       }
36425                   }
36426                   if (description) properties.description = description;
36427                   if (timeSpan) {
36428                       var begin = nodeVal(get1(timeSpan, 'begin'));
36429                       var end = nodeVal(get1(timeSpan, 'end'));
36430                       properties.timespan = { begin: begin, end: end };
36431                   }
36432                   if (timeStamp) {
36433                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
36434                   }
36435                   if (lineStyle) {
36436                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
36437                           color = linestyles[0],
36438                           opacity = linestyles[1],
36439                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
36440                       if (color) properties.stroke = color;
36441                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
36442                       if (!isNaN(width)) properties['stroke-width'] = width;
36443                   }
36444                   if (polyStyle) {
36445                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
36446                           pcolor = polystyles[0],
36447                           popacity = polystyles[1],
36448                           fill = nodeVal(get1(polyStyle, 'fill')),
36449                           outline = nodeVal(get1(polyStyle, 'outline'));
36450                       if (pcolor) properties.fill = pcolor;
36451                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
36452                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
36453                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
36454                   }
36455                   if (extendedData) {
36456                       var datas = get(extendedData, 'Data'),
36457                           simpleDatas = get(extendedData, 'SimpleData');
36458
36459                       for (i = 0; i < datas.length; i++) {
36460                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
36461                       }
36462                       for (i = 0; i < simpleDatas.length; i++) {
36463                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
36464                       }
36465                   }
36466                   if (visibility) {
36467                       properties.visibility = nodeVal(visibility);
36468                   }
36469                   if (geomsAndTimes.coordTimes.length) {
36470                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
36471                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
36472                   }
36473                   var feature = {
36474                       type: 'Feature',
36475                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
36476                           type: 'GeometryCollection',
36477                           geometries: geomsAndTimes.geoms
36478                       },
36479                       properties: properties
36480                   };
36481                   if (attr(root, 'id')) feature.id = attr(root, 'id');
36482                   return [feature];
36483               }
36484               return gj;
36485           },
36486           gpx: function(doc) {
36487               var i,
36488                   tracks = get(doc, 'trk'),
36489                   routes = get(doc, 'rte'),
36490                   waypoints = get(doc, 'wpt'),
36491                   // a feature collection
36492                   gj = fc(),
36493                   feature;
36494               for (i = 0; i < tracks.length; i++) {
36495                   feature = getTrack(tracks[i]);
36496                   if (feature) gj.features.push(feature);
36497               }
36498               for (i = 0; i < routes.length; i++) {
36499                   feature = getRoute(routes[i]);
36500                   if (feature) gj.features.push(feature);
36501               }
36502               for (i = 0; i < waypoints.length; i++) {
36503                   gj.features.push(getPoint(waypoints[i]));
36504               }
36505               function getPoints(node, pointname) {
36506                   var pts = get(node, pointname),
36507                       line = [],
36508                       times = [],
36509                       heartRates = [],
36510                       l = pts.length;
36511                   if (l < 2) return {};  // Invalid line in GeoJSON
36512                   for (var i = 0; i < l; i++) {
36513                       var c = coordPair(pts[i]);
36514                       line.push(c.coordinates);
36515                       if (c.time) times.push(c.time);
36516                       if (c.heartRate) heartRates.push(c.heartRate);
36517                   }
36518                   return {
36519                       line: line,
36520                       times: times,
36521                       heartRates: heartRates
36522                   };
36523               }
36524               function getTrack(node) {
36525                   var segments = get(node, 'trkseg'),
36526                       track = [],
36527                       times = [],
36528                       heartRates = [],
36529                       line;
36530                   for (var i = 0; i < segments.length; i++) {
36531                       line = getPoints(segments[i], 'trkpt');
36532                       if (line) {
36533                           if (line.line) track.push(line.line);
36534                           if (line.times && line.times.length) times.push(line.times);
36535                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
36536                       }
36537                   }
36538                   if (track.length === 0) return;
36539                   var properties = getProperties(node);
36540                   extend(properties, getLineStyle(get1(node, 'extensions')));
36541                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
36542                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
36543                   return {
36544                       type: 'Feature',
36545                       properties: properties,
36546                       geometry: {
36547                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
36548                           coordinates: track.length === 1 ? track[0] : track
36549                       }
36550                   };
36551               }
36552               function getRoute(node) {
36553                   var line = getPoints(node, 'rtept');
36554                   if (!line.line) return;
36555                   var prop = getProperties(node);
36556                   extend(prop, getLineStyle(get1(node, 'extensions')));
36557                   var routeObj = {
36558                       type: 'Feature',
36559                       properties: prop,
36560                       geometry: {
36561                           type: 'LineString',
36562                           coordinates: line.line
36563                       }
36564                   };
36565                   return routeObj;
36566               }
36567               function getPoint(node) {
36568                   var prop = getProperties(node);
36569                   extend(prop, getMulti(node, ['sym']));
36570                   return {
36571                       type: 'Feature',
36572                       properties: prop,
36573                       geometry: {
36574                           type: 'Point',
36575                           coordinates: coordPair(node).coordinates
36576                       }
36577                   };
36578               }
36579               function getLineStyle(extensions) {
36580                   var style = {};
36581                   if (extensions) {
36582                       var lineStyle = get1(extensions, 'line');
36583                       if (lineStyle) {
36584                           var color = nodeVal(get1(lineStyle, 'color')),
36585                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
36586                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
36587                           if (color) style.stroke = color;
36588                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
36589                           // GPX width is in mm, convert to px with 96 px per inch
36590                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
36591                       }
36592                   }
36593                   return style;
36594               }
36595               function getProperties(node) {
36596                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
36597                       links = get(node, 'link');
36598                   if (links.length) prop.links = [];
36599                   for (var i = 0, link; i < links.length; i++) {
36600                       link = { href: attr(links[i], 'href') };
36601                       extend(link, getMulti(links[i], ['text', 'type']));
36602                       prop.links.push(link);
36603                   }
36604                   return prop;
36605               }
36606               return gj;
36607           }
36608       };
36609       return t;
36610   })();
36611
36612   module.exports = toGeoJSON;
36613   });
36614
36615   var _initialized = false;
36616   var _enabled = false;
36617   var _geojson;
36618
36619
36620   function svgData(projection, context, dispatch) {
36621       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36622       var _showLabels = true;
36623       var detected = utilDetect();
36624       var layer = select(null);
36625       var _vtService;
36626       var _fileList;
36627       var _template;
36628       var _src;
36629
36630
36631       function init() {
36632           if (_initialized) return;  // run once
36633
36634           _geojson = {};
36635           _enabled = true;
36636
36637           function over() {
36638               event.stopPropagation();
36639               event.preventDefault();
36640               event.dataTransfer.dropEffect = 'copy';
36641           }
36642
36643           select('body')
36644               .attr('dropzone', 'copy')
36645               .on('drop.svgData', function() {
36646                   event.stopPropagation();
36647                   event.preventDefault();
36648                   if (!detected.filedrop) return;
36649                   drawData.fileList(event.dataTransfer.files);
36650               })
36651               .on('dragenter.svgData', over)
36652               .on('dragexit.svgData', over)
36653               .on('dragover.svgData', over);
36654
36655           _initialized = true;
36656       }
36657
36658
36659       function getService() {
36660           if (services.vectorTile && !_vtService) {
36661               _vtService = services.vectorTile;
36662               _vtService.event.on('loadedData', throttledRedraw);
36663           } else if (!services.vectorTile && _vtService) {
36664               _vtService = null;
36665           }
36666
36667           return _vtService;
36668       }
36669
36670
36671       function showLayer() {
36672           layerOn();
36673
36674           layer
36675               .style('opacity', 0)
36676               .transition()
36677               .duration(250)
36678               .style('opacity', 1)
36679               .on('end', function () { dispatch.call('change'); });
36680       }
36681
36682
36683       function hideLayer() {
36684           throttledRedraw.cancel();
36685
36686           layer
36687               .transition()
36688               .duration(250)
36689               .style('opacity', 0)
36690               .on('end', layerOff);
36691       }
36692
36693
36694       function layerOn() {
36695           layer.style('display', 'block');
36696       }
36697
36698
36699       function layerOff() {
36700           layer.selectAll('.viewfield-group').remove();
36701           layer.style('display', 'none');
36702       }
36703
36704
36705       // ensure that all geojson features in a collection have IDs
36706       function ensureIDs(gj) {
36707           if (!gj) return null;
36708
36709           if (gj.type === 'FeatureCollection') {
36710               for (var i = 0; i < gj.features.length; i++) {
36711                   ensureFeatureID(gj.features[i]);
36712               }
36713           } else {
36714               ensureFeatureID(gj);
36715           }
36716           return gj;
36717       }
36718
36719
36720       // ensure that each single Feature object has a unique ID
36721       function ensureFeatureID(feature) {
36722           if (!feature) return;
36723           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
36724           return feature;
36725       }
36726
36727
36728       // Prefer an array of Features instead of a FeatureCollection
36729       function getFeatures(gj) {
36730           if (!gj) return [];
36731
36732           if (gj.type === 'FeatureCollection') {
36733               return gj.features;
36734           } else {
36735               return [gj];
36736           }
36737       }
36738
36739
36740       function featureKey(d) {
36741           return d.__featurehash__;
36742       }
36743
36744
36745       function isPolygon(d) {
36746           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
36747       }
36748
36749
36750       function clipPathID(d) {
36751           return 'data-' + d.__featurehash__ + '-clippath';
36752       }
36753
36754
36755       function featureClasses(d) {
36756           return [
36757               'data' + d.__featurehash__,
36758               d.geometry.type,
36759               isPolygon(d) ? 'area' : '',
36760               d.__layerID__ || ''
36761           ].filter(Boolean).join(' ');
36762       }
36763
36764
36765       function drawData(selection) {
36766           var vtService = getService();
36767           var getPath = svgPath(projection).geojson;
36768           var getAreaPath = svgPath(projection, null, true).geojson;
36769           var hasData = drawData.hasData();
36770
36771           layer = selection.selectAll('.layer-mapdata')
36772               .data(_enabled && hasData ? [0] : []);
36773
36774           layer.exit()
36775               .remove();
36776
36777           layer = layer.enter()
36778               .append('g')
36779               .attr('class', 'layer-mapdata')
36780               .merge(layer);
36781
36782           var surface = context.surface();
36783           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
36784
36785
36786           // Gather data
36787           var geoData, polygonData;
36788           if (_template && vtService) {   // fetch data from vector tile service
36789               var sourceID = _template;
36790               vtService.loadTiles(sourceID, _template, projection);
36791               geoData = vtService.data(sourceID, projection);
36792           } else {
36793               geoData = getFeatures(_geojson);
36794           }
36795           geoData = geoData.filter(getPath);
36796           polygonData = geoData.filter(isPolygon);
36797
36798
36799           // Draw clip paths for polygons
36800           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
36801              .data(polygonData, featureKey);
36802
36803           clipPaths.exit()
36804              .remove();
36805
36806           var clipPathsEnter = clipPaths.enter()
36807              .append('clipPath')
36808              .attr('class', 'clipPath-data')
36809              .attr('id', clipPathID);
36810
36811           clipPathsEnter
36812              .append('path');
36813
36814           clipPaths.merge(clipPathsEnter)
36815              .selectAll('path')
36816              .attr('d', getAreaPath);
36817
36818
36819           // Draw fill, shadow, stroke layers
36820           var datagroups = layer
36821               .selectAll('g.datagroup')
36822               .data(['fill', 'shadow', 'stroke']);
36823
36824           datagroups = datagroups.enter()
36825               .append('g')
36826               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
36827               .merge(datagroups);
36828
36829
36830           // Draw paths
36831           var pathData = {
36832               fill: polygonData,
36833               shadow: geoData,
36834               stroke: geoData
36835           };
36836
36837           var paths = datagroups
36838               .selectAll('path')
36839               .data(function(layer) { return pathData[layer]; }, featureKey);
36840
36841           // exit
36842           paths.exit()
36843               .remove();
36844
36845           // enter/update
36846           paths = paths.enter()
36847               .append('path')
36848               .attr('class', function(d) {
36849                   var datagroup = this.parentNode.__data__;
36850                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
36851               })
36852               .attr('clip-path', function(d) {
36853                   var datagroup = this.parentNode.__data__;
36854                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
36855               })
36856               .merge(paths)
36857               .attr('d', function(d) {
36858                   var datagroup = this.parentNode.__data__;
36859                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
36860               });
36861
36862
36863           // Draw labels
36864           layer
36865               .call(drawLabels, 'label-halo', geoData)
36866               .call(drawLabels, 'label', geoData);
36867
36868
36869           function drawLabels(selection, textClass, data) {
36870               var labelPath = d3_geoPath(projection);
36871               var labelData = data.filter(function(d) {
36872                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
36873               });
36874
36875               var labels = selection.selectAll('text.' + textClass)
36876                   .data(labelData, featureKey);
36877
36878               // exit
36879               labels.exit()
36880                   .remove();
36881
36882               // enter/update
36883               labels = labels.enter()
36884                   .append('text')
36885                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
36886                   .merge(labels)
36887                   .text(function(d) {
36888                       return d.properties.desc || d.properties.name;
36889                   })
36890                   .attr('x', function(d) {
36891                       var centroid = labelPath.centroid(d);
36892                       return centroid[0] + 11;
36893                   })
36894                   .attr('y', function(d) {
36895                       var centroid = labelPath.centroid(d);
36896                       return centroid[1];
36897                   });
36898           }
36899       }
36900
36901
36902       function getExtension(fileName) {
36903           if (!fileName) return;
36904
36905           var re = /\.(gpx|kml|(geo)?json)$/i;
36906           var match = fileName.toLowerCase().match(re);
36907           return match && match.length && match[0];
36908       }
36909
36910
36911       function xmlToDom(textdata) {
36912           return (new DOMParser()).parseFromString(textdata, 'text/xml');
36913       }
36914
36915
36916       drawData.setFile = function(extension, data) {
36917           _template = null;
36918           _fileList = null;
36919           _geojson = null;
36920           _src = null;
36921
36922           var gj;
36923           switch (extension) {
36924               case '.gpx':
36925                   gj = togeojson.gpx(xmlToDom(data));
36926                   break;
36927               case '.kml':
36928                   gj = togeojson.kml(xmlToDom(data));
36929                   break;
36930               case '.geojson':
36931               case '.json':
36932                   gj = JSON.parse(data);
36933                   break;
36934           }
36935
36936           if (!isEmpty(gj)) {
36937               _geojson = ensureIDs(gj);
36938               _src = extension + ' data file';
36939               this.fitZoom();
36940           }
36941
36942           dispatch.call('change');
36943           return this;
36944       };
36945
36946
36947       drawData.showLabels = function(val) {
36948           if (!arguments.length) return _showLabels;
36949
36950           _showLabels = val;
36951           return this;
36952       };
36953
36954
36955       drawData.enabled = function(val) {
36956           if (!arguments.length) return _enabled;
36957
36958           _enabled = val;
36959           if (_enabled) {
36960               showLayer();
36961           } else {
36962               hideLayer();
36963           }
36964
36965           dispatch.call('change');
36966           return this;
36967       };
36968
36969
36970       drawData.hasData = function() {
36971           return !!(_template || !isEmpty(_geojson));
36972       };
36973
36974
36975       drawData.template = function(val, src) {
36976           if (!arguments.length) return _template;
36977
36978           // test source against OSM imagery blacklists..
36979           var osm = context.connection();
36980           if (osm) {
36981               var blacklists = osm.imageryBlacklists();
36982               var fail = false;
36983               var tested = 0;
36984               var regex;
36985
36986               for (var i = 0; i < blacklists.length; i++) {
36987                   try {
36988                       regex = new RegExp(blacklists[i]);
36989                       fail = regex.test(val);
36990                       tested++;
36991                       if (fail) break;
36992                   } catch (e) {
36993                       /* noop */
36994                   }
36995               }
36996
36997               // ensure at least one test was run.
36998               if (!tested) {
36999                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
37000                   fail = regex.test(val);
37001               }
37002           }
37003
37004           _template = val;
37005           _fileList = null;
37006           _geojson = null;
37007
37008           // strip off the querystring/hash from the template,
37009           // it often includes the access token
37010           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
37011
37012           dispatch.call('change');
37013           return this;
37014       };
37015
37016
37017       drawData.geojson = function(gj, src) {
37018           if (!arguments.length) return _geojson;
37019
37020           _template = null;
37021           _fileList = null;
37022           _geojson = null;
37023           _src = null;
37024
37025           if (!isEmpty(gj)) {
37026               _geojson = ensureIDs(gj);
37027               _src = src || 'unknown.geojson';
37028           }
37029
37030           dispatch.call('change');
37031           return this;
37032       };
37033
37034
37035       drawData.fileList = function(fileList) {
37036           if (!arguments.length) return _fileList;
37037
37038           _template = null;
37039           _fileList = fileList;
37040           _geojson = null;
37041           _src = null;
37042
37043           if (!fileList || !fileList.length) return this;
37044           var f = fileList[0];
37045           var extension = getExtension(f.name);
37046           var reader = new FileReader();
37047           reader.onload = (function() {
37048               return function(e) {
37049                   drawData.setFile(extension, e.target.result);
37050               };
37051           })(f);
37052
37053           reader.readAsText(f);
37054
37055           return this;
37056       };
37057
37058
37059       drawData.url = function(url, defaultExtension) {
37060           _template = null;
37061           _fileList = null;
37062           _geojson = null;
37063           _src = null;
37064
37065           // strip off any querystring/hash from the url before checking extension
37066           var testUrl = url.split(/[?#]/)[0];
37067           var extension = getExtension(testUrl) || defaultExtension;
37068           if (extension) {
37069               _template = null;
37070               d3_text(url, function(err, data) {
37071                   if (err) return;
37072                   drawData.setFile(extension, data);
37073               });
37074           } else {
37075               drawData.template(url);
37076           }
37077
37078           return this;
37079       };
37080
37081
37082       drawData.getSrc = function() {
37083           return _src || '';
37084       };
37085
37086
37087       drawData.fitZoom = function() {
37088           var features = getFeatures(_geojson);
37089           if (!features.length) return;
37090
37091           var map = context.map();
37092           var viewport = map.trimmedExtent().polygon();
37093           var coords = reduce(features, function(coords, feature) {
37094               var c = feature.geometry.coordinates;
37095
37096               /* eslint-disable no-fallthrough */
37097               switch (feature.geometry.type) {
37098                   case 'Point':
37099                       c = [c];
37100                   case 'MultiPoint':
37101                   case 'LineString':
37102                       break;
37103
37104                   case 'MultiPolygon':
37105                       c = flatten(c);
37106                   case 'Polygon':
37107                   case 'MultiLineString':
37108                       c = flatten(c);
37109                       break;
37110               }
37111               /* eslint-enable no-fallthrough */
37112
37113               return union(coords, c);
37114           }, []);
37115
37116           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
37117               var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
37118               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
37119           }
37120
37121           return this;
37122       };
37123
37124
37125       init();
37126       return drawData;
37127   }
37128
37129   function svgDebug(projection, context) {
37130
37131       function drawDebug(selection) {
37132           var showsTile = context.getDebug('tile');
37133           var showsCollision = context.getDebug('collision');
37134           var showsImagery = context.getDebug('imagery');
37135           var showsCommunity = context.getDebug('community');
37136           var showsImperial = context.getDebug('imperial');
37137           var showsDriveLeft = context.getDebug('driveLeft');
37138           var showsTouchTargets = context.getDebug('target');
37139
37140           var debugData = [];
37141           if (showsTile) {
37142               debugData.push({ class: 'red', label: 'tile' });
37143           }
37144           if (showsCollision) {
37145               debugData.push({ class: 'yellow', label: 'collision' });
37146           }
37147           if (showsImagery) {
37148               debugData.push({ class: 'orange', label: 'imagery' });
37149           }
37150           if (showsCommunity) {
37151               debugData.push({ class: 'blue', label: 'community' });
37152           }
37153           if (showsImperial) {
37154               debugData.push({ class: 'cyan', label: 'imperial' });
37155           }
37156           if (showsDriveLeft) {
37157               debugData.push({ class: 'green', label: 'driveLeft' });
37158           }
37159           if (showsTouchTargets) {
37160               debugData.push({ class: 'pink', label: 'touchTargets' });
37161           }
37162
37163
37164           var legend = select('#content')
37165               .selectAll('.debug-legend')
37166               .data(debugData.length ? [0] : []);
37167
37168           legend.exit()
37169               .remove();
37170
37171           legend = legend.enter()
37172               .append('div')
37173               .attr('class', 'fillD debug-legend')
37174               .merge(legend);
37175
37176
37177           var legendItems = legend.selectAll('.debug-legend-item')
37178               .data(debugData, function(d) { return d.label; });
37179
37180           legendItems.exit()
37181               .remove();
37182
37183           legendItems.enter()
37184               .append('span')
37185               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
37186               .text(function(d) { return d.label; });
37187
37188
37189           var layer = selection.selectAll('.layer-debug')
37190               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
37191
37192           layer.exit()
37193               .remove();
37194
37195           layer = layer.enter()
37196               .append('g')
37197               .attr('class', 'layer-debug')
37198               .merge(layer);
37199
37200
37201           var extent = context.map().extent();
37202           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
37203           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
37204
37205           var imagery = layer.selectAll('path.debug-imagery')
37206               .data(features);
37207
37208           imagery.exit()
37209               .remove();
37210
37211           imagery.enter()
37212               .append('path')
37213               .attr('class', 'debug-imagery debug orange');
37214
37215
37216           var community = layer.selectAll('path.debug-community')
37217               .data(showsCommunity ? values$1(data.community.features) : []);
37218
37219           community.exit()
37220               .remove();
37221
37222           community.enter()
37223               .append('path')
37224               .attr('class', 'debug-community debug blue');
37225
37226
37227           var imperial = layer
37228               .selectAll('path.debug-imperial')
37229               .data(showsImperial ? [dataImperial] : []);
37230
37231           imperial.exit()
37232               .remove();
37233
37234           imperial.enter()
37235               .append('path')
37236               .attr('class', 'debug-imperial debug cyan');
37237
37238
37239           var driveLeft = layer
37240               .selectAll('path.debug-drive-left')
37241               .data(showsDriveLeft ? [dataDriveLeft] : []);
37242
37243           driveLeft.exit()
37244               .remove();
37245
37246           driveLeft.enter()
37247               .append('path')
37248               .attr('class', 'debug-drive-left debug green');
37249
37250
37251           // update
37252           layer.selectAll('path')
37253               .attr('d', svgPath(projection).geojson);
37254       }
37255
37256
37257       // This looks strange because `enabled` methods on other layers are
37258       // chainable getter/setters, and this one is just a getter.
37259       drawDebug.enabled = function() {
37260           if (!arguments.length) {
37261               return context.getDebug('tile') ||
37262                   context.getDebug('collision') ||
37263                   context.getDebug('imagery') ||
37264                   context.getDebug('imperial') ||
37265                   context.getDebug('driveLeft') ||
37266                   context.getDebug('target');
37267           } else {
37268               return this;
37269           }
37270       };
37271
37272
37273       return drawDebug;
37274   }
37275
37276   /*
37277       A standalone SVG element that contains only a `defs` sub-element. To be
37278       used once globally, since defs IDs must be unique within a document.
37279   */
37280   function svgDefs(context) {
37281
37282       function drawDefs(selection) {
37283           var defs = selection.append('defs');
37284
37285           // add markers
37286           defs
37287               .append('marker')
37288               .attr('id', 'oneway-marker')
37289               .attr('viewBox', '0 0 10 5')
37290               .attr('refX', 2.5)
37291               .attr('refY', 2.5)
37292               .attr('markerWidth', 2)
37293               .attr('markerHeight', 2)
37294               .attr('markerUnits', 'strokeWidth')
37295               .attr('orient', 'auto')
37296               .append('path')
37297               .attr('class', 'oneway-marker-path')
37298               .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')
37299               .attr('stroke', 'none')
37300               .attr('fill', '#000')
37301               .attr('opacity', '0.75');
37302
37303           // SVG markers have to be given a colour where they're defined
37304           // (they can't inherit it from the line they're attached to),
37305           // so we need to manually define markers for each color of tag
37306           // (also, it's slightly nicer if we can control the
37307           // positioning for different tags)
37308           function addSidedMarker(name, color, offset) {
37309               defs
37310                   .append('marker')
37311                   .attr('id', 'sided-marker-' + name)
37312                   .attr('viewBox', '0 0 2 2')
37313                   .attr('refX', 1)
37314                   .attr('refY', -offset)
37315                   .attr('markerWidth', 1.5)
37316                   .attr('markerHeight', 1.5)
37317                   .attr('markerUnits', 'strokeWidth')
37318                   .attr('orient', 'auto')
37319                   .append('path')
37320                   .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
37321                   .attr('d', 'M 0,0 L 1,1 L 2,0 z')
37322                   .attr('stroke', 'none')
37323                   .attr('fill', color);
37324           }
37325           addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
37326           // for a coastline, the arrows are (somewhat unintuitively) on
37327           // the water side, so let's color them blue (with a gap) to
37328           // give a stronger indication
37329           addSidedMarker('coastline', '#77dede', 1);
37330           // barriers have a dashed line, and separating the triangle
37331           // from the line visually suits that
37332           addSidedMarker('barrier', '#ddd', 1);
37333           addSidedMarker('man_made', '#fff', 0);
37334
37335           defs
37336               .append('marker')
37337               .attr('id', 'viewfield-marker')
37338               .attr('viewBox', '0 0 16 16')
37339               .attr('refX', 8)
37340               .attr('refY', 16)
37341               .attr('markerWidth', 4)
37342               .attr('markerHeight', 4)
37343               .attr('markerUnits', 'strokeWidth')
37344               .attr('orient', 'auto')
37345               .append('path')
37346               .attr('class', 'viewfield-marker-path')
37347               .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')
37348               .attr('fill', '#333')
37349               .attr('fill-opacity', '0.75')
37350               .attr('stroke', '#fff')
37351               .attr('stroke-width', '0.5px')
37352               .attr('stroke-opacity', '0.75');
37353
37354           defs
37355               .append('marker')
37356               .attr('id', 'viewfield-marker-wireframe')
37357               .attr('viewBox', '0 0 16 16')
37358               .attr('refX', 8)
37359               .attr('refY', 16)
37360               .attr('markerWidth', 4)
37361               .attr('markerHeight', 4)
37362               .attr('markerUnits', 'strokeWidth')
37363               .attr('orient', 'auto')
37364               .append('path')
37365               .attr('class', 'viewfield-marker-path')
37366               .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')
37367               .attr('fill', 'none')
37368               .attr('stroke', '#fff')
37369               .attr('stroke-width', '0.5px')
37370               .attr('stroke-opacity', '0.75');
37371
37372           // add patterns
37373           var patterns = defs.selectAll('pattern')
37374               .data([
37375                   // pattern name, pattern image name
37376                   ['beach', 'dots'],
37377                   ['construction', 'construction'],
37378                   ['cemetery', 'cemetery'],
37379                   ['cemetery_christian', 'cemetery_christian'],
37380                   ['cemetery_buddhist', 'cemetery_buddhist'],
37381                   ['cemetery_muslim', 'cemetery_muslim'],
37382                   ['cemetery_jewish', 'cemetery_jewish'],
37383                   ['farmland', 'farmland'],
37384                   ['farmyard', 'farmyard'],
37385                   ['forest', 'forest'],
37386                   ['forest_broadleaved', 'forest_broadleaved'],
37387                   ['forest_needleleaved', 'forest_needleleaved'],
37388                   ['forest_leafless', 'forest_leafless'],
37389                   ['grass', 'grass'],
37390                   ['landfill', 'landfill'],
37391                   ['meadow', 'grass'],
37392                   ['orchard', 'orchard'],
37393                   ['pond', 'pond'],
37394                   ['quarry', 'quarry'],
37395                   ['scrub', 'bushes'],
37396                   ['vineyard', 'vineyard'],
37397                   ['water_standing', 'lines'],
37398                   ['waves', 'waves'],
37399                   ['wetland', 'wetland'],
37400                   ['wetland_marsh', 'wetland_marsh'],
37401                   ['wetland_swamp', 'wetland_swamp'],
37402                   ['wetland_bog', 'wetland_bog'],
37403                   ['wetland_reedbed', 'wetland_reedbed']
37404               ])
37405               .enter()
37406               .append('pattern')
37407               .attr('id', function (d) { return 'pattern-' + d[0]; })
37408               .attr('width', 32)
37409               .attr('height', 32)
37410               .attr('patternUnits', 'userSpaceOnUse');
37411
37412           patterns
37413               .append('rect')
37414               .attr('x', 0)
37415               .attr('y', 0)
37416               .attr('width', 32)
37417               .attr('height', 32)
37418               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
37419
37420           patterns
37421               .append('image')
37422               .attr('x', 0)
37423               .attr('y', 0)
37424               .attr('width', 32)
37425               .attr('height', 32)
37426               .attr('xlink:href', function (d) {
37427                   return context.imagePath('pattern/' + d[1] + '.png');
37428               });
37429
37430           // add clip paths
37431           defs.selectAll('clipPath')
37432               .data([12, 18, 20, 32, 45])
37433               .enter()
37434               .append('clipPath')
37435               .attr('id', function (d) { return 'clip-square-' + d; })
37436               .append('rect')
37437               .attr('x', 0)
37438               .attr('y', 0)
37439               .attr('width', function (d) { return d; })
37440               .attr('height', function (d) { return d; });
37441
37442           // add symbol spritesheets
37443           defs
37444               .call(drawDefs.addSprites, [
37445                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
37446               ], true);
37447       }
37448
37449
37450       drawDefs.addSprites = function(selection, ids, overrideColors) {
37451           var spritesheets = selection.selectAll('.spritesheet');
37452           var currData = spritesheets.data();
37453           var data = uniq(currData.concat(ids));
37454
37455           spritesheets
37456               .data(data)
37457               .enter()
37458               .append('g')
37459               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
37460               .each(function(d) {
37461                   var url = context.imagePath(d + '.svg');
37462                   var node = select(this).node();
37463                   request(url)
37464                       .mimeType('image/svg+xml')
37465                       .response(function(xhr) { return xhr.responseXML; })
37466                       .get(function(err, svg) {
37467                           if (err) return;
37468                           node.appendChild(
37469                               select(svg.documentElement).attr('id', d).node()
37470                           );
37471                           if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
37472                               select(node).selectAll('path')
37473                                   .attr('fill', 'currentColor');
37474                           }
37475                       });
37476               });
37477       };
37478
37479
37480       return drawDefs;
37481   }
37482
37483   var _keepRightEnabled = false;
37484   var _keepRightService;
37485
37486
37487   function svgKeepRight(projection, context, dispatch) {
37488       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
37489       var minZoom = 12;
37490       var touchLayer = select(null);
37491       var drawLayer = select(null);
37492       var _keepRightVisible = false;
37493
37494
37495       function markerPath(selection, klass) {
37496           selection
37497               .attr('class', klass)
37498               .attr('transform', 'translate(-4, -24)')
37499               .attr('d', 'M11.6,6.2H7.1l1.4-5.1C8.6,0.6,8.1,0,7.5,0H2.2C1.7,0,1.3,0.3,1.3,0.8L0,10.2c-0.1,0.6,0.4,1.1,0.9,1.1h4.6l-1.8,7.6C3.6,19.4,4.1,20,4.7,20c0.3,0,0.6-0.2,0.8-0.5l6.9-11.9C12.7,7,12.3,6.2,11.6,6.2z');
37500       }
37501
37502
37503       // Loosely-coupled keepRight service for fetching errors.
37504       function getService() {
37505           if (services.keepRight && !_keepRightService) {
37506               _keepRightService = services.keepRight;
37507               _keepRightService.on('loaded', throttledRedraw);
37508           } else if (!services.keepRight && _keepRightService) {
37509               _keepRightService = null;
37510           }
37511
37512           return _keepRightService;
37513       }
37514
37515
37516       // Show the errors
37517       function editOn() {
37518           if (!_keepRightVisible) {
37519               _keepRightVisible = true;
37520               drawLayer
37521                   .style('display', 'block');
37522           }
37523       }
37524
37525
37526       // Immediately remove the errors and their touch targets
37527       function editOff() {
37528           if (_keepRightVisible) {
37529               _keepRightVisible = false;
37530               drawLayer
37531                   .style('display', 'none');
37532               drawLayer.selectAll('.qa_error.keepRight')
37533                   .remove();
37534               touchLayer.selectAll('.qa_error.keepRight')
37535                   .remove();
37536           }
37537       }
37538
37539
37540       // Enable the layer.  This shows the errors and transitions them to visible.
37541       function layerOn() {
37542           editOn();
37543
37544           drawLayer
37545               .style('opacity', 0)
37546               .transition()
37547               .duration(250)
37548               .style('opacity', 1)
37549               .on('end interrupt', function () {
37550                   dispatch.call('change');
37551               });
37552       }
37553
37554
37555       // Disable the layer.  This transitions the layer invisible and then hides the errors.
37556       function layerOff() {
37557           throttledRedraw.cancel();
37558           drawLayer.interrupt();
37559           touchLayer.selectAll('.qa_error.keepRight')
37560               .remove();
37561
37562           drawLayer
37563               .transition()
37564               .duration(250)
37565               .style('opacity', 0)
37566               .on('end interrupt', function () {
37567                   editOff();
37568                   dispatch.call('change');
37569               });
37570       }
37571
37572
37573       // Update the error markers
37574       function updateMarkers() {
37575           if (!_keepRightVisible || !_keepRightEnabled) return;
37576
37577           var service = getService();
37578           var selectedID = context.selectedErrorID();
37579           var data = (service ? service.getErrors(projection) : []);
37580           var getTransform = svgPointTransform(projection);
37581
37582           // Draw markers..
37583           var markers = drawLayer.selectAll('.qa_error.keepRight')
37584               .data(data, function(d) { return d.id; });
37585
37586           // exit
37587           markers.exit()
37588               .remove();
37589
37590           // enter
37591           var markersEnter = markers.enter()
37592               .append('g')
37593               .attr('class', function(d) {
37594                   return [
37595                       'qa_error',
37596                       d.service,
37597                       'error_id-' + d.id,
37598                       'error_type-' + d.parent_error_type
37599                   ].join(' ');
37600               });
37601
37602           markersEnter
37603               .append('ellipse')
37604               .attr('cx', 0.5)
37605               .attr('cy', 1)
37606               .attr('rx', 6.5)
37607               .attr('ry', 3)
37608               .attr('class', 'stroke');
37609
37610           markersEnter
37611               .append('path')
37612               .call(markerPath, 'shadow');
37613
37614           markersEnter
37615               .append('use')
37616               .attr('class', 'qa_error-fill')
37617               .attr('width', '20px')
37618               .attr('height', '20px')
37619               .attr('x', '-8px')
37620               .attr('y', '-22px')
37621               .attr('xlink:href', '#iD-icon-bolt');
37622
37623           // update
37624           markers
37625               .merge(markersEnter)
37626               .sort(sortY)
37627               .classed('selected', function(d) { return d.id === selectedID; })
37628               .attr('transform', getTransform);
37629
37630
37631           // Draw targets..
37632           if (touchLayer.empty()) return;
37633           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37634
37635           var targets = touchLayer.selectAll('.qa_error.keepRight')
37636               .data(data, function(d) { return d.id; });
37637
37638           // exit
37639           targets.exit()
37640               .remove();
37641
37642           // enter/update
37643           targets.enter()
37644               .append('rect')
37645               .attr('width', '20px')
37646               .attr('height', '20px')
37647               .attr('x', '-8px')
37648               .attr('y', '-22px')
37649               .merge(targets)
37650               .sort(sortY)
37651               .attr('class', function(d) {
37652                   return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
37653               })
37654               .attr('transform', getTransform);
37655
37656
37657           function sortY(a, b) {
37658               return (a.id === selectedID) ? 1
37659                   : (b.id === selectedID) ? -1
37660                   : (a.severity === 'error' && b.severity !== 'error') ? 1
37661                   : (b.severity === 'error' && a.severity !== 'error') ? -1
37662                   : b.loc[1] - a.loc[1];
37663           }
37664       }
37665
37666
37667       // Draw the keepRight layer and schedule loading errors and updating markers.
37668       function drawKeepRight(selection) {
37669           var service = getService();
37670
37671           var surface = context.surface();
37672           if (surface && !surface.empty()) {
37673               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
37674           }
37675
37676           drawLayer = selection.selectAll('.layer-keepRight')
37677               .data(service ? [0] : []);
37678
37679           drawLayer.exit()
37680               .remove();
37681
37682           drawLayer = drawLayer.enter()
37683               .append('g')
37684               .attr('class', 'layer-keepRight')
37685               .style('display', _keepRightEnabled ? 'block' : 'none')
37686               .merge(drawLayer);
37687
37688           if (_keepRightEnabled) {
37689               if (service && ~~context.map().zoom() >= minZoom) {
37690                   editOn();
37691                   service.loadErrors(projection);
37692                   updateMarkers();
37693               } else {
37694                   editOff();
37695               }
37696           }
37697       }
37698
37699
37700       // Toggles the layer on and off
37701       drawKeepRight.enabled = function(val) {
37702           if (!arguments.length) return _keepRightEnabled;
37703
37704           _keepRightEnabled = val;
37705           if (_keepRightEnabled) {
37706               layerOn();
37707           } else {
37708               layerOff();
37709               if (context.selectedErrorID()) {
37710                   context.enter(modeBrowse(context));
37711               }
37712           }
37713
37714           dispatch.call('change');
37715           return this;
37716       };
37717
37718
37719       drawKeepRight.supported = function() {
37720           return !!getService();
37721       };
37722
37723
37724       return drawKeepRight;
37725   }
37726
37727   function svgIcon(name, svgklass, useklass) {
37728       return function drawIcon(selection) {
37729           selection.selectAll('svg.icon')
37730               .data([0])
37731               .enter()
37732               .append('svg')
37733               .attr('class', 'icon ' + (svgklass || ''))
37734               .append('use')
37735               .attr('xlink:href', name)
37736               .attr('class', useklass);
37737       };
37738   }
37739
37740   // Touch targets control which other vertices we can drag a vertex onto.
37741   //
37742   // - the activeID - nope
37743   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
37744   // - 2 away from the activeID - nope (would create a self intersecting segment)
37745   // - all others on a linear way - yes
37746   // - all others on a closed way - nope (would create a self intersecting polygon)
37747   //
37748   // returns
37749   // 0 = active vertex - no touch/connect
37750   // 1 = passive vertex - yes touch/connect
37751   // 2 = adjacent vertex - yes but pay attention segmenting a line here
37752   //
37753   function svgPassiveVertex(node, graph, activeID) {
37754       if (!activeID) return 1;
37755       if (activeID === node.id) return 0;
37756
37757       var parents = graph.parentWays(node);
37758
37759       for (var i = 0; i < parents.length; i++) {
37760           var nodes = parents[i].nodes;
37761           var isClosed = parents[i].isClosed();
37762           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
37763               if (nodes[j] === node.id) {
37764                   var ix1 = j - 2;
37765                   var ix2 = j - 1;
37766                   var ix3 = j + 1;
37767                   var ix4 = j + 2;
37768
37769                   if (isClosed) {  // wraparound if needed
37770                       var max = nodes.length - 1;
37771                       if (ix1 < 0)   ix1 = max + ix1;
37772                       if (ix2 < 0)   ix2 = max + ix2;
37773                       if (ix3 > max) ix3 = ix3 - max;
37774                       if (ix4 > max) ix4 = ix4 - max;
37775                   }
37776
37777                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
37778                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
37779                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
37780                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
37781                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
37782               }
37783           }
37784       }
37785
37786       return 1;   // ok
37787   }
37788
37789
37790   function svgMarkerSegments(projection, graph, dt,
37791                                     shouldReverse,
37792                                     bothDirections) {
37793       return function(entity) {
37794           var i = 0;
37795           var offset = dt;
37796           var segments = [];
37797           var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
37798           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
37799           var a, b;
37800
37801           if (shouldReverse(entity)) {
37802               coordinates.reverse();
37803           }
37804
37805           geoStream({
37806               type: 'LineString',
37807               coordinates: coordinates
37808           }, projection.stream(clip({
37809               lineStart: function() {},
37810               lineEnd: function() { a = null; },
37811               point: function(x, y) {
37812                   b = [x, y];
37813
37814                   if (a) {
37815                       var span = geoVecLength(a, b) - offset;
37816
37817                       if (span >= 0) {
37818                           var heading = geoVecAngle(a, b);
37819                           var dx = dt * Math.cos(heading);
37820                           var dy = dt * Math.sin(heading);
37821                           var p = [
37822                               a[0] + offset * Math.cos(heading),
37823                               a[1] + offset * Math.sin(heading)
37824                           ];
37825
37826                           // gather coordinates
37827                           var coord = [a, p];
37828                           for (span -= dt; span >= 0; span -= dt) {
37829                               p = geoVecAdd(p, [dx, dy]);
37830                               coord.push(p);
37831                           }
37832                           coord.push(b);
37833
37834                           // generate svg paths
37835                           var segment = '';
37836                           var j;
37837
37838                           for (j = 0; j < coord.length; j++) {
37839                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37840                           }
37841                           segments.push({ id: entity.id, index: i++, d: segment });
37842
37843                           if (bothDirections(entity)) {
37844                               segment = '';
37845                               for (j = coord.length - 1; j >= 0; j--) {
37846                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37847                               }
37848                               segments.push({ id: entity.id, index: i++, d: segment });
37849                           }
37850                       }
37851
37852                       offset = -span;
37853                   }
37854
37855                   a = b;
37856               }
37857           })));
37858
37859           return segments;
37860       };
37861   }
37862
37863
37864   function svgPath(projection, graph, isArea) {
37865
37866       // Explanation of magic numbers:
37867       // "padding" here allows space for strokes to extend beyond the viewport,
37868       // so that the stroke isn't drawn along the edge of the viewport when
37869       // the shape is clipped.
37870       //
37871       // When drawing lines, pad viewport by 5px.
37872       // When drawing areas, pad viewport by 65px in each direction to allow
37873       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
37874
37875       var cache = {};
37876       var padding = isArea ? 65 : 5;
37877       var viewport = projection.clipExtent();
37878       var paddedExtent = [
37879           [viewport[0][0] - padding, viewport[0][1] - padding],
37880           [viewport[1][0] + padding, viewport[1][1] + padding]
37881       ];
37882       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
37883       var project = projection.stream;
37884       var path = d3_geoPath()
37885           .projection({stream: function(output) { return project(clip(output)); }});
37886
37887       var svgpath = function(entity) {
37888           if (entity.id in cache) {
37889               return cache[entity.id];
37890           } else {
37891               return cache[entity.id] = path(entity.asGeoJSON(graph));
37892           }
37893       };
37894
37895       svgpath.geojson = function(d) {
37896           if (d.__featurehash__ !== undefined) {
37897               if (d.__featurehash__ in cache) {
37898                   return cache[d.__featurehash__];
37899               } else {
37900                   return cache[d.__featurehash__] = path(d);
37901               }
37902           } else {
37903               return path(d);
37904           }
37905       };
37906
37907       return svgpath;
37908   }
37909
37910
37911   function svgPointTransform(projection) {
37912       var svgpoint = function(entity) {
37913           // http://jsperf.com/short-array-join
37914           var pt = projection(entity.loc);
37915           return 'translate(' + pt[0] + ',' + pt[1] + ')';
37916       };
37917
37918       svgpoint.geojson = function(d) {
37919           return svgpoint(d.properties.entity);
37920       };
37921
37922       return svgpoint;
37923   }
37924
37925
37926   function svgRelationMemberTags(graph) {
37927       return function(entity) {
37928           var tags = entity.tags;
37929           graph.parentRelations(entity).forEach(function(relation) {
37930               var type = relation.tags.type;
37931               if (type === 'multipolygon' || type === 'boundary') {
37932                   tags = assignIn({}, relation.tags, tags);
37933               }
37934           });
37935           return tags;
37936       };
37937   }
37938
37939
37940   function svgSegmentWay(way, graph, activeID) {
37941       // When there is no activeID, we can memoize this expensive computation
37942       if (activeID === undefined) {
37943           return graph.transient(way, 'waySegments', getWaySegments);
37944       } else {
37945           return getWaySegments();
37946       }
37947
37948       function getWaySegments() {
37949           var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
37950           var features = { passive: [], active: [] };
37951           var start = {};
37952           var end = {};
37953           var node, type;
37954
37955           for (var i = 0; i < way.nodes.length; i++) {
37956               node = graph.entity(way.nodes[i]);
37957               type = svgPassiveVertex(node, graph, activeID);
37958               end = { node: node, type: type };
37959
37960               if (start.type !== undefined) {
37961                   if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
37962                       pushActive(start, end, i);
37963                   } else if (start.type === 0 && end.type === 0) {   // both active vertices
37964                       pushActive(start, end, i);
37965                   } else {
37966                       pushPassive(start, end, i);
37967                   }
37968               }
37969
37970               start = end;
37971           }
37972
37973           return features;
37974
37975           function pushActive(start, end, index) {
37976               features.active.push({
37977                   type: 'Feature',
37978                   id: way.id + '-' + index + '-nope',
37979                   properties: {
37980                       nope: true,
37981                       target: true,
37982                       entity: way,
37983                       nodes: [start.node, end.node],
37984                       index: index
37985                   },
37986                   geometry: {
37987                       type: 'LineString',
37988                       coordinates: [start.node.loc, end.node.loc]
37989                   }
37990               });
37991           }
37992
37993           function pushPassive(start, end, index) {
37994               features.passive.push({
37995                   type: 'Feature',
37996                   id: way.id + '-' + index,
37997                   properties: {
37998                       target: true,
37999                       entity: way,
38000                       nodes: [start.node, end.node],
38001                       index: index
38002                   },
38003                   geometry: {
38004                       type: 'LineString',
38005                       coordinates: [start.node.loc, end.node.loc]
38006                   }
38007               });
38008           }
38009       }
38010   }
38011
38012   function svgGeolocate(projection) {
38013       var layer = select(null);
38014       var _position;
38015
38016
38017       function init() {
38018           if (svgGeolocate.initialized) return;  // run once
38019           svgGeolocate.enabled = false;
38020           svgGeolocate.initialized = true;
38021       }
38022
38023       function showLayer() {
38024           layer.style('display', 'block');
38025       }
38026
38027
38028       function hideLayer() {
38029           layer
38030               .transition()
38031               .duration(250)
38032               .style('opacity', 0);
38033       }
38034
38035       function layerOn() {
38036           layer
38037               .style('opacity', 0)
38038               .transition()
38039               .duration(250)
38040               .style('opacity', 1);
38041
38042       }
38043
38044       function layerOff() {
38045           layer.style('display', 'none');
38046       }
38047
38048       function transform(d) {
38049           return svgPointTransform(projection)(d);
38050       }
38051
38052       function accuracy(accuracy, loc) { // converts accuracy to pixels...
38053           var degreesRadius = geoMetersToLat(accuracy),
38054               tangentLoc = [loc[0], loc[1] + degreesRadius],
38055               projectedTangent = projection(tangentLoc),
38056               projectedLoc = projection([loc[0], loc[1]]);
38057
38058           // southern most point will have higher pixel value...
38059          return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
38060       }
38061
38062       function update() {
38063           var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
38064
38065           var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
38066               .data([geolocation]);
38067
38068           groups.exit()
38069               .remove();
38070
38071           var pointsEnter = groups.enter()
38072               .append('g')
38073               .attr('class', 'geolocation');
38074
38075           pointsEnter
38076               .append('circle')
38077               .attr('id', 'geolocate-radius')
38078               .attr('dx', '0')
38079               .attr('dy', '0')
38080               .attr('fill', 'rgb(15,128,225)')
38081               .attr('fill-opacity', '0.3')
38082               .attr('r', '0');
38083
38084           pointsEnter
38085               .append('circle')
38086               .attr('dx', '0')
38087               .attr('dy', '0')
38088               .attr('fill', 'rgb(15,128,225)')
38089               .attr('stroke', 'white')
38090               .attr('stroke-width', '1.5')
38091               .attr('r', '6');
38092
38093           groups.merge(pointsEnter)
38094               .attr('transform', transform);
38095
38096           select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
38097       }
38098
38099       function drawLocation(selection) {
38100           var enabled = svgGeolocate.enabled;
38101
38102           layer = selection.selectAll('.layer-geolocate')
38103               .data([0]);
38104
38105           layer.exit()
38106               .remove();
38107
38108           var layerEnter = layer.enter()
38109               .append('g')
38110               .attr('class', 'layer-geolocate')
38111               .style('display', enabled ? 'block' : 'none');
38112
38113           layerEnter
38114               .append('g')
38115               .attr('class', 'geolocations');
38116
38117           layer = layerEnter
38118               .merge(layer);
38119
38120           if (enabled) {
38121               update();
38122           } else {
38123               layerOff();
38124           }
38125       }
38126
38127       drawLocation.enabled = function (position, enabled) {
38128           if (!arguments.length) return svgGeolocate.enabled;
38129           _position = position;
38130           svgGeolocate.enabled = enabled;
38131           if (svgGeolocate.enabled) {
38132               showLayer();
38133               layerOn();
38134           } else {
38135               hideLayer();
38136           }
38137           return this;
38138       };
38139
38140       init();
38141       return drawLocation;
38142   }
38143
38144   function svgLabels(projection, context) {
38145       var path = d3_geoPath(projection);
38146       var detected = utilDetect();
38147       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
38148       var _rdrawn = rbush_1();
38149       var _rskipped = rbush_1();
38150       var _textWidthCache = {};
38151       var _entitybboxes = {};
38152
38153       // Listed from highest to lowest priority
38154       var labelStack = [
38155           ['line', 'aeroway', '*', 12],
38156           ['line', 'highway', 'motorway', 12],
38157           ['line', 'highway', 'trunk', 12],
38158           ['line', 'highway', 'primary', 12],
38159           ['line', 'highway', 'secondary', 12],
38160           ['line', 'highway', 'tertiary', 12],
38161           ['line', 'highway', '*', 12],
38162           ['line', 'railway', '*', 12],
38163           ['line', 'waterway', '*', 12],
38164           ['area', 'aeroway', '*', 12],
38165           ['area', 'amenity', '*', 12],
38166           ['area', 'building', '*', 12],
38167           ['area', 'historic', '*', 12],
38168           ['area', 'leisure', '*', 12],
38169           ['area', 'man_made', '*', 12],
38170           ['area', 'natural', '*', 12],
38171           ['area', 'shop', '*', 12],
38172           ['area', 'tourism', '*', 12],
38173           ['area', 'camp_site', '*', 12],
38174           ['point', 'aeroway', '*', 10],
38175           ['point', 'amenity', '*', 10],
38176           ['point', 'building', '*', 10],
38177           ['point', 'historic', '*', 10],
38178           ['point', 'leisure', '*', 10],
38179           ['point', 'man_made', '*', 10],
38180           ['point', 'natural', '*', 10],
38181           ['point', 'shop', '*', 10],
38182           ['point', 'tourism', '*', 10],
38183           ['point', 'camp_site', '*', 10],
38184           ['line', 'name', '*', 12],
38185           ['area', 'name', '*', 12],
38186           ['point', 'name', '*', 10]
38187       ];
38188
38189
38190       function blacklisted(preset) {
38191           var noIcons = ['building', 'landuse', 'natural'];
38192           return some(noIcons, function(s) {
38193               return preset.id.indexOf(s) >= 0;
38194           });
38195       }
38196
38197
38198       function get(array, prop) {
38199           return function(d, i) { return array[i][prop]; };
38200       }
38201
38202
38203       function textWidth(text, size, elem) {
38204           var c = _textWidthCache[size];
38205           if (!c) c = _textWidthCache[size] = {};
38206
38207           if (c[text]) {
38208               return c[text];
38209
38210           } else if (elem) {
38211               c[text] = elem.getComputedTextLength();
38212               return c[text];
38213
38214           } else {
38215               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
38216               if (str === null) {
38217                   return size / 3 * 2 * text.length;
38218               } else {
38219                   return size / 3 * (2 * text.length + str.length);
38220               }
38221           }
38222       }
38223
38224
38225       function drawLinePaths(selection, entities, filter, classes, labels) {
38226           var paths = selection.selectAll('path')
38227               .filter(filter)
38228               .data(entities, osmEntity.key);
38229
38230           // exit
38231           paths.exit()
38232               .remove();
38233
38234           // enter/update
38235           paths.enter()
38236               .append('path')
38237               .style('stroke-width', get(labels, 'font-size'))
38238               .attr('id', function(d) { return 'labelpath-' + d.id; })
38239               .attr('class', classes)
38240               .merge(paths)
38241               .attr('d', get(labels, 'lineString'));
38242       }
38243
38244
38245       function drawLineLabels(selection, entities, filter, classes, labels) {
38246           var texts = selection.selectAll('text.' + classes)
38247               .filter(filter)
38248               .data(entities, osmEntity.key);
38249
38250           // exit
38251           texts.exit()
38252               .remove();
38253
38254           // enter
38255           texts.enter()
38256               .append('text')
38257               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
38258               .attr('dy', baselineHack ? '0.35em' : null)
38259               .append('textPath')
38260               .attr('class', 'textpath');
38261
38262           // update
38263           selection.selectAll('text.' + classes).selectAll('.textpath')
38264               .filter(filter)
38265               .data(entities, osmEntity.key)
38266               .attr('startOffset', '50%')
38267               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
38268               .text(utilDisplayNameForPath);
38269       }
38270
38271
38272       function drawPointLabels(selection, entities, filter, classes, labels) {
38273           var texts = selection.selectAll('text.' + classes)
38274               .filter(filter)
38275               .data(entities, osmEntity.key);
38276
38277           // exit
38278           texts.exit()
38279               .remove();
38280
38281           // enter/update
38282           texts.enter()
38283               .append('text')
38284               .attr('class', function(d, i) {
38285                   return classes + ' ' + labels[i].classes + ' ' + d.id;
38286               })
38287               .merge(texts)
38288               .attr('x', get(labels, 'x'))
38289               .attr('y', get(labels, 'y'))
38290               .style('text-anchor', get(labels, 'textAnchor'))
38291               .text(utilDisplayName)
38292               .each(function(d, i) {
38293                   textWidth(utilDisplayName(d), labels[i].height, this);
38294               });
38295       }
38296
38297
38298       function drawAreaLabels(selection, entities, filter, classes, labels) {
38299           entities = entities.filter(hasText);
38300           labels = labels.filter(hasText);
38301           drawPointLabels(selection, entities, filter, classes, labels);
38302
38303           function hasText(d, i) {
38304               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
38305           }
38306       }
38307
38308
38309       function drawAreaIcons(selection, entities, filter, classes, labels) {
38310           var icons = selection.selectAll('use.' + classes)
38311               .filter(filter)
38312               .data(entities, osmEntity.key);
38313
38314           // exit
38315           icons.exit()
38316               .remove();
38317
38318           // enter/update
38319           icons.enter()
38320               .append('use')
38321               .attr('class', 'icon ' + classes)
38322               .attr('width', '17px')
38323               .attr('height', '17px')
38324               .merge(icons)
38325               .attr('transform', get(labels, 'transform'))
38326               .attr('xlink:href', function(d) {
38327                   var preset = context.presets().match(d, context.graph());
38328                   var picon = preset && preset.icon;
38329
38330                   if (!picon) {
38331                       return '';
38332                   } else {
38333                       var isMaki = /^maki-/.test(picon);
38334                       return '#' + picon + (isMaki ? '-15' : '');
38335                   }
38336               });
38337       }
38338
38339
38340       function drawCollisionBoxes(selection, rtree, which) {
38341           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
38342
38343           var gj = [];
38344           if (context.getDebug('collision')) {
38345               gj = rtree.all().map(function(d) {
38346                   return { type: 'Polygon', coordinates: [[
38347                       [d.minX, d.minY],
38348                       [d.maxX, d.minY],
38349                       [d.maxX, d.maxY],
38350                       [d.minX, d.maxY],
38351                       [d.minX, d.minY]
38352                   ]]};
38353               });
38354           }
38355
38356           var boxes = selection.selectAll('.' + which)
38357               .data(gj);
38358
38359           // exit
38360           boxes.exit()
38361               .remove();
38362
38363           // enter/update
38364           boxes.enter()
38365               .append('path')
38366               .attr('class', classes)
38367               .merge(boxes)
38368               .attr('d', d3_geoPath());
38369       }
38370
38371
38372       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
38373           var wireframe = context.surface().classed('fill-wireframe');
38374           var zoom = geoScaleToZoom(projection.scale());
38375
38376           var labelable = [];
38377           var renderNodeAs = {};
38378           var i, j, k, entity, geometry;
38379
38380           for (i = 0; i < labelStack.length; i++) {
38381               labelable.push([]);
38382           }
38383
38384           if (fullRedraw) {
38385               _rdrawn.clear();
38386               _rskipped.clear();
38387               _entitybboxes = {};
38388
38389           } else {
38390               for (i = 0; i < entities.length; i++) {
38391                   entity = entities[i];
38392                   var toRemove = []
38393                       .concat(_entitybboxes[entity.id] || [])
38394                       .concat(_entitybboxes[entity.id + 'I'] || []);
38395
38396                   for (j = 0; j < toRemove.length; j++) {
38397                       _rdrawn.remove(toRemove[j]);
38398                       _rskipped.remove(toRemove[j]);
38399                   }
38400               }
38401           }
38402
38403           // Loop through all the entities to do some preprocessing
38404           for (i = 0; i < entities.length; i++) {
38405               entity = entities[i];
38406               geometry = entity.geometry(graph);
38407
38408               // Insert collision boxes around interesting points/vertices
38409               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
38410                   var hasDirections = entity.directions(graph, projection).length;
38411                   var markerPadding;
38412
38413                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
38414                       renderNodeAs[entity.id] = 'point';
38415                       markerPadding = 20;   // extra y for marker height
38416                   } else {
38417                       renderNodeAs[entity.id] = 'vertex';
38418                       markerPadding = 0;
38419                   }
38420
38421                   var coord = projection(entity.loc);
38422                   var nodePadding = 10;
38423                   var bbox = {
38424                       minX: coord[0] - nodePadding,
38425                       minY: coord[1] - nodePadding - markerPadding,
38426                       maxX: coord[0] + nodePadding,
38427                       maxY: coord[1] + nodePadding
38428                   };
38429
38430                   doInsert(bbox, entity.id + 'P');
38431               }
38432
38433               // From here on, treat vertices like points
38434               if (geometry === 'vertex') {
38435                   geometry = 'point';
38436               }
38437
38438               // Determine which entities are label-able
38439               var preset = geometry === 'area' && context.presets().match(entity, graph);
38440               var icon = preset && !blacklisted(preset) && preset.icon;
38441
38442               if (!icon && !utilDisplayName(entity))
38443                   continue;
38444
38445               for (k = 0; k < labelStack.length; k++) {
38446                   var matchGeom = labelStack[k][0];
38447                   var matchKey = labelStack[k][1];
38448                   var matchVal = labelStack[k][2];
38449                   var hasVal = entity.tags[matchKey];
38450
38451                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
38452                       labelable[k].push(entity);
38453                       break;
38454                   }
38455               }
38456           }
38457
38458           var positions = {
38459               point: [],
38460               line: [],
38461               area: []
38462           };
38463
38464           var labelled = {
38465               point: [],
38466               line: [],
38467               area: []
38468           };
38469
38470           // Try and find a valid label for labellable entities
38471           for (k = 0; k < labelable.length; k++) {
38472               var fontSize = labelStack[k][3];
38473
38474               for (i = 0; i < labelable[k].length; i++) {
38475                   entity = labelable[k][i];
38476                   geometry = entity.geometry(graph);
38477
38478                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
38479                   var name = getName(entity);
38480                   var width = name && textWidth(name, fontSize);
38481                   var p = null;
38482
38483                   if (geometry === 'point' || geometry === 'vertex') {
38484                       // no point or vertex labels in wireframe mode
38485                       // no vertex labels at low zooms (vertices have no icons)
38486                       if (wireframe) continue;
38487                       var renderAs = renderNodeAs[entity.id];
38488                       if (renderAs === 'vertex' && zoom < 17) continue;
38489
38490                       p = getPointLabel(entity, width, fontSize, renderAs);
38491
38492                   } else if (geometry === 'line') {
38493                       p = getLineLabel(entity, width, fontSize);
38494
38495                   } else if (geometry === 'area') {
38496                       p = getAreaLabel(entity, width, fontSize);
38497                   }
38498
38499                   if (p) {
38500                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
38501                       p.classes = geometry + ' tag-' + labelStack[k][1];
38502                       positions[geometry].push(p);
38503                       labelled[geometry].push(entity);
38504                   }
38505               }
38506           }
38507
38508
38509           function isInterestingVertex(entity) {
38510               var selectedIDs = context.selectedIDs();
38511
38512               return entity.hasInterestingTags() ||
38513                   entity.isEndpoint(graph) ||
38514                   entity.isConnected(graph) ||
38515                   selectedIDs.indexOf(entity.id) !== -1 ||
38516                   some(graph.parentWays(entity), function(parent) {
38517                       return selectedIDs.indexOf(parent.id) !== -1;
38518                   });
38519           }
38520
38521
38522           function getPointLabel(entity, width, height, geometry) {
38523               var y = (geometry === 'point' ? -12 : 0);
38524               var pointOffsets = {
38525                   ltr: [15, y, 'start'],
38526                   rtl: [-15, y, 'end']
38527               };
38528
38529               var coord = projection(entity.loc);
38530               var textPadding = 2;
38531               var offset = pointOffsets[textDirection];
38532               var p = {
38533                   height: height,
38534                   width: width,
38535                   x: coord[0] + offset[0],
38536                   y: coord[1] + offset[1],
38537                   textAnchor: offset[2]
38538               };
38539
38540               // insert a collision box for the text label..
38541               var bbox;
38542               if (textDirection === 'rtl') {
38543                   bbox = {
38544                       minX: p.x - width - textPadding,
38545                       minY: p.y - (height / 2) - textPadding,
38546                       maxX: p.x + textPadding,
38547                       maxY: p.y + (height / 2) + textPadding
38548                   };
38549               } else {
38550                   bbox = {
38551                       minX: p.x - textPadding,
38552                       minY: p.y - (height / 2) - textPadding,
38553                       maxX: p.x + width + textPadding,
38554                       maxY: p.y + (height / 2) + textPadding
38555                   };
38556               }
38557
38558               if (tryInsert([bbox], entity.id, true)) {
38559                   return p;
38560               }
38561           }
38562
38563
38564           function getLineLabel(entity, width, height) {
38565               var viewport = geoExtent(context.projection.clipExtent()).polygon();
38566               var points = map$3(graph.childNodes(entity), 'loc').map(projection);
38567               var length = geoPathLength(points);
38568
38569               if (length < width + 20) return;
38570
38571               // todo: properly clip points to viewport
38572
38573               // % along the line to attempt to place the label
38574               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
38575                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
38576               var padding = 3;
38577
38578               for (var i = 0; i < lineOffsets.length; i++) {
38579                   var offset = lineOffsets[i];
38580                   var middle = offset / 100 * length;
38581                   var start = middle - width / 2;
38582
38583                   if (start < 0 || start + width > length) continue;
38584
38585                   // generate subpath and ignore paths that are invalid or don't cross viewport.
38586                   var sub = subpath(points, start, start + width);
38587                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
38588                       continue;
38589                   }
38590
38591                   var isReverse = reverse(sub);
38592                   if (isReverse) {
38593                       sub = sub.reverse();
38594                   }
38595
38596                   var bboxes = [];
38597                   var boxsize = (height + 2) / 2;
38598
38599                   for (var j = 0; j < sub.length - 1; j++) {
38600                       var a = sub[j];
38601                       var b = sub[j + 1];
38602
38603                       // split up the text into small collision boxes
38604                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
38605
38606                       for (var box = 0; box < num; box++) {
38607                           var p = geoVecInterp(a, b, box / num);
38608                           var x0 = p[0] - boxsize - padding;
38609                           var y0 = p[1] - boxsize - padding;
38610                           var x1 = p[0] + boxsize + padding;
38611                           var y1 = p[1] + boxsize + padding;
38612
38613                           bboxes.push({
38614                               minX: Math.min(x0, x1),
38615                               minY: Math.min(y0, y1),
38616                               maxX: Math.max(x0, x1),
38617                               maxY: Math.max(y0, y1)
38618                           });
38619                       }
38620                   }
38621
38622                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
38623                       return {
38624                           'font-size': height + 2,
38625                           lineString: lineString(sub),
38626                           startOffset: offset + '%'
38627                       };
38628                   }
38629               }
38630
38631               function reverse(p) {
38632                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
38633                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
38634               }
38635
38636               function lineString(points) {
38637                   return 'M' + points.join('L');
38638               }
38639
38640               function subpath(points, from, to) {
38641                   var sofar = 0;
38642                   var start, end, i0, i1;
38643
38644                   for (var i = 0; i < points.length - 1; i++) {
38645                       var a = points[i];
38646                       var b = points[i + 1];
38647                       var current = geoVecLength(a, b);
38648                       var portion;
38649                       if (!start && sofar + current >= from) {
38650                           portion = (from - sofar) / current;
38651                           start = [
38652                               a[0] + portion * (b[0] - a[0]),
38653                               a[1] + portion * (b[1] - a[1])
38654                           ];
38655                           i0 = i + 1;
38656                       }
38657                       if (!end && sofar + current >= to) {
38658                           portion = (to - sofar) / current;
38659                           end = [
38660                               a[0] + portion * (b[0] - a[0]),
38661                               a[1] + portion * (b[1] - a[1])
38662                           ];
38663                           i1 = i + 1;
38664                       }
38665                       sofar += current;
38666                   }
38667
38668                   var result = points.slice(i0, i1);
38669                   result.unshift(start);
38670                   result.push(end);
38671                   return result;
38672               }
38673           }
38674
38675
38676           function getAreaLabel(entity, width, height) {
38677               var centroid = path.centroid(entity.asGeoJSON(graph, true));
38678               var extent = entity.extent(graph);
38679               var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
38680
38681               if (isNaN(centroid[0]) || areaWidth < 20) return;
38682
38683               var preset = context.presets().match(entity, context.graph());
38684               var picon = preset && preset.icon;
38685               var iconSize = 17;
38686               var padding = 2;
38687               var p = {};
38688
38689               if (picon) {  // icon and label..
38690                   if (addIcon()) {
38691                       addLabel(iconSize + padding);
38692                       return p;
38693                   }
38694               } else {   // label only..
38695                   if (addLabel(0)) {
38696                       return p;
38697                   }
38698               }
38699
38700
38701               function addIcon() {
38702                   var iconX = centroid[0] - (iconSize / 2);
38703                   var iconY = centroid[1] - (iconSize / 2);
38704                   var bbox = {
38705                       minX: iconX,
38706                       minY: iconY,
38707                       maxX: iconX + iconSize,
38708                       maxY: iconY + iconSize
38709                   };
38710
38711                   if (tryInsert([bbox], entity.id + 'I', true)) {
38712                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
38713                       return true;
38714                   }
38715                   return false;
38716               }
38717
38718               function addLabel(yOffset) {
38719                   if (width && areaWidth >= width + 20) {
38720                       var labelX = centroid[0];
38721                       var labelY = centroid[1] + yOffset;
38722                       var bbox = {
38723                           minX: labelX - (width / 2) - padding,
38724                           minY: labelY - (height / 2) - padding,
38725                           maxX: labelX + (width / 2) + padding,
38726                           maxY: labelY + (height / 2) + padding
38727                       };
38728
38729                       if (tryInsert([bbox], entity.id, true)) {
38730                           p.x = labelX;
38731                           p.y = labelY;
38732                           p.textAnchor = 'middle';
38733                           p.height = height;
38734                           return true;
38735                       }
38736                   }
38737                   return false;
38738               }
38739           }
38740
38741
38742           // force insert a singular bounding box
38743           // singular box only, no array, id better be unique
38744           function doInsert(bbox, id) {
38745               bbox.id = id;
38746
38747               var oldbox = _entitybboxes[id];
38748               if (oldbox) {
38749                   _rdrawn.remove(oldbox);
38750               }
38751               _entitybboxes[id] = bbox;
38752               _rdrawn.insert(bbox);
38753           }
38754
38755
38756           function tryInsert(bboxes, id, saveSkipped) {
38757               var skipped = false;
38758
38759               for (var i = 0; i < bboxes.length; i++) {
38760                   var bbox = bboxes[i];
38761                   bbox.id = id;
38762
38763                   // Check that label is visible
38764                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
38765                       skipped = true;
38766                       break;
38767                   }
38768                   if (_rdrawn.collides(bbox)) {
38769                       skipped = true;
38770                       break;
38771                   }
38772               }
38773
38774               _entitybboxes[id] = bboxes;
38775
38776               if (skipped) {
38777                   if (saveSkipped) {
38778                       _rskipped.load(bboxes);
38779                   }
38780               } else {
38781                   _rdrawn.load(bboxes);
38782               }
38783
38784               return !skipped;
38785           }
38786
38787
38788           var layer = selection.selectAll('.layer-osm.labels');
38789           layer.selectAll('.labels-group')
38790               .data(['halo', 'label', 'debug'])
38791               .enter()
38792               .append('g')
38793               .attr('class', function(d) { return 'labels-group ' + d; });
38794
38795           var halo = layer.selectAll('.labels-group.halo');
38796           var label = layer.selectAll('.labels-group.label');
38797           var debug = layer.selectAll('.labels-group.debug');
38798
38799           // points
38800           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
38801           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
38802
38803           // lines
38804           drawLinePaths(layer, labelled.line, filter, '', positions.line);
38805           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
38806           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
38807
38808           // areas
38809           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
38810           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
38811           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
38812           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
38813
38814           // debug
38815           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
38816           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
38817
38818           layer.call(filterLabels);
38819       }
38820
38821
38822       function filterLabels(selection) {
38823           var drawLayer = selection.selectAll('.layer-osm.labels');
38824           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
38825
38826           layers.selectAll('.nolabel')
38827               .classed('nolabel', false);
38828
38829           var mouse = context.mouse();
38830           var graph = context.graph();
38831           var selectedIDs = context.selectedIDs();
38832           var ids = [];
38833           var pad, bbox;
38834
38835           // hide labels near the mouse
38836           if (mouse) {
38837               pad = 20;
38838               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
38839               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
38840           }
38841
38842           // hide labels on selected nodes (they look weird when dragging / haloed)
38843           for (var i = 0; i < selectedIDs.length; i++) {
38844               var entity = graph.hasEntity(selectedIDs[i]);
38845               if (entity && entity.type === 'node') {
38846                   ids.push(selectedIDs[i]);
38847               }
38848           }
38849
38850           layers.selectAll(utilEntitySelector(ids))
38851               .classed('nolabel', true);
38852
38853
38854           // draw the mouse bbox if debugging is on..
38855           var debug = selection.selectAll('.labels-group.debug');
38856           var gj = [];
38857           if (context.getDebug('collision')) {
38858               gj = bbox ? [{
38859                   type: 'Polygon',
38860                   coordinates: [[
38861                       [bbox.minX, bbox.minY],
38862                       [bbox.maxX, bbox.minY],
38863                       [bbox.maxX, bbox.maxY],
38864                       [bbox.minX, bbox.maxY],
38865                       [bbox.minX, bbox.minY]
38866                   ]]
38867               }] : [];
38868           }
38869
38870           var box = debug.selectAll('.debug-mouse')
38871               .data(gj);
38872
38873           // exit
38874           box.exit()
38875               .remove();
38876
38877           // enter/update
38878           box.enter()
38879               .append('path')
38880               .attr('class', 'debug debug-mouse yellow')
38881               .merge(box)
38882               .attr('d', d3_geoPath());
38883       }
38884
38885
38886       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
38887
38888
38889       drawLabels.observe = function(selection) {
38890           var listener = function() { throttleFilterLabels(selection); };
38891           selection.on('mousemove.hidelabels', listener);
38892           context.on('enter.hidelabels', listener);
38893       };
38894
38895
38896       drawLabels.off = function(selection) {
38897           throttleFilterLabels.cancel();
38898           selection.on('mousemove.hidelabels', null);
38899           context.on('enter.hidelabels', null);
38900       };
38901
38902
38903       return drawLabels;
38904   }
38905
38906   var _improveOsmEnabled = false;
38907   var _errorService;
38908
38909
38910   function svgImproveOSM(projection, context, dispatch) {
38911       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
38912       var minZoom = 12;
38913       var touchLayer = select(null);
38914       var drawLayer = select(null);
38915       var _improveOsmVisible = false;
38916
38917       function markerPath(selection, klass) {
38918           selection
38919               .attr('class', klass)
38920               .attr('transform', 'translate(-10, -28)')
38921               .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
38922       }
38923
38924
38925       // Loosely-coupled improveOSM service for fetching errors.
38926       function getService() {
38927           if (services.improveOSM && !_errorService) {
38928               _errorService = services.improveOSM;
38929               _errorService.on('loaded', throttledRedraw);
38930           } else if (!services.improveOSM && _errorService) {
38931               _errorService = null;
38932           }
38933
38934           return _errorService;
38935       }
38936
38937
38938       // Show the errors
38939       function editOn() {
38940           if (!_improveOsmVisible) {
38941               _improveOsmVisible = true;
38942               drawLayer
38943                   .style('display', 'block');
38944           }
38945       }
38946
38947
38948       // Immediately remove the errors and their touch targets
38949       function editOff() {
38950           if (_improveOsmVisible) {
38951               _improveOsmVisible = false;
38952               drawLayer
38953                   .style('display', 'none');
38954               drawLayer.selectAll('.qa_error.improveOSM')
38955                   .remove();
38956               touchLayer.selectAll('.qa_error.improveOSM')
38957                   .remove();
38958           }
38959       }
38960
38961
38962       // Enable the layer.  This shows the errors and transitions them to visible.
38963       function layerOn() {
38964           editOn();
38965
38966           drawLayer
38967               .style('opacity', 0)
38968               .transition()
38969               .duration(250)
38970               .style('opacity', 1)
38971               .on('end interrupt', function () {
38972                   dispatch.call('change');
38973               });
38974       }
38975
38976
38977       // Disable the layer.  This transitions the layer invisible and then hides the errors.
38978       function layerOff() {
38979           throttledRedraw.cancel();
38980           drawLayer.interrupt();
38981           touchLayer.selectAll('.qa_error.improveOSM')
38982               .remove();
38983
38984           drawLayer
38985               .transition()
38986               .duration(250)
38987               .style('opacity', 0)
38988               .on('end interrupt', function () {
38989                   editOff();
38990                   dispatch.call('change');
38991               });
38992       }
38993
38994
38995       // Update the error markers
38996       function updateMarkers() {
38997           if (!_improveOsmVisible || !_improveOsmEnabled) return;
38998
38999           var service = getService();
39000           var selectedID = context.selectedErrorID();
39001           var data = (service ? service.getErrors(projection) : []);
39002           var getTransform = svgPointTransform(projection);
39003
39004           // Draw markers..
39005           var markers = drawLayer.selectAll('.qa_error.improveOSM')
39006               .data(data, function(d) { return d.id; });
39007
39008           // exit
39009           markers.exit()
39010               .remove();
39011
39012           // enter
39013           var markersEnter = markers.enter()
39014               .append('g')
39015               .attr('class', function(d) {
39016                   return [
39017                       'qa_error',
39018                       d.service,
39019                       'error_id-' + d.id,
39020                       'error_type-' + d.error_type,
39021                       'category-' + d.category
39022                   ].join(' ');
39023               });
39024
39025           markersEnter
39026               .append('polygon')
39027               .call(markerPath, 'shadow');
39028
39029           markersEnter
39030               .append('ellipse')
39031               .attr('cx', 0)
39032               .attr('cy', 0)
39033               .attr('rx', 4.5)
39034               .attr('ry', 2)
39035               .attr('class', 'stroke');
39036
39037           markersEnter
39038               .append('polygon')
39039               .attr('fill', 'currentColor')
39040               .call(markerPath, 'qa_error-fill');
39041
39042           markersEnter
39043               .append('use')
39044               .attr('transform', 'translate(-5.5, -21)')
39045               .attr('class', 'icon-annotation')
39046               .attr('width', '11px')
39047               .attr('height', '11px')
39048               .attr('xlink:href', function(d) {
39049                   var picon = d.icon;
39050
39051                   if (!picon) {
39052                       return '';
39053                   } else {
39054                       var isMaki = /^maki-/.test(picon);
39055                       return '#' + picon + (isMaki ? '-11' : '');
39056                   }
39057               });
39058
39059           // update
39060           markers
39061               .merge(markersEnter)
39062               .sort(sortY)
39063               .classed('selected', function(d) { return d.id === selectedID; })
39064               .attr('transform', getTransform);
39065
39066
39067           // Draw targets..
39068           if (touchLayer.empty()) return;
39069           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
39070
39071           var targets = touchLayer.selectAll('.qa_error.improveOSM')
39072               .data(data, function(d) { return d.id; });
39073
39074           // exit
39075           targets.exit()
39076               .remove();
39077
39078           // enter/update
39079           targets.enter()
39080               .append('rect')
39081               .attr('width', '20px')
39082               .attr('height', '30px')
39083               .attr('x', '-10px')
39084               .attr('y', '-28px')
39085               .merge(targets)
39086               .sort(sortY)
39087               .attr('class', function(d) {
39088                   return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
39089               })
39090               .attr('transform', getTransform);
39091
39092
39093           function sortY(a, b) {
39094               return (a.id === selectedID) ? 1
39095                   : (b.id === selectedID) ? -1
39096                   : b.loc[1] - a.loc[1];
39097           }
39098       }
39099
39100
39101       // Draw the ImproveOSM layer and schedule loading errors and updating markers.
39102       function drawImproveOSM(selection) {
39103           var service = getService();
39104
39105           var surface = context.surface();
39106           if (surface && !surface.empty()) {
39107               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
39108           }
39109
39110           drawLayer = selection.selectAll('.layer-improveOSM')
39111               .data(service ? [0] : []);
39112
39113           drawLayer.exit()
39114               .remove();
39115
39116           drawLayer = drawLayer.enter()
39117               .append('g')
39118               .attr('class', 'layer-improveOSM')
39119               .style('display', _improveOsmEnabled ? 'block' : 'none')
39120               .merge(drawLayer);
39121
39122           if (_improveOsmEnabled) {
39123               if (service && ~~context.map().zoom() >= minZoom) {
39124                   editOn();
39125                   service.loadErrors(projection);
39126                   updateMarkers();
39127               } else {
39128                   editOff();
39129               }
39130           }
39131       }
39132
39133
39134       // Toggles the layer on and off
39135       drawImproveOSM.enabled = function(val) {
39136           if (!arguments.length) return _improveOsmEnabled;
39137
39138           _improveOsmEnabled = val;
39139           if (_improveOsmEnabled) {
39140               layerOn();
39141           } else {
39142               layerOff();
39143               if (context.selectedErrorID()) {
39144                   context.enter(modeBrowse(context));
39145               }
39146           }
39147
39148           dispatch.call('change');
39149           return this;
39150       };
39151
39152
39153       drawImproveOSM.supported = function() {
39154           return !!getService();
39155       };
39156
39157
39158       return drawImproveOSM;
39159   }
39160
39161   function svgStreetside(projection, context, dispatch) {
39162       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39163       var minZoom = 14;
39164       var minMarkerZoom = 16;
39165       var minViewfieldZoom = 18;
39166       var layer = select(null);
39167       var _viewerYaw = 0;
39168       var _selectedSequence = null;
39169       var _streetside;
39170
39171       /**
39172        * init().
39173        */
39174       function init() {
39175           if (svgStreetside.initialized) return;  // run once
39176           svgStreetside.enabled = false;
39177           svgStreetside.initialized = true;
39178       }
39179
39180       /**
39181        * getService().
39182        */
39183       function getService() {
39184           if (services.streetside && !_streetside) {
39185               _streetside = services.streetside;
39186               _streetside.event
39187                   .on('viewerChanged', viewerChanged)
39188                   .on('loadedBubbles', throttledRedraw);
39189           } else if (!services.streetside && _streetside) {
39190               _streetside = null;
39191           }
39192
39193           return _streetside;
39194       }
39195
39196       /**
39197        * showLayer().
39198        */
39199       function showLayer() {
39200           var service = getService();
39201           if (!service) return;
39202
39203           service.loadViewer(context);
39204           editOn();
39205
39206           layer
39207               .style('opacity', 0)
39208               .transition()
39209               .duration(250)
39210               .style('opacity', 1)
39211               .on('end', function () { dispatch.call('change'); });
39212       }
39213
39214       /**
39215        * hideLayer().
39216        */
39217       function hideLayer() {
39218           throttledRedraw.cancel();
39219
39220           layer
39221               .transition()
39222               .duration(250)
39223               .style('opacity', 0)
39224               .on('end', editOff);
39225       }
39226
39227       /**
39228        * editOn().
39229        */
39230       function editOn() {
39231           layer.style('display', 'block');
39232       }
39233
39234       /**
39235        * editOff().
39236        */
39237       function editOff() {
39238           layer.selectAll('.viewfield-group').remove();
39239           layer.style('display', 'none');
39240       }
39241
39242       /**
39243        * click() Handles 'bubble' point click event.
39244        */
39245       function click(d) {
39246           var service = getService();
39247           if (!service) return;
39248
39249           // try to preserve the viewer rotation when staying on the same sequence
39250           if (d.sequenceKey !== _selectedSequence) {
39251               _viewerYaw = 0;  // reset
39252           }
39253           _selectedSequence = d.sequenceKey;
39254
39255           service
39256               .selectImage(d)
39257               .then(function(r) {
39258                   if (r.status === 'ok'){
39259                       service.showViewer(_viewerYaw);
39260                   }
39261               });
39262
39263
39264           context.map().centerEase(d.loc);
39265       }
39266
39267       /**
39268        * mouseover().
39269        */
39270       function mouseover(d) {
39271           var service = getService();
39272           if (service) service.setStyles(d);
39273       }
39274
39275       /**
39276        * mouseout().
39277        */
39278       function mouseout() {
39279           var service = getService();
39280           if (service) service.setStyles(null);
39281       }
39282
39283       /**
39284        * transform().
39285        */
39286       function transform(d) {
39287           var t = svgPointTransform(projection)(d);
39288           var rot = d.ca + _viewerYaw;
39289           if (rot) {
39290               t += ' rotate(' + Math.floor(rot) + ',0,0)';
39291           }
39292           return t;
39293       }
39294
39295
39296       function viewerChanged() {
39297           var service = getService();
39298           if (!service) return;
39299
39300           var viewer = service.viewer();
39301           if (!viewer) return;
39302
39303           // update viewfield rotation
39304           _viewerYaw = viewer.getYaw();
39305
39306           // avoid updating if the map is currently transformed
39307           // e.g. during drags or easing.
39308           if (context.map().isTransformed()) return;
39309
39310           layer.selectAll('.viewfield-group.currentView')
39311               .attr('transform', transform);
39312       }
39313
39314
39315       /**
39316        * update().
39317        */
39318       function update() {
39319           var viewer = select('#photoviewer');
39320           var selected = viewer.empty() ? undefined : viewer.datum();
39321           var z = ~~context.map().zoom();
39322           var showMarkers = (z >= minMarkerZoom);
39323           var showViewfields = (z >= minViewfieldZoom);
39324           var service = getService();
39325
39326           var sequences = (service ? service.sequences(projection) : []);
39327           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
39328
39329           var traces = layer.selectAll('.sequences').selectAll('.sequence')
39330               .data(sequences, function(d) { return d.properties.key; });
39331
39332           // exit
39333           traces.exit()
39334               .remove();
39335
39336           // enter/update
39337           traces = traces.enter()
39338               .append('path')
39339               .attr('class', 'sequence')
39340               .merge(traces)
39341               .attr('d', svgPath(projection).geojson);
39342
39343
39344           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
39345               .data(bubbles, function(d) {
39346                   // force reenter once bubbles are attached to a sequence
39347                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
39348               });
39349
39350           // exit
39351           groups.exit()
39352               .remove();
39353
39354           // enter
39355           var groupsEnter = groups.enter()
39356               .append('g')
39357               .attr('class', 'viewfield-group')
39358               .on('mouseenter', mouseover)
39359               .on('mouseleave', mouseout)
39360               .on('click', click);
39361
39362           groupsEnter
39363               .append('g')
39364               .attr('class', 'viewfield-scale');
39365
39366           // update
39367           var markers = groups
39368               .merge(groupsEnter)
39369               .sort(function(a, b) {
39370                   return (a === selected) ? 1
39371                       : (b === selected) ? -1
39372                       : b.loc[1] - a.loc[1];
39373               })
39374               .attr('transform', transform)
39375               .select('.viewfield-scale');
39376
39377
39378           markers.selectAll('circle')
39379               .data([0])
39380               .enter()
39381               .append('circle')
39382               .attr('dx', '0')
39383               .attr('dy', '0')
39384               .attr('r', '6');
39385
39386           var viewfields = markers.selectAll('.viewfield')
39387               .data(showViewfields ? [0] : []);
39388
39389           viewfields.exit()
39390               .remove();
39391
39392           // viewfields may or may not be drawn...
39393           // but if they are, draw below the circles
39394           viewfields.enter()
39395               .insert('path', 'circle')
39396               .attr('class', 'viewfield')
39397               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
39398               .attr('d', viewfieldPath);
39399
39400           function viewfieldPath() {
39401               var d = this.parentNode.__data__;
39402               if (d.pano) {
39403                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39404               } else {
39405                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39406               }
39407           }
39408
39409       }
39410
39411       /**
39412        * drawImages()
39413        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
39414        * 'svgStreetside()' is called from index.js
39415        */
39416       function drawImages(selection) {
39417           var enabled = svgStreetside.enabled;
39418           var service = getService();
39419
39420           layer = selection.selectAll('.layer-streetside-images')
39421               .data(service ? [0] : []);
39422
39423           layer.exit()
39424               .remove();
39425
39426           var layerEnter = layer.enter()
39427               .append('g')
39428               .attr('class', 'layer-streetside-images')
39429               .style('display', enabled ? 'block' : 'none');
39430
39431           layerEnter
39432               .append('g')
39433               .attr('class', 'sequences');
39434
39435           layerEnter
39436               .append('g')
39437               .attr('class', 'markers');
39438
39439           layer = layerEnter
39440               .merge(layer);
39441
39442           if (enabled) {
39443               if (service && ~~context.map().zoom() >= minZoom) {
39444                   editOn();
39445                   update();
39446                   service.loadBubbles(projection);
39447               } else {
39448                   editOff();
39449               }
39450           }
39451       }
39452
39453
39454       /**
39455        * drawImages.enabled().
39456        */
39457       drawImages.enabled = function(_) {
39458           if (!arguments.length) return svgStreetside.enabled;
39459           svgStreetside.enabled = _;
39460           if (svgStreetside.enabled) {
39461               showLayer();
39462           } else {
39463               hideLayer();
39464           }
39465           dispatch.call('change');
39466           return this;
39467       };
39468
39469       /**
39470        * drawImages.supported().
39471        */
39472       drawImages.supported = function() {
39473           return !!getService();
39474       };
39475
39476       init();
39477
39478       return drawImages;
39479   }
39480
39481   function svgMapillaryImages(projection, context, dispatch) {
39482       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39483       var minZoom = 12;
39484       var minMarkerZoom = 16;
39485       var minViewfieldZoom = 18;
39486       var layer = select(null);
39487       var _mapillary;
39488       var viewerCompassAngle;
39489
39490
39491       function init() {
39492           if (svgMapillaryImages.initialized) return;  // run once
39493           svgMapillaryImages.enabled = false;
39494           svgMapillaryImages.initialized = true;
39495       }
39496
39497
39498       function getService() {
39499           if (services.mapillary && !_mapillary) {
39500               _mapillary = services.mapillary;
39501               _mapillary.event.on('loadedImages', throttledRedraw);
39502               _mapillary.event.on('bearingChanged', function(e) {
39503                   viewerCompassAngle = e;
39504
39505                   // avoid updating if the map is currently transformed
39506                   // e.g. during drags or easing.
39507                   if (context.map().isTransformed()) return;
39508
39509                   layer.selectAll('.viewfield-group.currentView')
39510                       .filter(function(d) {
39511                           return d.pano;
39512                       })
39513                       .attr('transform', transform);
39514               });
39515           } else if (!services.mapillary && _mapillary) {
39516               _mapillary = null;
39517           }
39518
39519           return _mapillary;
39520       }
39521
39522
39523       function showLayer() {
39524           var service = getService();
39525           if (!service) return;
39526
39527           service.loadViewer(context);
39528           editOn();
39529
39530           layer
39531               .style('opacity', 0)
39532               .transition()
39533               .duration(250)
39534               .style('opacity', 1)
39535               .on('end', function () { dispatch.call('change'); });
39536       }
39537
39538
39539       function hideLayer() {
39540           throttledRedraw.cancel();
39541
39542           layer
39543               .transition()
39544               .duration(250)
39545               .style('opacity', 0)
39546               .on('end', editOff);
39547       }
39548
39549
39550       function editOn() {
39551           layer.style('display', 'block');
39552       }
39553
39554
39555       function editOff() {
39556           layer.selectAll('.viewfield-group').remove();
39557           layer.style('display', 'none');
39558       }
39559
39560
39561       function click(d) {
39562           var service = getService();
39563           if (!service) return;
39564
39565           service
39566               .selectImage(d)
39567               .updateViewer(d.key, context)
39568               .showViewer();
39569
39570           context.map().centerEase(d.loc);
39571       }
39572
39573
39574       function mouseover(d) {
39575           var service = getService();
39576           if (service) service.setStyles(d);
39577       }
39578
39579
39580       function mouseout() {
39581           var service = getService();
39582           if (service) service.setStyles(null);
39583       }
39584
39585
39586       function transform(d) {
39587           var t = svgPointTransform(projection)(d);
39588           if (d.pano && isNumber(viewerCompassAngle)) {
39589               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
39590           } else if (d.ca) {
39591               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
39592           }
39593           return t;
39594       }
39595
39596
39597       function update() {
39598           var viewer = select('#photoviewer');
39599           var selected = viewer.empty() ? undefined : viewer.datum();
39600
39601           var z = ~~context.map().zoom();
39602           var showMarkers = (z >= minMarkerZoom);
39603           var showViewfields = (z >= minViewfieldZoom);
39604
39605           var service = getService();
39606           var sequences = (service ? service.sequences(projection) : []);
39607           var images = (service && showMarkers ? service.images(projection) : []);
39608
39609           var traces = layer.selectAll('.sequences').selectAll('.sequence')
39610               .data(sequences, function(d) { return d.properties.key; });
39611
39612           // exit
39613           traces.exit()
39614               .remove();
39615
39616           // enter/update
39617           traces = traces.enter()
39618               .append('path')
39619               .attr('class', 'sequence')
39620               .merge(traces)
39621               .attr('d', svgPath(projection).geojson);
39622
39623
39624           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
39625               .data(images, function(d) { return d.key; });
39626
39627           // exit
39628           groups.exit()
39629               .remove();
39630
39631           // enter
39632           var groupsEnter = groups.enter()
39633               .append('g')
39634               .attr('class', 'viewfield-group')
39635               .on('mouseenter', mouseover)
39636               .on('mouseleave', mouseout)
39637               .on('click', click);
39638
39639           groupsEnter
39640               .append('g')
39641               .attr('class', 'viewfield-scale');
39642
39643           // update
39644           var markers = groups
39645               .merge(groupsEnter)
39646               .sort(function(a, b) {
39647                   return (a === selected) ? 1
39648                       : (b === selected) ? -1
39649                       : b.loc[1] - a.loc[1];  // sort Y
39650               })
39651               .attr('transform', transform)
39652               .select('.viewfield-scale');
39653
39654
39655           markers.selectAll('circle')
39656               .data([0])
39657               .enter()
39658               .append('circle')
39659               .attr('dx', '0')
39660               .attr('dy', '0')
39661               .attr('r', '6');
39662
39663           var viewfields = markers.selectAll('.viewfield')
39664               .data(showViewfields ? [0] : []);
39665
39666           viewfields.exit()
39667               .remove();
39668
39669           viewfields.enter()               // viewfields may or may not be drawn...
39670               .insert('path', 'circle')    // but if they are, draw below the circles
39671               .attr('class', 'viewfield')
39672               .classed('pano', function() { return this.parentNode.__data__.pano; })
39673               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
39674               .attr('d', viewfieldPath);
39675
39676           function viewfieldPath() {
39677               var d = this.parentNode.__data__;
39678               if (d.pano) {
39679                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39680               } else {
39681                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39682               }
39683           }
39684       }
39685
39686
39687       function drawImages(selection) {
39688           var enabled = svgMapillaryImages.enabled;
39689           var service = getService();
39690
39691           layer = selection.selectAll('.layer-mapillary-images')
39692               .data(service ? [0] : []);
39693
39694           layer.exit()
39695               .remove();
39696
39697           var layerEnter = layer.enter()
39698               .append('g')
39699               .attr('class', 'layer-mapillary-images')
39700               .style('display', enabled ? 'block' : 'none');
39701
39702           layerEnter
39703               .append('g')
39704               .attr('class', 'sequences');
39705
39706           layerEnter
39707               .append('g')
39708               .attr('class', 'markers');
39709
39710           layer = layerEnter
39711               .merge(layer);
39712
39713           if (enabled) {
39714               if (service && ~~context.map().zoom() >= minZoom) {
39715                   editOn();
39716                   update();
39717                   service.loadImages(projection);
39718               } else {
39719                   editOff();
39720               }
39721           }
39722       }
39723
39724
39725       drawImages.enabled = function(_) {
39726           if (!arguments.length) return svgMapillaryImages.enabled;
39727           svgMapillaryImages.enabled = _;
39728           if (svgMapillaryImages.enabled) {
39729               showLayer();
39730           } else {
39731               hideLayer();
39732           }
39733           dispatch.call('change');
39734           return this;
39735       };
39736
39737
39738       drawImages.supported = function() {
39739           return !!getService();
39740       };
39741
39742
39743       init();
39744       return drawImages;
39745   }
39746
39747   function svgMapillarySigns(projection, context, dispatch) {
39748       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39749       var minZoom = 12;
39750       var layer = select(null);
39751       var _mapillary;
39752
39753
39754       function init() {
39755           if (svgMapillarySigns.initialized) return;  // run once
39756           svgMapillarySigns.enabled = false;
39757           svgMapillarySigns.initialized = true;
39758       }
39759
39760
39761       function getService() {
39762           if (services.mapillary && !_mapillary) {
39763               _mapillary = services.mapillary;
39764               _mapillary.event.on('loadedSigns', throttledRedraw);
39765           } else if (!services.mapillary && _mapillary) {
39766               _mapillary = null;
39767           }
39768           return _mapillary;
39769       }
39770
39771
39772       function showLayer() {
39773           var service = getService();
39774           if (!service) return;
39775
39776           service.loadViewer(context);
39777           editOn();
39778       }
39779
39780
39781       function hideLayer() {
39782           throttledRedraw.cancel();
39783           editOff();
39784       }
39785
39786
39787       function editOn() {
39788           layer.style('display', 'block');
39789       }
39790
39791
39792       function editOff() {
39793           layer.selectAll('.icon-sign').remove();
39794           layer.style('display', 'none');
39795       }
39796
39797
39798       function click(d) {
39799           var service = getService();
39800           if (!service) return;
39801
39802           context.map().centerEase(d.loc);
39803
39804           var selected = service.getSelectedImage();
39805           var selectedImageKey = selected && selected.key;
39806           var imageKey;
39807
39808           // Pick one of the images the sign was detected in,
39809           // preference given to an image already selected.
39810           d.detections.forEach(function(detection) {
39811               if (!imageKey || selectedImageKey === detection.image_key) {
39812                   imageKey = detection.image_key;
39813               }
39814           });
39815
39816           service
39817               .selectImage(null, imageKey)
39818               .updateViewer(imageKey, context)
39819               .showViewer();
39820       }
39821
39822
39823       function update() {
39824           var service = getService();
39825           var data = (service ? service.signs(projection) : []);
39826           var viewer = select('#photoviewer');
39827           var selected = viewer.empty() ? undefined : viewer.datum();
39828           var selectedImageKey = selected && selected.key;
39829           var transform = svgPointTransform(projection);
39830
39831           var signs = layer.selectAll('.icon-sign')
39832               .data(data, function(d) { return d.key; });
39833
39834           // exit
39835           signs.exit()
39836               .remove();
39837
39838           // enter
39839           var enter = signs.enter()
39840               .append('use')
39841               .attr('class', 'icon-sign')
39842               .attr('width', '24px')
39843               .attr('height', '24px')
39844               .attr('x', '-12px')
39845               .attr('y', '-12px')
39846               .attr('xlink:href', function(d) { return '#' + d.value; })
39847               .classed('currentView', function(d) {
39848                   return some(d.detections, function(detection) {
39849                       return detection.image_key === selectedImageKey;
39850                   });
39851               })
39852               .on('click', click);
39853
39854           // update
39855           signs
39856               .merge(enter)
39857               .sort(function(a, b) {
39858                   return (a === selected) ? 1
39859                       : (b === selected) ? -1
39860                       : b.loc[1] - a.loc[1];  // sort Y
39861               })
39862               .attr('transform', transform);
39863       }
39864
39865
39866       function drawSigns(selection) {
39867           var enabled = svgMapillarySigns.enabled;
39868           var service = getService();
39869
39870           layer = selection.selectAll('.layer-mapillary-signs')
39871               .data(service ? [0] : []);
39872
39873           layer.exit()
39874               .remove();
39875
39876           layer = layer.enter()
39877               .append('g')
39878               .attr('class', 'layer-mapillary-signs')
39879               .style('display', enabled ? 'block' : 'none')
39880               .merge(layer);
39881
39882           if (enabled) {
39883               if (service && ~~context.map().zoom() >= minZoom) {
39884                   editOn();
39885                   update();
39886                   service.loadSigns(context, projection);
39887               } else {
39888                   editOff();
39889               }
39890           }
39891       }
39892
39893
39894       drawSigns.enabled = function(_) {
39895           if (!arguments.length) return svgMapillarySigns.enabled;
39896           svgMapillarySigns.enabled = _;
39897           if (svgMapillarySigns.enabled) {
39898               showLayer();
39899           } else {
39900               hideLayer();
39901           }
39902           dispatch.call('change');
39903           return this;
39904       };
39905
39906
39907       drawSigns.supported = function() {
39908           return !!getService();
39909       };
39910
39911
39912       init();
39913       return drawSigns;
39914   }
39915
39916   function svgOpenstreetcamImages(projection, context, dispatch) {
39917       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
39918       var minZoom = 12;
39919       var minMarkerZoom = 16;
39920       var minViewfieldZoom = 18;
39921       var layer = select(null);
39922       var _openstreetcam;
39923
39924
39925       function init() {
39926           if (svgOpenstreetcamImages.initialized) return;  // run once
39927           svgOpenstreetcamImages.enabled = false;
39928           svgOpenstreetcamImages.initialized = true;
39929       }
39930
39931
39932       function getService() {
39933           if (services.openstreetcam && !_openstreetcam) {
39934               _openstreetcam = services.openstreetcam;
39935               _openstreetcam.event.on('loadedImages', throttledRedraw);
39936           } else if (!services.openstreetcam && _openstreetcam) {
39937               _openstreetcam = null;
39938           }
39939
39940           return _openstreetcam;
39941       }
39942
39943
39944       function showLayer() {
39945           var service = getService();
39946           if (!service) return;
39947
39948           service.loadViewer(context);
39949           editOn();
39950
39951           layer
39952               .style('opacity', 0)
39953               .transition()
39954               .duration(250)
39955               .style('opacity', 1)
39956               .on('end', function () { dispatch.call('change'); });
39957       }
39958
39959
39960       function hideLayer() {
39961           throttledRedraw.cancel();
39962
39963           layer
39964               .transition()
39965               .duration(250)
39966               .style('opacity', 0)
39967               .on('end', editOff);
39968       }
39969
39970
39971       function editOn() {
39972           layer.style('display', 'block');
39973       }
39974
39975
39976       function editOff() {
39977           layer.selectAll('.viewfield-group').remove();
39978           layer.style('display', 'none');
39979       }
39980
39981
39982       function click(d) {
39983           var service = getService();
39984           if (!service) return;
39985
39986           service
39987               .selectImage(d)
39988               .updateViewer(d)
39989               .showViewer();
39990
39991           context.map().centerEase(d.loc);
39992       }
39993
39994
39995       function mouseover(d) {
39996           var service = getService();
39997           if (service) service.setStyles(d);
39998       }
39999
40000
40001       function mouseout() {
40002           var service = getService();
40003           if (service) service.setStyles(null);
40004       }
40005
40006
40007       function transform(d) {
40008           var t = svgPointTransform(projection)(d);
40009           if (d.ca) {
40010               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
40011           }
40012           return t;
40013       }
40014
40015
40016       function update() {
40017           var viewer = select('#photoviewer');
40018           var selected = viewer.empty() ? undefined : viewer.datum();
40019
40020           var z = ~~context.map().zoom();
40021           var showMarkers = (z >= minMarkerZoom);
40022           var showViewfields = (z >= minViewfieldZoom);
40023
40024           var service = getService();
40025           var sequences = (service ? service.sequences(projection) : []);
40026           var images = (service && showMarkers ? service.images(projection) : []);
40027
40028           var traces = layer.selectAll('.sequences').selectAll('.sequence')
40029               .data(sequences, function(d) { return d.properties.key; });
40030
40031           // exit
40032           traces.exit()
40033               .remove();
40034
40035           // enter/update
40036           traces = traces.enter()
40037               .append('path')
40038               .attr('class', 'sequence')
40039               .merge(traces)
40040               .attr('d', svgPath(projection).geojson);
40041
40042
40043           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
40044               .data(images, function(d) { return d.key; });
40045
40046           // exit
40047           groups.exit()
40048               .remove();
40049
40050           // enter
40051           var groupsEnter = groups.enter()
40052               .append('g')
40053               .attr('class', 'viewfield-group')
40054               .on('mouseenter', mouseover)
40055               .on('mouseleave', mouseout)
40056               .on('click', click);
40057
40058           groupsEnter
40059               .append('g')
40060               .attr('class', 'viewfield-scale');
40061
40062           // update
40063           var markers = groups
40064               .merge(groupsEnter)
40065               .sort(function(a, b) {
40066                   return (a === selected) ? 1
40067                       : (b === selected) ? -1
40068                       : b.loc[1] - a.loc[1];  // sort Y
40069               })
40070               .attr('transform', transform)
40071               .select('.viewfield-scale');
40072
40073
40074           markers.selectAll('circle')
40075               .data([0])
40076               .enter()
40077               .append('circle')
40078               .attr('dx', '0')
40079               .attr('dy', '0')
40080               .attr('r', '6');
40081
40082           var viewfields = markers.selectAll('.viewfield')
40083               .data(showViewfields ? [0] : []);
40084
40085           viewfields.exit()
40086               .remove();
40087
40088           viewfields.enter()               // viewfields may or may not be drawn...
40089               .insert('path', 'circle')    // but if they are, draw below the circles
40090               .attr('class', 'viewfield')
40091               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
40092               .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');
40093       }
40094
40095
40096       function drawImages(selection) {
40097           var enabled = svgOpenstreetcamImages.enabled,
40098               service = getService();
40099
40100           layer = selection.selectAll('.layer-openstreetcam-images')
40101               .data(service ? [0] : []);
40102
40103           layer.exit()
40104               .remove();
40105
40106           var layerEnter = layer.enter()
40107               .append('g')
40108               .attr('class', 'layer-openstreetcam-images')
40109               .style('display', enabled ? 'block' : 'none');
40110
40111           layerEnter
40112               .append('g')
40113               .attr('class', 'sequences');
40114
40115           layerEnter
40116               .append('g')
40117               .attr('class', 'markers');
40118
40119           layer = layerEnter
40120               .merge(layer);
40121
40122           if (enabled) {
40123               if (service && ~~context.map().zoom() >= minZoom) {
40124                   editOn();
40125                   update();
40126                   service.loadImages(projection);
40127               } else {
40128                   editOff();
40129               }
40130           }
40131       }
40132
40133
40134       drawImages.enabled = function(_) {
40135           if (!arguments.length) return svgOpenstreetcamImages.enabled;
40136           svgOpenstreetcamImages.enabled = _;
40137           if (svgOpenstreetcamImages.enabled) {
40138               showLayer();
40139           } else {
40140               hideLayer();
40141           }
40142           dispatch.call('change');
40143           return this;
40144       };
40145
40146
40147       drawImages.supported = function() {
40148           return !!getService();
40149       };
40150
40151
40152       init();
40153       return drawImages;
40154   }
40155
40156   function svgOsm(projection, context, dispatch) {
40157       var enabled = true;
40158
40159
40160       function drawOsm(selection) {
40161           selection.selectAll('.layer-osm')
40162               .data(['covered', 'areas', 'lines', 'points', 'labels'])
40163               .enter()
40164               .append('g')
40165               .attr('class', function(d) { return 'layer-osm ' + d; });
40166
40167           selection.selectAll('.layer-osm.points').selectAll('.points-group')
40168               .data(['points', 'midpoints', 'vertices', 'turns'])
40169               .enter()
40170               .append('g')
40171               .attr('class', function(d) { return 'points-group ' + d; });
40172       }
40173
40174
40175       function showLayer() {
40176           var layer = context.surface().selectAll('.data-layer.osm');
40177           layer.interrupt();
40178
40179           layer
40180               .classed('disabled', false)
40181               .style('opacity', 0)
40182               .transition()
40183               .duration(250)
40184               .style('opacity', 1)
40185               .on('end interrupt', function () {
40186                   dispatch.call('change');
40187               });
40188       }
40189
40190
40191       function hideLayer() {
40192           var layer = context.surface().selectAll('.data-layer.osm');
40193           layer.interrupt();
40194
40195           layer
40196               .transition()
40197               .duration(250)
40198               .style('opacity', 0)
40199               .on('end interrupt', function () {
40200                   layer.classed('disabled', true);
40201                   dispatch.call('change');
40202               });
40203       }
40204
40205
40206       drawOsm.enabled = function(_) {
40207           if (!arguments.length) return enabled;
40208           enabled = _;
40209
40210           if (enabled) {
40211               showLayer();
40212           } else {
40213               hideLayer();
40214           }
40215
40216           dispatch.call('change');
40217           return this;
40218       };
40219
40220
40221       return drawOsm;
40222   }
40223
40224   var _notesEnabled = false;
40225   var _osmService;
40226
40227
40228   function svgNotes(projection, context, dispatch$1) {
40229       if (!dispatch$1) { dispatch$1 = dispatch('change'); }
40230       var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
40231       var minZoom = 12;
40232       var touchLayer = select(null);
40233       var drawLayer = select(null);
40234       var _notesVisible = false;
40235
40236
40237       function markerPath(selection, klass) {
40238           selection
40239               .attr('class', klass)
40240               .attr('transform', 'translate(-8, -22)')
40241               .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');
40242       }
40243
40244
40245       // Loosely-coupled osm service for fetching notes.
40246       function getService() {
40247           if (services.osm && !_osmService) {
40248               _osmService = services.osm;
40249               _osmService.on('loadedNotes', throttledRedraw);
40250           } else if (!services.osm && _osmService) {
40251               _osmService = null;
40252           }
40253
40254           return _osmService;
40255       }
40256
40257
40258       // Show the notes
40259       function editOn() {
40260           if (!_notesVisible) {
40261               _notesVisible = true;
40262               drawLayer
40263                   .style('display', 'block');
40264           }
40265       }
40266
40267
40268       // Immediately remove the notes and their touch targets
40269       function editOff() {
40270           if (_notesVisible) {
40271               _notesVisible = false;
40272               drawLayer
40273                   .style('display', 'none');
40274               drawLayer.selectAll('.note')
40275                   .remove();
40276               touchLayer.selectAll('.note')
40277                   .remove();
40278           }
40279       }
40280
40281
40282       // Enable the layer.  This shows the notes and transitions them to visible.
40283       function layerOn() {
40284           editOn();
40285
40286           drawLayer
40287               .style('opacity', 0)
40288               .transition()
40289               .duration(250)
40290               .style('opacity', 1)
40291               .on('end interrupt', function () {
40292                   dispatch$1.call('change');
40293               });
40294       }
40295
40296
40297       // Disable the layer.  This transitions the layer invisible and then hides the notes.
40298       function layerOff() {
40299           throttledRedraw.cancel();
40300           drawLayer.interrupt();
40301           touchLayer.selectAll('.note')
40302               .remove();
40303
40304           drawLayer
40305               .transition()
40306               .duration(250)
40307               .style('opacity', 0)
40308               .on('end interrupt', function () {
40309                   editOff();
40310                   dispatch$1.call('change');
40311               });
40312       }
40313
40314
40315       // Update the note markers
40316       function updateMarkers() {
40317           if (!_notesVisible || !_notesEnabled) return;
40318
40319           var service = getService();
40320           var selectedID = context.selectedNoteID();
40321           var data = (service ? service.notes(projection) : []);
40322           var getTransform = svgPointTransform(projection);
40323
40324           // Draw markers..
40325           var notes = drawLayer.selectAll('.note')
40326               .data(data, function(d) { return d.status + d.id; });
40327
40328           // exit
40329           notes.exit()
40330               .remove();
40331
40332           // enter
40333           var notesEnter = notes.enter()
40334               .append('g')
40335               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
40336               .classed('new', function(d) { return d.id < 0; });
40337
40338           notesEnter
40339               .append('ellipse')
40340               .attr('cx', 0.5)
40341               .attr('cy', 1)
40342               .attr('rx', 6.5)
40343               .attr('ry', 3)
40344               .attr('class', 'stroke');
40345
40346           notesEnter
40347               .append('path')
40348               .call(markerPath, 'shadow');
40349
40350           notesEnter
40351               .append('use')
40352               .attr('class', 'note-fill')
40353               .attr('width', '20px')
40354               .attr('height', '20px')
40355               .attr('x', '-8px')
40356               .attr('y', '-22px')
40357               .attr('xlink:href', '#iD-icon-note');
40358
40359           notesEnter.selectAll('.icon-annotation')
40360               .data(function(d) { return [d]; })
40361               .enter()
40362               .append('use')
40363               .attr('class', 'icon-annotation')
40364               .attr('width', '10px')
40365               .attr('height', '10px')
40366               .attr('x', '-3px')
40367               .attr('y', '-19px')
40368               .attr('xlink:href', function(d) {
40369                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
40370               });
40371
40372           // update
40373           notes
40374               .merge(notesEnter)
40375               .sort(sortY)
40376               .classed('selected', function(d) {
40377                   var mode = context.mode();
40378                   var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
40379                   return !isMoving && d.id === selectedID;
40380               })
40381               .attr('transform', getTransform);
40382
40383
40384           // Draw targets..
40385           if (touchLayer.empty()) return;
40386           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40387
40388           var targets = touchLayer.selectAll('.note')
40389               .data(data, function(d) { return d.id; });
40390
40391           // exit
40392           targets.exit()
40393               .remove();
40394
40395           // enter/update
40396           targets.enter()
40397               .append('rect')
40398               .attr('width', '20px')
40399               .attr('height', '20px')
40400               .attr('x', '-8px')
40401               .attr('y', '-22px')
40402               .merge(targets)
40403               .sort(sortY)
40404               .attr('class', function(d) {
40405                   var newClass = (d.id < 0 ? 'new' : '');
40406                   return 'note target note-' + d.id + ' ' + fillClass + newClass;
40407               })
40408               .attr('transform', getTransform);
40409
40410
40411           function sortY(a, b) {
40412               return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
40413           }
40414       }
40415
40416
40417       // Draw the notes layer and schedule loading notes and updating markers.
40418       function drawNotes(selection) {
40419           var service = getService();
40420
40421           var surface = context.surface();
40422           if (surface && !surface.empty()) {
40423               touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
40424           }
40425
40426           drawLayer = selection.selectAll('.layer-notes')
40427               .data(service ? [0] : []);
40428
40429           drawLayer.exit()
40430               .remove();
40431
40432           drawLayer = drawLayer.enter()
40433               .append('g')
40434               .attr('class', 'layer-notes')
40435               .style('display', _notesEnabled ? 'block' : 'none')
40436               .merge(drawLayer);
40437
40438           if (_notesEnabled) {
40439               if (service && ~~context.map().zoom() >= minZoom) {
40440                   editOn();
40441                   service.loadNotes(projection);
40442                   updateMarkers();
40443               } else {
40444                   editOff();
40445               }
40446           }
40447       }
40448
40449
40450       // Toggles the layer on and off
40451       drawNotes.enabled = function(val) {
40452           if (!arguments.length) return _notesEnabled;
40453
40454           _notesEnabled = val;
40455           if (_notesEnabled) {
40456               layerOn();
40457           } else {
40458               layerOff();
40459               if (context.selectedNoteID()) {
40460                   context.enter(modeBrowse(context));
40461               }
40462           }
40463
40464           dispatch$1.call('change');
40465           return this;
40466       };
40467
40468
40469       return drawNotes;
40470   }
40471
40472   function svgTouch() {
40473
40474       function drawTouch(selection) {
40475           selection.selectAll('.layer-touch')
40476               .data(['areas', 'lines', 'points', 'turns', 'markers'])
40477               .enter()
40478               .append('g')
40479               .attr('class', function(d) { return 'layer-touch ' + d; });
40480       }
40481
40482       return drawTouch;
40483   }
40484
40485   function svgLayers(projection, context) {
40486       var dispatch$1 = dispatch('change');
40487       var svg = select(null);
40488       var layers = [
40489           { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
40490           { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
40491           { id: 'data', layer: svgData(projection, context, dispatch$1) },
40492           { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
40493           { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
40494           { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
40495           { id: 'mapillary-images', layer: svgMapillaryImages(projection, context, dispatch$1) },
40496           { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
40497           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
40498           { id: 'debug', layer: svgDebug(projection, context, dispatch$1) },
40499           { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch$1) },
40500           { id: 'touch', layer: svgTouch(projection, context, dispatch$1) }
40501       ];
40502
40503
40504       function drawLayers(selection) {
40505           svg = selection.selectAll('.surface')
40506               .data([0]);
40507
40508           svg = svg.enter()
40509               .append('svg')
40510               .attr('class', 'surface')
40511               .merge(svg);
40512
40513           var defs = svg.selectAll('.surface-defs')
40514               .data([0]);
40515
40516           defs.enter()
40517               .append('defs')
40518               .attr('class', 'surface-defs');
40519
40520           var groups = svg.selectAll('.data-layer')
40521               .data(layers);
40522
40523           groups.exit()
40524               .remove();
40525
40526           groups.enter()
40527               .append('g')
40528               .attr('class', function(d) { return 'data-layer ' + d.id; })
40529               .merge(groups)
40530               .each(function(d) { select(this).call(d.layer); });
40531       }
40532
40533
40534       drawLayers.all = function() {
40535           return layers;
40536       };
40537
40538
40539       drawLayers.layer = function(id) {
40540           var obj = find$1(layers, function(o) {return o.id === id;});
40541           return obj && obj.layer;
40542       };
40543
40544
40545       drawLayers.only = function(what) {
40546           var arr = [].concat(what);
40547           drawLayers.remove(difference(map$3(layers, 'id'), arr));
40548           return this;
40549       };
40550
40551
40552       drawLayers.remove = function(what) {
40553           var arr = [].concat(what);
40554           arr.forEach(function(id) {
40555               layers = reject(layers, function(o) {return o.id === id;});
40556           });
40557           dispatch$1.call('change');
40558           return this;
40559       };
40560
40561
40562       drawLayers.add = function(what) {
40563           var arr = [].concat(what);
40564           arr.forEach(function(obj) {
40565               if ('id' in obj && 'layer' in obj) {
40566                   layers.push(obj);
40567               }
40568           });
40569           dispatch$1.call('change');
40570           return this;
40571       };
40572
40573
40574       drawLayers.dimensions = function(_) {
40575           if (!arguments.length) return utilGetDimensions(svg);
40576           utilSetDimensions(svg, _);
40577           return this;
40578       };
40579
40580
40581       return utilRebind(drawLayers, dispatch$1, 'on');
40582   }
40583
40584   function svgLines(projection, context) {
40585       var detected = utilDetect();
40586
40587       var highway_stack = {
40588           motorway: 0,
40589           motorway_link: 1,
40590           trunk: 2,
40591           trunk_link: 3,
40592           primary: 4,
40593           primary_link: 5,
40594           secondary: 6,
40595           tertiary: 7,
40596           unclassified: 8,
40597           residential: 9,
40598           service: 10,
40599           footway: 11
40600       };
40601
40602
40603       function drawTargets(selection, graph, entities, filter) {
40604           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40605           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
40606           var getPath = svgPath(projection).geojson;
40607           var activeID = context.activeID();
40608
40609           // The targets and nopes will be MultiLineString sub-segments of the ways
40610           var data = { targets: [], nopes: [] };
40611
40612           entities.forEach(function(way) {
40613               var features = svgSegmentWay(way, graph, activeID);
40614               data.targets.push.apply(data.targets, features.passive);
40615               data.nopes.push.apply(data.nopes, features.active);
40616           });
40617
40618
40619           // Targets allow hover and vertex snapping
40620           var targetData = data.targets.filter(getPath);
40621           var targets = selection.selectAll('.line.target-allowed')
40622               .filter(function(d) { return filter(d.properties.entity); })
40623               .data(targetData, function key(d) { return d.id; });
40624
40625           // exit
40626           targets.exit()
40627               .remove();
40628
40629           // enter/update
40630           targets.enter()
40631               .append('path')
40632               .merge(targets)
40633               .attr('d', getPath)
40634               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
40635
40636
40637           // NOPE
40638           var nopeData = data.nopes.filter(getPath);
40639           var nopes = selection.selectAll('.line.target-nope')
40640               .filter(function(d) { return filter(d.properties.entity); })
40641               .data(nopeData, function key(d) { return d.id; });
40642
40643           // exit
40644           nopes.exit()
40645               .remove();
40646
40647           // enter/update
40648           nopes.enter()
40649               .append('path')
40650               .merge(nopes)
40651               .attr('d', getPath)
40652               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
40653       }
40654
40655
40656       function drawLines(selection, graph, entities, filter$1) {
40657
40658           function waystack(a, b) {
40659               var selected = context.selectedIDs();
40660               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
40661               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
40662
40663               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
40664               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
40665               return scoreA - scoreB;
40666           }
40667
40668
40669           function drawLineGroup(selection, klass, isSelected) {
40670               // Note: Don't add `.selected` class in draw modes
40671               var mode = context.mode();
40672               var isDrawing = mode && /^draw/.test(mode.id);
40673               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
40674
40675               var lines = selection
40676                   .selectAll('path')
40677                   .filter(filter$1)
40678                   .data(getPathData(isSelected), osmEntity.key);
40679
40680               lines.exit()
40681                   .remove();
40682
40683               // Optimization: Call expensive TagClasses only on enter selection. This
40684               // works because osmEntity.key is defined to include the entity v attribute.
40685               lines.enter()
40686                   .append('path')
40687                   .attr('class', function(d) {
40688                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
40689                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
40690                   })
40691                   .call(svgTagClasses())
40692                   .merge(lines)
40693                   .sort(waystack)
40694                   .attr('d', getPath)
40695                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
40696
40697               return selection;
40698           }
40699
40700
40701           function getPathData(isSelected) {
40702               return function() {
40703                   var layer = this.parentNode.__data__;
40704                   var data = pathdata[layer] || [];
40705                   return data.filter(function(d) {
40706                       if (isSelected)
40707                           return context.selectedIDs().indexOf(d.id) !== -1;
40708                       else
40709                           return context.selectedIDs().indexOf(d.id) === -1;
40710                   });
40711               };
40712           }
40713
40714           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
40715               var markergroup = layergroup
40716                   .selectAll('g.' + groupclass)
40717                   .data([pathclass]);
40718
40719               markergroup = markergroup.enter()
40720                   .append('g')
40721                   .attr('class', groupclass)
40722                   .merge(markergroup);
40723
40724               var markers = markergroup
40725                   .selectAll('path')
40726                   .filter(filter$1)
40727                   .data(
40728                       function data() { return groupdata[this.parentNode.__data__] || []; },
40729                       function key(d) { return [d.id, d.index]; }
40730                   );
40731
40732               markers.exit()
40733                   .remove();
40734
40735               markers = markers.enter()
40736                   .append('path')
40737                   .attr('class', pathclass)
40738                   .attr('marker-mid', marker)
40739                   .merge(markers)
40740                   .attr('d', function(d) { return d.d; });
40741
40742               if (detected.ie) {
40743                   markers.each(function() { this.parentNode.insertBefore(this, this); });
40744               }
40745           }
40746
40747
40748           var getPath = svgPath(projection, graph);
40749           var ways = [];
40750           var pathdata = {};
40751           var onewaydata = {};
40752           var sideddata = {};
40753           var oldMultiPolygonOuters = {};
40754
40755           for (var i = 0; i < entities.length; i++) {
40756               var entity = entities[i];
40757               var outer = osmOldMultipolygonOuterMember(entity, graph);
40758               if (outer) {
40759                   ways.push(entity.mergeTags(outer.tags));
40760                   oldMultiPolygonOuters[outer.id] = true;
40761               } else if (entity.geometry(graph) === 'line') {
40762                   ways.push(entity);
40763               }
40764           }
40765
40766           ways = ways.filter(getPath);
40767           pathdata = groupBy(ways, function(way) { return way.layer(); });
40768
40769           forOwn(pathdata, function(v, k) {
40770               var onewayArr = filter(v, function(d) { return d.isOneWay(); });
40771               var onewaySegments = svgMarkerSegments(
40772                   projection, graph, 35,
40773                   function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
40774                   function bothDirections(entity) {
40775                       return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
40776                   }
40777               );
40778               onewaydata[k] = flatten(map$3(onewayArr, onewaySegments));
40779
40780               var sidedArr = filter(v, function(d) { return d.isSided(); });
40781               var sidedSegments = svgMarkerSegments(
40782                   projection, graph, 30,
40783                   function shouldReverse() { return false; },
40784                   function bothDirections() { return false; }
40785               );
40786               sideddata[k] = flatten(map$3(sidedArr, sidedSegments));
40787           });
40788
40789
40790           var covered = selection.selectAll('.layer-osm.covered');     // under areas
40791           var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
40792           var touchLayer = selection.selectAll('.layer-touch.lines');
40793
40794           // Draw lines..
40795           [covered, uncovered].forEach(function(selection) {
40796               var range$1 = (selection === covered ? range(-10,0) : range(0,11));
40797               var layergroup = selection
40798                   .selectAll('g.layergroup')
40799                   .data(range$1);
40800
40801               layergroup = layergroup.enter()
40802                   .append('g')
40803                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
40804                   .merge(layergroup);
40805
40806               layergroup
40807                   .selectAll('g.linegroup')
40808                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
40809                   .enter()
40810                   .append('g')
40811                   .attr('class', function(d) { return 'linegroup line-' + d; });
40812
40813               layergroup.selectAll('g.line-shadow')
40814                   .call(drawLineGroup, 'shadow', false);
40815               layergroup.selectAll('g.line-casing')
40816                   .call(drawLineGroup, 'casing', false);
40817               layergroup.selectAll('g.line-stroke')
40818                   .call(drawLineGroup, 'stroke', false);
40819
40820               layergroup.selectAll('g.line-shadow-highlighted')
40821                   .call(drawLineGroup, 'shadow', true);
40822               layergroup.selectAll('g.line-casing-highlighted')
40823                   .call(drawLineGroup, 'casing', true);
40824               layergroup.selectAll('g.line-stroke-highlighted')
40825                   .call(drawLineGroup, 'stroke', true);
40826
40827               addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
40828               addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
40829                   function marker(d) {
40830                       var category = graph.entity(d.id).sidednessIdentifier();
40831                       return 'url(#sided-marker-' + category + ')';
40832                   }
40833               );
40834           });
40835
40836           // Draw touch targets..
40837           touchLayer
40838               .call(drawTargets, graph, ways, filter$1);
40839       }
40840
40841
40842       return drawLines;
40843   }
40844
40845   function svgMidpoints(projection, context) {
40846       var targetRadius = 8;
40847
40848       function drawTargets(selection, graph, entities, filter) {
40849           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
40850           var getTransform = svgPointTransform(projection).geojson;
40851
40852           var data = entities.map(function(midpoint) {
40853               return {
40854                   type: 'Feature',
40855                   id: midpoint.id,
40856                   properties: {
40857                       target: true,
40858                       entity: midpoint
40859                   },
40860                   geometry: {
40861                       type: 'Point',
40862                       coordinates: midpoint.loc
40863                   }
40864               };
40865           });
40866
40867           var targets = selection.selectAll('.midpoint.target')
40868               .filter(function(d) { return filter(d.properties.entity); })
40869               .data(data, function key(d) { return d.id; });
40870
40871           // exit
40872           targets.exit()
40873               .remove();
40874
40875           // enter/update
40876           targets.enter()
40877               .append('circle')
40878               .attr('r', targetRadius)
40879               .merge(targets)
40880               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
40881               .attr('transform', getTransform);
40882       }
40883
40884
40885       function drawMidpoints(selection, graph, entities, filter, extent) {
40886           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
40887           var touchLayer = selection.selectAll('.layer-touch.points');
40888
40889           var mode = context.mode();
40890           if (mode && mode.id !== 'select') {
40891               drawLayer.selectAll('.midpoint').remove();
40892               touchLayer.selectAll('.midpoint.target').remove();
40893               return;
40894           }
40895
40896           var poly = extent.polygon();
40897           var midpoints = {};
40898
40899           for (var i = 0; i < entities.length; i++) {
40900               var entity = entities[i];
40901
40902               if (entity.type !== 'way') continue;
40903               if (!filter(entity)) continue;
40904               if (context.selectedIDs().indexOf(entity.id) < 0) continue;
40905
40906               var nodes = graph.childNodes(entity);
40907               for (var j = 0; j < nodes.length - 1; j++) {
40908                   var a = nodes[j];
40909                   var b = nodes[j + 1];
40910                   var id = [a.id, b.id].sort().join('-');
40911
40912                   if (midpoints[id]) {
40913                       midpoints[id].parents.push(entity);
40914                   } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
40915                       var point = geoVecInterp(a.loc, b.loc, 0.5);
40916                       var loc = null;
40917
40918                       if (extent.intersects(point)) {
40919                           loc = point;
40920                       } else {
40921                           for (var k = 0; k < 4; k++) {
40922                               point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
40923                               if (point &&
40924                                   geoVecLength(projection(a.loc), projection(point)) > 20 &&
40925                                   geoVecLength(projection(b.loc), projection(point)) > 20)
40926                               {
40927                                   loc = point;
40928                                   break;
40929                               }
40930                           }
40931                       }
40932
40933                       if (loc) {
40934                           midpoints[id] = {
40935                               type: 'midpoint',
40936                               id: id,
40937                               loc: loc,
40938                               edge: [a.id, b.id],
40939                               parents: [entity]
40940                           };
40941                       }
40942                   }
40943               }
40944           }
40945
40946
40947           function midpointFilter(d) {
40948               if (midpoints[d.id])
40949                   return true;
40950
40951               for (var i = 0; i < d.parents.length; i++) {
40952                   if (filter(d.parents[i])) {
40953                       return true;
40954                   }
40955               }
40956
40957               return false;
40958           }
40959
40960
40961           var groups = drawLayer.selectAll('.midpoint')
40962               .filter(midpointFilter)
40963               .data(values$1(midpoints), function(d) { return d.id; });
40964
40965           groups.exit()
40966               .remove();
40967
40968           var enter = groups.enter()
40969               .insert('g', ':first-child')
40970               .attr('class', 'midpoint');
40971
40972           enter
40973               .append('polygon')
40974               .attr('points', '-6,8 10,0 -6,-8')
40975               .attr('class', 'shadow');
40976
40977           enter
40978               .append('polygon')
40979               .attr('points', '-3,4 5,0 -3,-4')
40980               .attr('class', 'fill');
40981
40982           groups = groups
40983               .merge(enter)
40984               .attr('transform', function(d) {
40985                   var translate = svgPointTransform(projection);
40986                   var a = graph.entity(d.edge[0]);
40987                   var b = graph.entity(d.edge[1]);
40988                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
40989                   return translate(d) + ' rotate(' + angle + ')';
40990               })
40991               .call(svgTagClasses().tags(
40992                   function(d) { return d.parents[0].tags; }
40993               ));
40994
40995           // Propagate data bindings.
40996           groups.select('polygon.shadow');
40997           groups.select('polygon.fill');
40998
40999
41000           // Draw touch targets..
41001           touchLayer
41002               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
41003       }
41004
41005       return drawMidpoints;
41006   }
41007
41008   function svgPoints(projection, context) {
41009
41010       function markerPath(selection, klass) {
41011           selection
41012               .attr('class', klass)
41013               .attr('transform', 'translate(-8, -23)')
41014               .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');
41015       }
41016
41017       function sortY(a, b) {
41018           return b.loc[1] - a.loc[1];
41019       }
41020
41021
41022       // Avoid exit/enter if we're just moving stuff around.
41023       // The node will get a new version but we only need to run the update selection.
41024       function fastEntityKey(d) {
41025           var mode = context.mode();
41026           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41027           return isMoving ? d.id : osmEntity.key(d);
41028       }
41029
41030
41031       function drawTargets(selection, graph, entities, filter) {
41032           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41033           var getTransform = svgPointTransform(projection).geojson;
41034           var activeID = context.activeID();
41035           var data = [];
41036
41037           entities.forEach(function(node) {
41038               if (activeID === node.id) return;   // draw no target on the activeID
41039
41040               data.push({
41041                   type: 'Feature',
41042                   id: node.id,
41043                   properties: {
41044                       target: true,
41045                       entity: node
41046                   },
41047                   geometry: node.asGeoJSON()
41048               });
41049           });
41050
41051           var targets = selection.selectAll('.point.target')
41052               .filter(function(d) { return filter(d.properties.entity); })
41053               .data(data, function key(d) { return d.id; });
41054
41055           // exit
41056           targets.exit()
41057               .remove();
41058
41059           // enter/update
41060           targets.enter()
41061               .append('rect')
41062               .attr('x', -10)
41063               .attr('y', -26)
41064               .attr('width', 20)
41065               .attr('height', 30)
41066               .merge(targets)
41067               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
41068               .attr('transform', getTransform);
41069       }
41070
41071
41072       function drawPoints(selection, graph, entities, filter) {
41073           var wireframe = context.surface().classed('fill-wireframe');
41074           var zoom = geoScaleToZoom(projection.scale());
41075
41076           // Points with a direction will render as vertices at higher zooms..
41077           function renderAsPoint(entity) {
41078               return entity.geometry(graph) === 'point' &&
41079                   !(zoom >= 18 && entity.directions(graph, projection).length);
41080           }
41081
41082           // All points will render as vertices in wireframe mode too..
41083           var points = wireframe ? [] : entities.filter(renderAsPoint);
41084           points.sort(sortY);
41085
41086
41087           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
41088           var touchLayer = selection.selectAll('.layer-touch.points');
41089
41090           // Draw points..
41091           var groups = drawLayer.selectAll('g.point')
41092               .filter(filter)
41093               .data(points, fastEntityKey);
41094
41095           groups.exit()
41096               .remove();
41097
41098           var enter = groups.enter()
41099               .append('g')
41100               .attr('class', function(d) { return 'node point ' + d.id; })
41101               .order();
41102
41103           enter
41104               .append('path')
41105               .call(markerPath, 'shadow');
41106
41107           enter
41108               .append('ellipse')
41109               .attr('cx', 0.5)
41110               .attr('cy', 1)
41111               .attr('rx', 6.5)
41112               .attr('ry', 3)
41113               .attr('class', 'stroke');
41114
41115           enter
41116               .append('path')
41117               .call(markerPath, 'stroke');
41118
41119           enter
41120               .append('use')
41121               .attr('transform', 'translate(-5, -19)')
41122               .attr('class', 'icon')
41123               .attr('width', '11px')
41124               .attr('height', '11px');
41125
41126           groups = groups
41127               .merge(enter)
41128               .attr('transform', svgPointTransform(projection))
41129               .call(svgTagClasses());
41130
41131           // Selecting the following implicitly
41132           // sets the data (point entity) on the element
41133           groups.select('.shadow');
41134           groups.select('.stroke');
41135           groups.select('.icon')
41136               .attr('xlink:href', function(entity) {
41137                   var preset = context.presets().match(entity, graph);
41138                   var picon = preset && preset.icon;
41139
41140                   if (!picon) {
41141                       return '';
41142                   } else {
41143                       var isMaki = /^maki-/.test(picon);
41144                       return '#' + picon + (isMaki ? '-11' : '');
41145                   }
41146               });
41147
41148
41149           // Draw touch targets..
41150           touchLayer
41151               .call(drawTargets, graph, points, filter);
41152       }
41153
41154
41155       return drawPoints;
41156   }
41157
41158   function svgTagClasses() {
41159       var primaries = [
41160           'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
41161           'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
41162           'leisure', 'military', 'place', 'man_made', 'route', 'attraction'
41163       ];
41164       var statuses = [
41165           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
41166           'razed', 'demolished', 'obliterated', 'intermittent'
41167       ];
41168       var secondaries = [
41169           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
41170           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
41171           'public_transport', 'location', 'parking', 'golf', 'type'
41172       ];
41173       var _tags = function(entity) { return entity.tags; };
41174
41175
41176       var tagClasses = function(selection) {
41177           selection.each(function tagClassesEach(entity) {
41178               var value = this.className;
41179
41180               if (value.baseVal !== undefined) {
41181                   value = value.baseVal;
41182               }
41183
41184               var t = _tags(entity);
41185
41186               var computed = tagClasses.getClassesString(t, value, entity);
41187
41188               if (computed !== value) {
41189                   select(this).attr('class', computed);
41190               }
41191           });
41192       };
41193
41194
41195       tagClasses.getClassesString = function(t, value, entity) {
41196           var primary, status;
41197           var i, k, v;
41198
41199           // in some situations we want to render perimeter strokes a certain way
41200           var overrideGeometry;
41201           if (/\bstroke\b/.test(value)) {
41202               if (!!t.barrier && t.barrier !== 'no') {
41203                   overrideGeometry = 'line';
41204               } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
41205                   overrideGeometry = 'area';
41206               }
41207           }
41208
41209           // preserve base classes (nothing with `tag-`)
41210           var classes = value.trim().split(/\s+/)
41211               .filter(function(klass) {
41212                   return klass.length && !/^tag-/.test(klass);
41213               })
41214               .map(function(klass) {  // special overrides for some perimeter strokes
41215                   return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
41216               });
41217
41218           // pick at most one primary classification tag..
41219           for (i = 0; i < primaries.length; i++) {
41220               k = primaries[i];
41221               v = t[k];
41222               if (!v || v === 'no') continue;
41223
41224               if (k === 'piste:type') {  // avoid a ':' in the class name
41225                   k = 'piste';
41226               }
41227
41228               primary = k;
41229               if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
41230                   status = v;
41231                   classes.push('tag-' + k);
41232               } else {
41233                   classes.push('tag-' + k);
41234                   classes.push('tag-' + k + '-' + v);
41235               }
41236
41237               break;
41238           }
41239
41240           // add at most one status tag, only if relates to primary tag..
41241           if (!status) {
41242               for (i = 0; i < statuses.length; i++) {
41243                   k = statuses[i];
41244                   v = t[k];
41245                   if (!v || v === 'no') continue;
41246
41247                   if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
41248                       status = k;
41249                   }
41250                   else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
41251                       status = k;
41252                   } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
41253                       status = k;
41254                       primary = v;
41255                       classes.push('tag-' + v);
41256                   }  // else ignore e.g.  `highway=path + abandoned=railway`
41257
41258                   if (status) break;
41259               }
41260           }
41261
41262           if (status) {
41263               classes.push('tag-status');
41264               classes.push('tag-status-' + status);
41265           }
41266
41267           // add any secondary tags
41268           for (i = 0; i < secondaries.length; i++) {
41269               k = secondaries[i];
41270               v = t[k];
41271               if (!v || v === 'no') continue;
41272               classes.push('tag-' + k);
41273               classes.push('tag-' + k + '-' + v);
41274           }
41275
41276           // For highways, look for surface tagging..
41277           if (primary === 'highway' || primary === 'aeroway') {
41278               var paved = (t.highway !== 'track');
41279               for (k in t) {
41280                   v = t[k];
41281                   if (k in osmPavedTags) {
41282                       paved = !!osmPavedTags[k][v];
41283                       break;
41284                   }
41285               }
41286               if (!paved) {
41287                   classes.push('tag-unpaved');
41288               }
41289           }
41290
41291           return classes.join(' ').trim();
41292       };
41293
41294
41295       tagClasses.tags = function(val) {
41296           if (!arguments.length) return _tags;
41297           _tags = val;
41298           return tagClasses;
41299       };
41300
41301       return tagClasses;
41302   }
41303
41304   function svgTurns(projection, context) {
41305
41306       function icon(turn) {
41307           var u = turn.u ? '-u' : '';
41308           if (turn.no) return '#iD-turn-no' + u;
41309           if (turn.only) return '#iD-turn-only' + u;
41310           return '#iD-turn-yes' + u;
41311       }
41312
41313       function drawTurns(selection, graph, turns) {
41314
41315           function turnTransform(d) {
41316               var pxRadius = 50;
41317               var toWay = graph.entity(d.to.way);
41318               var toPoints = graph.childNodes(toWay)
41319                   .map(function (n) { return n.loc; })
41320                   .map(projection);
41321               var toLength = geoPathLength(toPoints);
41322               var mid = toLength / 2;    // midpoint of destination way
41323
41324               var toNode = graph.entity(d.to.node);
41325               var toVertex = graph.entity(d.to.vertex);
41326               var a = geoAngle(toVertex, toNode, projection);
41327               var o = projection(toVertex.loc);
41328               var r = d.u ? 0                  // u-turn: no radius
41329                   : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
41330                   : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
41331
41332               return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
41333                   'rotate(' + a * 180 / Math.PI + ')';
41334           }
41335
41336
41337           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
41338           var touchLayer = selection.selectAll('.layer-touch.turns');
41339
41340           // Draw turns..
41341           var groups = drawLayer.selectAll('g.turn')
41342               .data(turns, function(d) { return d.key; });
41343
41344           // exit
41345           groups.exit()
41346               .remove();
41347
41348           // enter
41349           var groupsEnter = groups.enter()
41350               .append('g')
41351               .attr('class', function(d) { return 'turn ' + d.key; });
41352
41353           var turnsEnter = groupsEnter
41354               .filter(function(d) { return !d.u; });
41355
41356           turnsEnter.append('rect')
41357               .attr('transform', 'translate(-22, -12)')
41358               .attr('width', '44')
41359               .attr('height', '24');
41360
41361           turnsEnter.append('use')
41362               .attr('transform', 'translate(-22, -12)')
41363               .attr('width', '44')
41364               .attr('height', '24');
41365
41366           var uEnter = groupsEnter
41367               .filter(function(d) { return d.u; });
41368
41369           uEnter.append('circle')
41370               .attr('r', '16');
41371
41372           uEnter.append('use')
41373               .attr('transform', 'translate(-16, -16)')
41374               .attr('width', '32')
41375               .attr('height', '32');
41376
41377           // update
41378           groups = groups
41379               .merge(groupsEnter)
41380               .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
41381               .attr('transform', turnTransform);
41382
41383           groups.select('use')
41384               .attr('xlink:href', icon);
41385
41386           groups.select('rect');      // propagate bound data
41387           groups.select('circle');    // propagate bound data
41388
41389
41390           // Draw touch targets..
41391           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41392           groups = touchLayer.selectAll('g.turn')
41393               .data(turns, function(d) { return d.key; });
41394
41395           // exit
41396           groups.exit()
41397               .remove();
41398
41399           // enter
41400           groupsEnter = groups.enter()
41401               .append('g')
41402               .attr('class', function(d) { return 'turn ' + d.key; });
41403
41404           turnsEnter = groupsEnter
41405               .filter(function(d) { return !d.u; });
41406
41407           turnsEnter.append('rect')
41408               .attr('class', 'target ' + fillClass)
41409               .attr('transform', 'translate(-22, -12)')
41410               .attr('width', '44')
41411               .attr('height', '24');
41412
41413           uEnter = groupsEnter
41414               .filter(function(d) { return d.u; });
41415
41416           uEnter.append('circle')
41417               .attr('class', 'target ' + fillClass)
41418               .attr('r', '16');
41419
41420           // update
41421           groups = groups
41422               .merge(groupsEnter)
41423               .attr('transform', turnTransform);
41424
41425           groups.select('rect');      // propagate bound data
41426           groups.select('circle');    // propagate bound data
41427
41428
41429           return this;
41430       }
41431
41432       return drawTurns;
41433   }
41434
41435   function svgVertices(projection, context) {
41436       var radiuses = {
41437           //       z16-, z17,   z18+,  w/icon
41438           shadow: [6,    7.5,   7.5,   12],
41439           stroke: [2.5,  3.5,   3.5,   8],
41440           fill:   [1,    1.5,   1.5,   1.5]
41441       };
41442
41443       var _currHoverTarget;
41444       var _currPersistent = {};
41445       var _currHover = {};
41446       var _prevHover = {};
41447       var _currSelected = {};
41448       var _prevSelected = {};
41449       var _radii = {};
41450
41451
41452       function sortY(a, b) {
41453           return b.loc[1] - a.loc[1];
41454       }
41455
41456       // Avoid exit/enter if we're just moving stuff around.
41457       // The node will get a new version but we only need to run the update selection.
41458       function fastEntityKey(d) {
41459           var mode = context.mode();
41460           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41461           return isMoving ? d.id : osmEntity.key(d);
41462       }
41463
41464
41465       function draw(selection, graph, vertices, sets, filter) {
41466           sets = sets || { selected: {}, important: {}, hovered: {} };
41467
41468           var icons = {};
41469           var directions = {};
41470           var wireframe = context.surface().classed('fill-wireframe');
41471           var zoom = geoScaleToZoom(projection.scale());
41472           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
41473           var activeID = context.activeID();
41474
41475
41476           function getIcon(d) {
41477               // always check latest entity, as fastEntityKey avoids enter/exit now
41478               var entity = graph.entity(d.id);
41479               if (entity.id in icons) return icons[entity.id];
41480
41481               icons[entity.id] =
41482                   entity.hasInterestingTags() &&
41483                   context.presets().match(entity, graph).icon;
41484
41485               return icons[entity.id];
41486           }
41487
41488
41489           // memoize directions results, return false for empty arrays (for use in filter)
41490           function getDirections(entity) {
41491               if (entity.id in directions) return directions[entity.id];
41492
41493               var angles = entity.directions(graph, projection);
41494               directions[entity.id] = angles.length ? angles : false;
41495               return angles;
41496           }
41497
41498
41499           function updateAttributes(selection) {
41500               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
41501                   var rads = radiuses[klass];
41502                   selection.selectAll('.' + klass)
41503                       .each(function(entity) {
41504                           var i = z && getIcon(entity);
41505                           var r = rads[i ? 3 : z];
41506
41507                           // slightly increase the size of unconnected endpoints #3775
41508                           if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
41509                               r += 1.5;
41510                           }
41511
41512                           if (klass === 'shadow') {   // remember this value, so we don't need to
41513                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
41514                           }
41515
41516                           select(this)
41517                               .attr('r', r)
41518                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
41519                       });
41520               });
41521           }
41522
41523           vertices.sort(sortY);
41524
41525           var groups = selection.selectAll('g.vertex')
41526               .filter(filter)
41527               .data(vertices, fastEntityKey);
41528
41529           // exit
41530           groups.exit()
41531               .remove();
41532
41533           // enter
41534           var enter = groups.enter()
41535               .append('g')
41536               .attr('class', function(d) { return 'node vertex ' + d.id; })
41537               .order();
41538
41539           enter
41540               .append('circle')
41541               .attr('class', 'shadow');
41542
41543           enter
41544               .append('circle')
41545               .attr('class', 'stroke');
41546
41547           // Vertices with tags get a fill.
41548           enter.filter(function(d) { return d.hasInterestingTags(); })
41549               .append('circle')
41550               .attr('class', 'fill');
41551
41552           // update
41553           groups = groups
41554               .merge(enter)
41555               .attr('transform', svgPointTransform(projection))
41556               .classed('sibling', function(d) { return d.id in sets.selected; })
41557               .classed('shared', function(d) { return graph.isShared(d); })
41558               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
41559               .call(updateAttributes);
41560
41561
41562           // Vertices with icons get a `use`.
41563           var iconUse = groups
41564               .selectAll('.icon')
41565               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
41566
41567           // exit
41568           iconUse.exit()
41569               .remove();
41570
41571           // enter
41572           iconUse.enter()
41573               .append('use')
41574               .attr('class', 'icon')
41575               .attr('width', '11px')
41576               .attr('height', '11px')
41577               .attr('transform', 'translate(-5.5, -5.5)')
41578               .attr('xlink:href', function(d) {
41579                   var picon = getIcon(d);
41580                   var isMaki = /^maki-/.test(picon);
41581                   return '#' + picon + (isMaki ? '-11' : '');
41582               });
41583
41584
41585           // Vertices with directions get viewfields
41586           var dgroups = groups
41587               .selectAll('.viewfieldgroup')
41588               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
41589
41590           // exit
41591           dgroups.exit()
41592               .remove();
41593
41594           // enter/update
41595           dgroups = dgroups.enter()
41596               .insert('g', '.shadow')
41597               .attr('class', 'viewfieldgroup')
41598               .merge(dgroups);
41599
41600           var viewfields = dgroups.selectAll('.viewfield')
41601               .data(getDirections, function key(d) { return osmEntity.key(d); });
41602
41603           // exit
41604           viewfields.exit()
41605               .remove();
41606
41607           // enter/update
41608           viewfields.enter()
41609               .append('path')
41610               .attr('class', 'viewfield')
41611               .attr('d', 'M0,0H0')
41612               .merge(viewfields)
41613               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
41614               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
41615       }
41616
41617
41618       function drawTargets(selection, graph, entities, filter) {
41619           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
41620           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
41621           var getTransform = svgPointTransform(projection).geojson;
41622           var activeID = context.activeID();
41623           var data = { targets: [], nopes: [] };
41624
41625           entities.forEach(function(node) {
41626               if (activeID === node.id) return;   // draw no target on the activeID
41627
41628               var vertexType = svgPassiveVertex(node, graph, activeID);
41629               if (vertexType !== 0) {     // passive or adjacent - allow to connect
41630                   data.targets.push({
41631                       type: 'Feature',
41632                       id: node.id,
41633                       properties: {
41634                           target: true,
41635                           entity: node
41636                       },
41637                       geometry: node.asGeoJSON()
41638                   });
41639               } else {
41640                   data.nopes.push({
41641                       type: 'Feature',
41642                       id: node.id + '-nope',
41643                       properties: {
41644                           nope: true,
41645                           target: true,
41646                           entity: node
41647                       },
41648                       geometry: node.asGeoJSON()
41649                   });
41650               }
41651           });
41652
41653
41654           // Targets allow hover and vertex snapping
41655           var targets = selection.selectAll('.vertex.target-allowed')
41656               .filter(function(d) { return filter(d.properties.entity); })
41657               .data(data.targets, function key(d) { return d.id; });
41658
41659           // exit
41660           targets.exit()
41661               .remove();
41662
41663           // enter/update
41664           targets.enter()
41665               .append('circle')
41666               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
41667               .merge(targets)
41668               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
41669               .attr('transform', getTransform);
41670
41671
41672           // NOPE
41673           var nopes = selection.selectAll('.vertex.target-nope')
41674               .filter(function(d) { return filter(d.properties.entity); })
41675               .data(data.nopes, function key(d) { return d.id; });
41676
41677           // exit
41678           nopes.exit()
41679               .remove();
41680
41681           // enter/update
41682           nopes.enter()
41683               .append('circle')
41684               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
41685               .merge(nopes)
41686               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
41687               .attr('transform', getTransform);
41688       }
41689
41690
41691       // Points can also render as vertices:
41692       // 1. in wireframe mode or
41693       // 2. at higher zooms if they have a direction
41694       function renderAsVertex(entity, graph, wireframe, zoom) {
41695           var geometry = entity.geometry(graph);
41696           return geometry === 'vertex' || (geometry === 'point' && (
41697               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
41698           ));
41699       }
41700
41701
41702       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
41703           var results = {};
41704
41705           function addChildVertices(entity) {
41706               var geometry = entity.geometry(graph);
41707               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
41708                   var i;
41709                   if (entity.type === 'way') {
41710                       for (i = 0; i < entity.nodes.length; i++) {
41711                           var child = graph.hasEntity(entity.nodes[i]);
41712                           if (child) {
41713                               addChildVertices(child);
41714                           }
41715                       }
41716                   } else if (entity.type === 'relation') {
41717                       for (i = 0; i < entity.members.length; i++) {
41718                           var member = graph.hasEntity(entity.members[i].id);
41719                           if (member) {
41720                               addChildVertices(member);
41721                           }
41722                       }
41723                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
41724                       results[entity.id] = entity;
41725                   }
41726               }
41727           }
41728
41729           ids.forEach(function(id) {
41730               var entity = graph.hasEntity(id);
41731               if (!entity) return;
41732
41733               if (entity.type === 'node') {
41734                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
41735                       results[entity.id] = entity;
41736                       graph.parentWays(entity).forEach(function(entity) {
41737                           addChildVertices(entity);
41738                       });
41739                   }
41740               } else {  // way, relation
41741                   addChildVertices(entity);
41742               }
41743           });
41744
41745           return results;
41746       }
41747
41748
41749       function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
41750           var wireframe = context.surface().classed('fill-wireframe');
41751           var zoom = geoScaleToZoom(projection.scale());
41752           var mode = context.mode();
41753           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
41754
41755           var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
41756           var touchLayer = selection.selectAll('.layer-touch.points');
41757
41758           if (fullRedraw) {
41759               _currPersistent = {};
41760               _radii = {};
41761           }
41762
41763           // Collect important vertices from the `entities` list..
41764           // (during a paritial redraw, it will not contain everything)
41765           for (var i = 0; i < entities.length; i++) {
41766               var entity = entities[i];
41767               var geometry = entity.geometry(graph);
41768               var keep = false;
41769
41770               // a point that looks like a vertex..
41771               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
41772                   _currPersistent[entity.id] = entity;
41773                   keep = true;
41774
41775               // a vertex of some importance..
41776               } else if (geometry === 'vertex' &&
41777                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
41778                   _currPersistent[entity.id] = entity;
41779                   keep = true;
41780               }
41781
41782               // whatever this is, it's not a persistent vertex..
41783               if (!keep && !fullRedraw) {
41784                   delete _currPersistent[entity.id];
41785               }
41786           }
41787
41788           // 3 sets of vertices to consider:
41789           var sets = {
41790               persistent: _currPersistent,  // persistent = important vertices (render always)
41791               selected: _currSelected,      // selected + siblings of selected (render always)
41792               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
41793           };
41794
41795           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
41796
41797           // Draw the vertices..
41798           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
41799           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
41800           var filterRendered = function(d) {
41801               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
41802           };
41803           drawLayer
41804               .call(draw, graph, currentVisible(all), sets, filterRendered);
41805
41806           // Draw touch targets..
41807           // When drawing, render all targets (not just those affected by a partial redraw)
41808           var filterTouch = function(d) {
41809               return isMoving ? true : filterRendered(d);
41810           };
41811           touchLayer
41812               .call(drawTargets, graph, currentVisible(all), filterTouch);
41813
41814
41815           function currentVisible(which) {
41816               return Object.keys(which)
41817                   .map(graph.hasEntity, graph)     // the current version of this entity
41818                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
41819           }
41820       }
41821
41822
41823       // partial redraw - only update the selected items..
41824       drawVertices.drawSelected = function(selection, graph, extent) {
41825           var wireframe = context.surface().classed('fill-wireframe');
41826           var zoom = geoScaleToZoom(projection.scale());
41827
41828           _prevSelected = _currSelected || {};
41829           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
41830
41831           // note that drawVertices will add `_currSelected` automatically if needed..
41832           var filter = function(d) { return d.id in _prevSelected; };
41833           drawVertices(selection, graph, values$1(_prevSelected), filter, extent, false);
41834       };
41835
41836
41837       // partial redraw - only update the hovered items..
41838       drawVertices.drawHover = function(selection, graph, target, extent) {
41839           if (target === _currHoverTarget) return;  // continue only if something changed
41840
41841           var wireframe = context.surface().classed('fill-wireframe');
41842           var zoom = geoScaleToZoom(projection.scale());
41843
41844           _prevHover = _currHover || {};
41845           _currHoverTarget = target;
41846           var entity = target && target.properties && target.properties.entity;
41847
41848           if (entity) {
41849               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
41850           } else {
41851               _currHover = {};
41852           }
41853
41854           // note that drawVertices will add `_currHover` automatically if needed..
41855           var filter = function(d) { return d.id in _prevHover; };
41856           drawVertices(selection, graph, values$1(_prevHover), filter, extent, false);
41857       };
41858
41859       return drawVertices;
41860   }
41861
41862   /* global Mapillary:false */
41863
41864
41865   var apibase = 'https://a.mapillary.com/v3/';
41866   var viewercss = 'mapillary-js/mapillary.min.css';
41867   var viewerjs = 'mapillary-js/mapillary.min.js';
41868   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
41869   var maxResults = 1000;
41870   var tileZoom = 14;
41871   var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
41872   var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
41873   var _mlyFallback = false;
41874   var _mlyCache;
41875   var _mlyClicks;
41876   var _mlySelectedImage;
41877   var _mlyViewer;
41878
41879
41880   function abortRequest$2(i) {
41881       i.abort();
41882   }
41883
41884
41885   function maxPageAtZoom(z) {
41886       if (z < 15)   return 2;
41887       if (z === 15) return 5;
41888       if (z === 16) return 10;
41889       if (z === 17) return 20;
41890       if (z === 18) return 40;
41891       if (z > 18)   return 80;
41892   }
41893
41894
41895   function loadTiles(which, url, projection) {
41896       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41897       var tiles = tiler$2.getTiles(projection);
41898
41899       // abort inflight requests that are no longer needed
41900       var cache = _mlyCache[which];
41901       forEach(cache.inflight, function(v, k) {
41902           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
41903
41904           if (!wanted) {
41905               abortRequest$2(v);
41906               delete cache.inflight[k];
41907           }
41908       });
41909
41910       tiles.forEach(function(tile) {
41911           loadNextTilePage(which, currZoom, url, tile);
41912       });
41913   }
41914
41915
41916   function loadNextTilePage(which, currZoom, url, tile) {
41917       var cache = _mlyCache[which];
41918       var rect = tile.extent.rectangle();
41919       var maxPages = maxPageAtZoom(currZoom);
41920       var nextPage = cache.nextPage[tile.id] || 0;
41921       var nextURL = cache.nextURL[tile.id] || url +
41922           utilQsString({
41923               per_page: maxResults,
41924               page: nextPage,
41925               client_id: clientId,
41926               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
41927           });
41928
41929       if (nextPage > maxPages) return;
41930
41931       var id = tile.id + ',' + String(nextPage);
41932       if (cache.loaded[id] || cache.inflight[id]) return;
41933       cache.inflight[id] = request(nextURL)
41934           .mimeType('application/json')
41935           .response(function(xhr) {
41936               var linkHeader = xhr.getResponseHeader('Link');
41937               if (linkHeader) {
41938                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
41939                   if (pagination.next) {
41940                       cache.nextURL[tile.id] = pagination.next;
41941                   }
41942               }
41943               return JSON.parse(xhr.responseText);
41944           })
41945           .get(function(err, data) {
41946               cache.loaded[id] = true;
41947               delete cache.inflight[id];
41948               if (err || !data.features || !data.features.length) return;
41949
41950               var features = data.features.map(function(feature) {
41951                   var loc = feature.geometry.coordinates;
41952                   var d;
41953
41954                   // An image (shown as a green dot on the map) is a single street photo with extra
41955                   // information such as location, camera angle (CA), camera model, and so on.
41956                   // Each image feature is a GeoJSON Point
41957                   if (which === 'images') {
41958                       d = {
41959                           loc: loc,
41960                           key: feature.properties.key,
41961                           ca: feature.properties.ca,
41962                           captured_at: feature.properties.captured_at,
41963                           captured_by: feature.properties.username,
41964                           pano: feature.properties.pano
41965                       };
41966
41967                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
41968
41969                   // Mapillary organizes images as sequences. A sequence of images are continuously captured
41970                   // by a user at a give time. Sequences are shown on the map as green lines.
41971                   // Each sequence feature is a GeoJSON LineString
41972                   } else if (which === 'sequences') {
41973                       var sequenceKey = feature.properties.key;
41974                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
41975                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
41976                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
41977                       });
41978                       return false;    // because no `d` data worth loading into an rbush
41979
41980                   // An image detection is a semantic pixel area on an image. The area could indicate
41981                   // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
41982                   // Each image_detection feature is a GeoJSON Point (located where the image was taken)
41983                   } else if (which === 'image_detections') {
41984                       d = {
41985                           key: feature.properties.key,
41986                           image_key: feature.properties.image_key,
41987                           value: feature.properties.value,
41988                           package: feature.properties.package,
41989                           shape: feature.properties.shape
41990                       };
41991
41992                       // cache imageKey -> image_detections
41993                       if (!cache.forImageKey[d.image_key]) {
41994                           cache.forImageKey[d.image_key] = [];
41995                       }
41996                       cache.forImageKey[d.image_key].push(d);
41997                       return false;    // because no `d` data worth loading into an rbush
41998
41999
42000                   // A map feature is a real world object that can be shown on a map. It could be any object
42001                   // recognized from images, manually added in images, or added on the map.
42002                   // Each map feature is a GeoJSON Point (located where the feature is)
42003                   } else if (which === 'map_features') {
42004                       d = {
42005                           loc: loc,
42006                           key: feature.properties.key,
42007                           value: feature.properties.value,
42008                           package: feature.properties.package,
42009                           detections: feature.properties.detections
42010                       };
42011                   }
42012
42013                   return {
42014                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
42015                   };
42016
42017               }).filter(Boolean);
42018
42019               if (cache.rtree && features) {
42020                   cache.rtree.load(features);
42021               }
42022
42023               if (which === 'images' || which === 'sequences') {
42024                   dispatch$3.call('loadedImages');
42025               } else if (which === 'map_features') {
42026                   dispatch$3.call('loadedSigns');
42027               }
42028
42029               if (data.features.length === maxResults) {  // more pages to load
42030                   cache.nextPage[tile.id] = nextPage + 1;
42031                   loadNextTilePage(which, currZoom, url, tile);
42032               } else {
42033                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
42034               }
42035           });
42036   }
42037
42038   // extract links to pages of API results
42039   function parsePagination(links) {
42040       return links.split(',').map(function(rel) {
42041           var elements = rel.split(';');
42042           if (elements.length === 2) {
42043               return [
42044                   /<(.+)>/.exec(elements[0])[1],
42045                   /rel="(.+)"/.exec(elements[1])[1]
42046               ];
42047           } else {
42048               return ['',''];
42049           }
42050       }).reduce(function(pagination, val) {
42051           pagination[val[1]] = val[0];
42052           return pagination;
42053       }, {});
42054   }
42055
42056
42057   // partition viewport into higher zoom tiles
42058   function partitionViewport(projection) {
42059       var z = geoScaleToZoom(projection.scale());
42060       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
42061       var tiler = utilTiler().zoomExtent([z2, z2]);
42062
42063       return tiler.getTiles(projection)
42064           .map(function(tile) { return tile.extent; });
42065   }
42066
42067
42068   // no more than `limit` results per partition.
42069   function searchLimited(limit, projection, rtree) {
42070       limit = limit || 5;
42071
42072       return partitionViewport(projection)
42073           .reduce(function(result, extent) {
42074               var found = rtree.search(extent.bbox())
42075                   .slice(0, limit)
42076                   .map(function(d) { return d.data; });
42077
42078               return (found.length ? result.concat(found) : result);
42079           }, []);
42080   }
42081
42082
42083
42084   var serviceMapillary = {
42085
42086       init: function() {
42087           if (!_mlyCache) {
42088               this.reset();
42089           }
42090
42091           this.event = utilRebind(this, dispatch$3, 'on');
42092       },
42093
42094       reset: function() {
42095           var cache = _mlyCache;
42096
42097           if (cache) {
42098               if (cache.images && cache.images.inflight) {
42099                   forEach(cache.images.inflight, abortRequest$2);
42100               }
42101               if (cache.image_detections && cache.image_detections.inflight) {
42102                   forEach(cache.image_detections.inflight, abortRequest$2);
42103               }
42104               if (cache.map_features && cache.map_features.inflight) {
42105                   forEach(cache.map_features.inflight, abortRequest$2);
42106               }
42107               if (cache.sequences && cache.sequences.inflight) {
42108                   forEach(cache.sequences.inflight, abortRequest$2);
42109               }
42110           }
42111
42112           _mlyCache = {
42113               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
42114               image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
42115               map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
42116               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
42117           };
42118
42119           _mlySelectedImage = null;
42120           _mlyClicks = [];
42121       },
42122
42123
42124       images: function(projection) {
42125           var limit = 5;
42126           return searchLimited(limit, projection, _mlyCache.images.rtree);
42127       },
42128
42129
42130       signs: function(projection) {
42131           var limit = 5;
42132           return searchLimited(limit, projection, _mlyCache.map_features.rtree);
42133       },
42134
42135
42136       sequences: function(projection) {
42137           var viewport = projection.clipExtent();
42138           var min = [viewport[0][0], viewport[1][1]];
42139           var max = [viewport[1][0], viewport[0][1]];
42140           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
42141           var sequenceKeys = {};
42142
42143           // all sequences for images in viewport
42144           _mlyCache.images.rtree.search(bbox)
42145               .forEach(function(d) {
42146                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
42147                   if (sequenceKey) {
42148                       sequenceKeys[sequenceKey] = true;
42149                   }
42150               });
42151
42152           // Return lineStrings for the sequences
42153           return Object.keys(sequenceKeys).map(function(sequenceKey) {
42154               return _mlyCache.sequences.lineString[sequenceKey];
42155           });
42156       },
42157
42158
42159       signsSupported: function() {
42160           return true;
42161       },
42162
42163
42164       loadImages: function(projection) {
42165           loadTiles('images', apibase + 'images?', projection);
42166           loadTiles('sequences', apibase + 'sequences?', projection);
42167       },
42168
42169
42170       loadSigns: function(context, projection) {
42171           // if we are looking at signs, we'll actually need to fetch images too
42172           loadTiles('images', apibase + 'images?', projection);
42173           loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
42174           loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
42175       },
42176
42177
42178       loadViewer: function(context) {
42179           // add mly-wrapper
42180           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
42181               .data([0]);
42182
42183           wrap.enter()
42184               .append('div')
42185               .attr('id', 'mly')
42186               .attr('class', 'photo-wrapper mly-wrapper')
42187               .classed('hide', true);
42188
42189           // load mapillary-viewercss
42190           select('head').selectAll('#mapillary-viewercss')
42191               .data([0])
42192               .enter()
42193               .append('link')
42194               .attr('id', 'mapillary-viewercss')
42195               .attr('rel', 'stylesheet')
42196               .attr('href', context.asset(viewercss));
42197
42198           // load mapillary-viewerjs
42199           select('head').selectAll('#mapillary-viewerjs')
42200               .data([0])
42201               .enter()
42202               .append('script')
42203               .attr('id', 'mapillary-viewerjs')
42204               .attr('src', context.asset(viewerjs));
42205
42206           // load mapillary signs sprite
42207           var defs = context.container().select('defs');
42208           defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
42209
42210           // Register viewer resize handler
42211           context.ui().photoviewer.on('resize', function() {
42212               if (_mlyViewer) {
42213                   _mlyViewer.resize();
42214               }
42215           });
42216       },
42217
42218
42219       showViewer: function() {
42220           var wrap = select('#photoviewer')
42221               .classed('hide', false);
42222
42223           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
42224
42225           if (isHidden && _mlyViewer) {
42226               wrap
42227                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
42228                   .classed('hide', true);
42229
42230               wrap
42231                   .selectAll('.photo-wrapper.mly-wrapper')
42232                   .classed('hide', false);
42233
42234               _mlyViewer.resize();
42235           }
42236
42237           return this;
42238       },
42239
42240
42241       hideViewer: function() {
42242           _mlySelectedImage = null;
42243
42244           if (!_mlyFallback && _mlyViewer) {
42245               _mlyViewer.getComponent('sequence').stop();
42246           }
42247
42248           var viewer = select('#photoviewer');
42249           if (!viewer.empty()) viewer.datum(null);
42250
42251           viewer
42252               .classed('hide', true)
42253               .selectAll('.photo-wrapper')
42254               .classed('hide', true);
42255
42256           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
42257               .classed('currentView', false);
42258
42259           return this.setStyles(null, true);
42260       },
42261
42262
42263       parsePagination: parsePagination,
42264
42265
42266       updateViewer: function(imageKey, context) {
42267           if (!imageKey) return this;
42268
42269           if (!_mlyViewer) {
42270               this.initViewer(imageKey, context);
42271           } else {
42272               _mlyViewer.moveToKey(imageKey)
42273                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
42274           }
42275
42276           return this;
42277       },
42278
42279
42280       initViewer: function(imageKey, context) {
42281           var that = this;
42282           if (window.Mapillary && imageKey) {
42283               var opts = {
42284                   baseImageSize: 320,
42285                   component: {
42286                       cover: false,
42287                       keyboard: false,
42288                       tag: true
42289                   }
42290               };
42291
42292               // Disable components requiring WebGL support
42293               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
42294                   _mlyFallback = true;
42295                   opts.component = {
42296                       cover: false,
42297                       direction: false,
42298                       imagePlane: false,
42299                       keyboard: false,
42300                       mouse: false,
42301                       sequence: false,
42302                       tag: false,
42303                       image: true,        // fallback
42304                       navigation: true    // fallback
42305                   };
42306               }
42307
42308               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
42309               _mlyViewer.on('nodechanged', nodeChanged);
42310               _mlyViewer.on('bearingchanged', bearingChanged);
42311               _mlyViewer.moveToKey(imageKey)
42312                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
42313           }
42314
42315           // nodeChanged: called after the viewer has changed images and is ready.
42316           //
42317           // There is some logic here to batch up clicks into a _mlyClicks array
42318           // because the user might click on a lot of markers quickly and nodechanged
42319           // may be called out of order asychronously.
42320           //
42321           // Clicks are added to the array in `selectedImage` and removed here.
42322           //
42323           function nodeChanged(node) {
42324               if (!_mlyFallback) {
42325                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
42326               }
42327
42328               var clicks = _mlyClicks;
42329               var index = clicks.indexOf(node.key);
42330               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
42331
42332               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
42333                   clicks.splice(index, 1);   // remove the click
42334                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
42335                   // one more time to update the detections and attribution..
42336                   if (node.key === selectedKey) {
42337                       that.selectImage(_mlySelectedImage, node.key, true);
42338                   }
42339               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
42340                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
42341                   context.map().centerEase(loc);
42342                   that.selectImage(undefined, node.key, true);
42343               }
42344           }
42345
42346           function bearingChanged(e) {
42347               dispatch$3.call('bearingChanged', undefined, e);
42348           }
42349       },
42350
42351
42352       // Pass the image datum itself in `d` or the `imageKey` string.
42353       // This allows images to be selected from places that dont have access
42354       // to the full image datum (like the street signs layer or the js viewer)
42355       selectImage: function(d, imageKey, fromViewer) {
42356           if (!d && imageKey) {
42357               // If the user clicked on something that's not an image marker, we
42358               // might get in here.. Cache lookup can fail, e.g. if the user
42359               // clicked a streetsign, but images are loading slowly asynchronously.
42360               // We'll try to carry on anyway if there is no datum.  There just
42361               // might be a delay before user sees detections, captured_at, etc.
42362               d = _mlyCache.images.forImageKey[imageKey];
42363           }
42364
42365           _mlySelectedImage = d;
42366           var viewer = select('#photoviewer');
42367           if (!viewer.empty()) viewer.datum(d);
42368
42369           imageKey = (d && d.key) || imageKey;
42370           if (!fromViewer && imageKey) {
42371               _mlyClicks.push(imageKey);
42372           }
42373
42374           this.setStyles(null, true);
42375
42376           // if signs signs are shown, highlight the ones that appear in this image
42377           d3_selectAll('.layer-mapillary-signs .icon-sign')
42378               .classed('currentView', function(d) {
42379                   return some(d.detections, function(detection) {
42380                       return detection.image_key === imageKey;
42381                   });
42382               });
42383
42384           if (d) {
42385               this.updateDetections(d);
42386           }
42387
42388           return this;
42389       },
42390
42391
42392       getSelectedImage: function() {
42393           return _mlySelectedImage;
42394       },
42395
42396
42397       getSequenceKeyForImage: function(d) {
42398           var imageKey = d && d.key;
42399           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
42400       },
42401
42402
42403       // Updates the currently highlighted sequence and selected bubble.
42404       // Reset is only necessary when interacting with the viewport because
42405       // this implicitly changes the currently selected bubble/sequence
42406       setStyles: function(hovered, reset) {
42407           if (reset) {  // reset all layers
42408               d3_selectAll('.viewfield-group')
42409                   .classed('highlighted', false)
42410                   .classed('hovered', false)
42411                   .classed('currentView', false);
42412
42413               d3_selectAll('.sequence')
42414                   .classed('highlighted', false)
42415                   .classed('currentView', false);
42416           }
42417
42418           var hoveredImageKey = hovered && hovered.key;
42419           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
42420           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
42421           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
42422
42423           var viewer = select('#photoviewer');
42424           var selected = viewer.empty() ? undefined : viewer.datum();
42425           var selectedImageKey = selected && selected.key;
42426           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
42427           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
42428           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
42429
42430           // highlight sibling viewfields on either the selected or the hovered sequences
42431           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
42432
42433           d3_selectAll('.layer-mapillary-images .viewfield-group')
42434               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
42435               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
42436               .classed('currentView', function(d) { return d.key === selectedImageKey; });
42437
42438           d3_selectAll('.layer-mapillary-images .sequence')
42439               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
42440               .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
42441
42442           // update viewfields if needed
42443           d3_selectAll('.viewfield-group .viewfield')
42444               .attr('d', viewfieldPath);
42445
42446           function viewfieldPath() {
42447               var d = this.parentNode.__data__;
42448               if (d.pano && d.key !== selectedImageKey) {
42449                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
42450               } else {
42451                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
42452               }
42453           }
42454
42455           return this;
42456       },
42457
42458
42459       updateDetections: function(d) {
42460           if (!_mlyViewer || _mlyFallback) return;
42461
42462           var imageKey = d && d.key;
42463           if (!imageKey) return;
42464
42465           var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
42466           detections.forEach(function(data) {
42467               var tag = makeTag(data);
42468               if (tag) {
42469                   var tagComponent = _mlyViewer.getComponent('tag');
42470                   tagComponent.add([tag]);
42471               }
42472           });
42473
42474           function makeTag(data) {
42475               var valueParts = data.value.split('--');
42476               if (valueParts.length !== 3) return;
42477
42478               var text = valueParts[1].replace(/-/g, ' ');
42479               var tag;
42480
42481               // Currently only two shapes <Polygon|Point>
42482               if (data.shape.type === 'Polygon') {
42483                   var polygonGeometry = new Mapillary
42484                       .TagComponent
42485                       .PolygonGeometry(data.shape.coordinates[0]);
42486
42487                   tag = new Mapillary.TagComponent.OutlineTag(
42488                       data.key,
42489                       polygonGeometry,
42490                       {
42491                           text: text,
42492                           textColor: 0xffff00,
42493                           lineColor: 0xffff00,
42494                           lineWidth: 2,
42495                           fillColor: 0xffff00,
42496                           fillOpacity: 0.3,
42497                       }
42498                   );
42499
42500               } else if (data.shape.type === 'Point') {
42501                   var pointGeometry = new Mapillary
42502                       .TagComponent
42503                       .PointGeometry(data.shape.coordinates[0]);
42504
42505                   tag = new Mapillary.TagComponent.SpotTag(
42506                       data.key,
42507                       pointGeometry,
42508                       {
42509                           text: text,
42510                           color: 0xffff00,
42511                           textColor: 0xffff00
42512                       }
42513                   );
42514               }
42515
42516               return tag;
42517           }
42518       },
42519
42520
42521       cache: function() {
42522           return _mlyCache;
42523       }
42524
42525   };
42526
42527   /**
42528    * Performs a partial deep comparison between `object` and `source` to
42529    * determine if `object` contains equivalent property values.
42530    *
42531    * **Note:** This method is equivalent to `_.matches` when `source` is
42532    * partially applied.
42533    *
42534    * Partial comparisons will match empty array and empty object `source`
42535    * values against any array or object value, respectively. See `_.isEqual`
42536    * for a list of supported value comparisons.
42537    *
42538    * @static
42539    * @memberOf _
42540    * @since 3.0.0
42541    * @category Lang
42542    * @param {Object} object The object to inspect.
42543    * @param {Object} source The object of property values to match.
42544    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
42545    * @example
42546    *
42547    * var object = { 'a': 1, 'b': 2 };
42548    *
42549    * _.isMatch(object, { 'b': 2 });
42550    * // => true
42551    *
42552    * _.isMatch(object, { 'b': 1 });
42553    * // => false
42554    */
42555   function isMatch(object, source) {
42556     return object === source || baseIsMatch(object, source, getMatchData(source));
42557   }
42558
42559   /* Built-in method references for those with the same name as other `lodash` methods. */
42560   var nativeMin$1 = Math.min;
42561
42562   /**
42563    * The base implementation of methods like `_.intersection`, without support
42564    * for iteratee shorthands, that accepts an array of arrays to inspect.
42565    *
42566    * @private
42567    * @param {Array} arrays The arrays to inspect.
42568    * @param {Function} [iteratee] The iteratee invoked per element.
42569    * @param {Function} [comparator] The comparator invoked per element.
42570    * @returns {Array} Returns the new array of shared values.
42571    */
42572   function baseIntersection(arrays, iteratee, comparator) {
42573     var includes = comparator ? arrayIncludesWith : arrayIncludes,
42574         length = arrays[0].length,
42575         othLength = arrays.length,
42576         othIndex = othLength,
42577         caches = Array(othLength),
42578         maxLength = Infinity,
42579         result = [];
42580
42581     while (othIndex--) {
42582       var array = arrays[othIndex];
42583       if (othIndex && iteratee) {
42584         array = arrayMap(array, baseUnary(iteratee));
42585       }
42586       maxLength = nativeMin$1(array.length, maxLength);
42587       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
42588         ? new SetCache(othIndex && array)
42589         : undefined;
42590     }
42591     array = arrays[0];
42592
42593     var index = -1,
42594         seen = caches[0];
42595
42596     outer:
42597     while (++index < length && result.length < maxLength) {
42598       var value = array[index],
42599           computed = iteratee ? iteratee(value) : value;
42600
42601       value = (comparator || value !== 0) ? value : 0;
42602       if (!(seen
42603             ? cacheHas(seen, computed)
42604             : includes(result, computed, comparator)
42605           )) {
42606         othIndex = othLength;
42607         while (--othIndex) {
42608           var cache = caches[othIndex];
42609           if (!(cache
42610                 ? cacheHas(cache, computed)
42611                 : includes(arrays[othIndex], computed, comparator))
42612               ) {
42613             continue outer;
42614           }
42615         }
42616         if (seen) {
42617           seen.push(computed);
42618         }
42619         result.push(value);
42620       }
42621     }
42622     return result;
42623   }
42624
42625   /**
42626    * Casts `value` to an empty array if it's not an array like object.
42627    *
42628    * @private
42629    * @param {*} value The value to inspect.
42630    * @returns {Array|Object} Returns the cast array-like object.
42631    */
42632   function castArrayLikeObject(value) {
42633     return isArrayLikeObject(value) ? value : [];
42634   }
42635
42636   /**
42637    * Creates an array of unique values that are included in all given arrays
42638    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
42639    * for equality comparisons. The order and references of result values are
42640    * determined by the first array.
42641    *
42642    * @static
42643    * @memberOf _
42644    * @since 0.1.0
42645    * @category Array
42646    * @param {...Array} [arrays] The arrays to inspect.
42647    * @returns {Array} Returns the new array of intersecting values.
42648    * @example
42649    *
42650    * _.intersection([2, 1], [2, 3]);
42651    * // => [2]
42652    */
42653   var intersection = baseRest(function(arrays) {
42654     var mapped = arrayMap(arrays, castArrayLikeObject);
42655     return (mapped.length && mapped[0] === arrays[0])
42656       ? baseIntersection(mapped)
42657       : [];
42658   });
42659
42660   /** Used as references for various `Number` constants. */
42661   var INFINITY$4 = 1 / 0;
42662
42663   /**
42664    * Recursively flattens `array`.
42665    *
42666    * @static
42667    * @memberOf _
42668    * @since 3.0.0
42669    * @category Array
42670    * @param {Array} array The array to flatten.
42671    * @returns {Array} Returns the new flattened array.
42672    * @example
42673    *
42674    * _.flattenDeep([1, [2, [3, [4]], 5]]);
42675    * // => [1, 2, 3, 4, 5]
42676    */
42677   function flattenDeep(array) {
42678     var length = array == null ? 0 : array.length;
42679     return length ? baseFlatten(array, INFINITY$4) : [];
42680   }
42681
42682   /**
42683    * Look for roads that can be connected to other roads with a short extension
42684    */
42685   function validationAlmostJunction() {
42686       var type = 'almost_junction';
42687
42688
42689       function isHighway(entity) {
42690           return entity.type === 'way' &&
42691               entity.tags.highway &&
42692               entity.tags.highway !== 'no' &&
42693               entity.tags.highway !== 'proposed';
42694       }
42695
42696       function isNoexit(node) {
42697           return node.tags.noexit && node.tags.noexit === 'yes';
42698       }
42699
42700       function isExtendableCandidate(node, way, graph) {
42701           if (isNoexit(node) || graph.parentWays(node).length !== 1) {
42702               return false;
42703           }
42704           var occurences = 0;
42705           for (var index in way.nodes) {
42706               if (way.nodes[index] === node.id) {
42707                   occurences += 1;
42708                   if (occurences > 1) {
42709                       return false;
42710                   }
42711               }
42712           }
42713           return true;
42714       }
42715
42716       function findConnectableEndNodesByExtension(way, graph, tree) {
42717
42718           var results = [];
42719
42720           if (way.isClosed()) return results;
42721
42722           var nidFirst = way.nodes[0];
42723           var nidLast = way.nodes[way.nodes.length - 1];
42724           var nodeFirst = graph.entity(nidFirst);
42725           var nodeLast = graph.entity(nidLast);
42726
42727           var testNodes;
42728
42729           if (isExtendableCandidate(nodeFirst, way, graph)) {
42730               var connNearFirst = canConnectByExtend(way, 0, graph, tree);
42731               if (connNearFirst !== null) {
42732                   testNodes = cloneDeep(graph.childNodes(way));
42733                   testNodes[0].loc = connNearFirst.cross_loc;
42734                   // don't flag issue if connecting the ways would cause self-intersection
42735                   if (!geoHasSelfIntersections(testNodes, nodeFirst.id)) {
42736                       results.push({
42737                           node: nodeFirst,
42738                           wid: connNearFirst.wid,
42739                           edge: connNearFirst.edge,
42740                           cross_loc: connNearFirst.cross_loc
42741                       });
42742                   }
42743               }
42744           }
42745
42746           if (isExtendableCandidate(nodeLast, way, graph)) {
42747               var connNearLast = canConnectByExtend(way, way.nodes.length - 1, graph, tree);
42748               if (connNearLast !== null) {
42749                   testNodes = cloneDeep(graph.childNodes(way));
42750                   testNodes[testNodes.length-1].loc = connNearLast.cross_loc;
42751                   // don't flag issue if connecting the ways would cause self-intersection
42752                   if (!geoHasSelfIntersections(testNodes, nodeLast.id)) {
42753                       results.push({
42754                           node: nodeLast,
42755                           wid: connNearLast.wid,
42756                           edge: connNearLast.edge,
42757                           cross_loc: connNearLast.cross_loc
42758                       });
42759                   }
42760               }
42761           }
42762           return results;
42763       }
42764
42765
42766       function canConnectByExtend(way, endNodeIdx, graph, tree) {
42767           var EXTEND_TH_METERS = 5;
42768           var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
42769           var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
42770           var tipNode = graph.entity(tipNid);
42771           var midNode = graph.entity(midNid);
42772           var lon = tipNode.loc[0];
42773           var lat = tipNode.loc[1];
42774           var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
42775           var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
42776           var queryExtent = geoExtent([
42777               [lon - lon_range, lat - lat_range],
42778               [lon + lon_range, lat + lat_range]
42779           ]);
42780
42781           // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
42782           var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
42783           var t = EXTEND_TH_METERS / edgeLen + 1.0;
42784           var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
42785
42786           // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
42787           var intersected = tree.intersects(queryExtent, graph);
42788           for (var i = 0; i < intersected.length; i++) {
42789               if (!isHighway(intersected[i]) || intersected[i].id === way.id) continue;
42790
42791               var way2 = intersected[i];
42792               for (var j = 0; j < way2.nodes.length - 1; j++) {
42793                   var nA = graph.entity(way2.nodes[j]);
42794                   var nB = graph.entity(way2.nodes[j + 1]);
42795                   var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
42796                   if (crossLoc !== null) {
42797                       return {
42798                           wid: way2.id,
42799                           edge: [nA.id, nB.id],
42800                           cross_loc: crossLoc
42801                       };
42802                   }
42803               }
42804           }
42805           return null;
42806       }
42807
42808
42809       var validation = function(endHighway, context) {
42810           if (!isHighway(endHighway)) return [];
42811
42812           var graph = context.graph();
42813           var tree = context.history().tree();
42814           var issues = [];
42815
42816           var extendableNodeInfos = findConnectableEndNodesByExtension(endHighway, graph, tree);
42817           extendableNodeInfos.forEach(function(extendableNodeInfo) {
42818               var node = extendableNodeInfo.node;
42819               var edgeHighway = graph.entity(extendableNodeInfo.wid);
42820
42821               var fixes = [new validationIssueFix({
42822                   icon: 'iD-icon-abutment',
42823                   title: t('issues.fix.connect_features.title'),
42824                   onClick: function() {
42825                       var endNode = this.issue.entities[1];
42826                       var targetEdge = this.issue.info.edge;
42827                       var crossLoc = this.issue.info.cross_loc;
42828                       var edgeNodes = [context.graph().entity(targetEdge[0]), context.graph().entity(targetEdge[1])];
42829                       var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
42830
42831                       var annotation = t('issues.fix.connect_almost_junction.annotation');
42832                       // already a point nearby, just connect to that
42833                       if (closestNodeInfo.distance < 0.75) {
42834                           context.perform(
42835                               actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
42836                               annotation
42837                           );
42838                       // else add the end node to the edge way
42839                       } else {
42840                           context.perform(
42841                               actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
42842                               annotation
42843                           );
42844                       }
42845                   }
42846               })];
42847
42848               if (Object.keys(node.tags).length === 0) {
42849                   // node has no tags, suggest noexit fix
42850                   fixes.push(new validationIssueFix({
42851                       icon: 'maki-barrier',
42852                       title: t('issues.fix.tag_as_disconnected.title'),
42853                       onClick: function() {
42854                           var nodeID = this.issue.entities[1].id;
42855                           context.perform(
42856                               actionChangeTags(nodeID, { noexit: 'yes' }),
42857                               t('issues.fix.tag_as_disconnected.annotation')
42858                           );
42859                       }
42860                   }));
42861               }
42862
42863               issues.push(new validationIssue({
42864                   type: type,
42865                   severity: 'warning',
42866                   message: t('issues.almost_junction.message', {
42867                       feature: utilDisplayLabel(endHighway, context),
42868                       feature2: utilDisplayLabel(edgeHighway, context)
42869                   }),
42870                   tooltip: t('issues.almost_junction.highway-highway.tip'),
42871                   entities: [endHighway, node, edgeHighway],
42872                   loc: extendableNodeInfo.node.loc,
42873                   info: {
42874                       edge: extendableNodeInfo.edge,
42875                       cross_loc: extendableNodeInfo.cross_loc
42876                   },
42877                   fixes: fixes
42878               }));
42879           });
42880
42881           return issues;
42882       };
42883
42884       validation.type = type;
42885
42886       return validation;
42887   }
42888
42889   function validationCrossingWays() {
42890       var type = 'crossing_ways';
42891
42892       /*
42893       Avoid duplicate work by cacheing issues. The same issues live under two paths.
42894       {
42895           w-123: {
42896               w-456: [{issue1}, {issue2}…]
42897           },
42898           w-456: {
42899               w-123: [{issue1}, {issue2}…]
42900           }
42901       }
42902       */
42903       var issueCache = {};
42904
42905       // returns the way or its parent relation, whichever has a useful feature type
42906       function getFeatureWithFeatureTypeTagsForWay(way, graph) {
42907           if (getFeatureTypeForTags(way.tags) === null) {
42908               // if the way doesn't match a feature type, check its parent relations
42909               var parentRels = graph.parentRelations(way);
42910               for (var i = 0; i < parentRels.length; i++) {
42911                   var rel = parentRels[i];
42912                   if (getFeatureTypeForTags(rel.tags) !== null) {
42913                       return rel;
42914                   }
42915               }
42916           }
42917           return way;
42918       }
42919
42920
42921       function hasTag(tags, key) {
42922           return tags[key] !== undefined && tags[key] !== 'no';
42923       }
42924
42925       function tagsImplyIndoors(tags) {
42926           return hasTag(tags, 'level') || tags.highway === 'corridor';
42927       }
42928
42929       function allowsStructures(featureType) {
42930           return allowsBridge(featureType) || allowsTunnel(featureType);
42931       }
42932       function allowsBridge(featureType) {
42933           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
42934       }
42935       function allowsTunnel(featureType) {
42936           return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
42937       }
42938       function canCover(featureType) {
42939           return featureType === 'building';
42940       }
42941
42942
42943       function getFeatureTypeForCrossingCheck(way, graph) {
42944           var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
42945           return getFeatureTypeForTags(tags);
42946       }
42947
42948
42949       // only validate certain waterway and railway features
42950       var waterways = ['canal', 'ditch', 'drain', 'river', 'stream'];
42951       var railways = ['rail', 'disused', 'tram', 'subway', 'narrow_gauge', 'light_rail',
42952                       'preserved', 'miniature', 'monorail', 'funicular'];
42953       // ignore certain highway and building features
42954       var ignoredHighways = ['rest_area', 'services', 'proposed', 'razed'];
42955       var ignoredBuildings = ['proposed', 'razed'];
42956
42957
42958       function getFeatureTypeForTags(tags) {
42959           if (hasTag(tags, 'building') && ignoredBuildings.indexOf(tags.building) === -1) return 'building';
42960
42961           // don't check non-building areas
42962           if (hasTag(tags, 'area')) return null;
42963
42964           if (hasTag(tags, 'highway') && ignoredHighways.indexOf(tags.highway) === -1) return 'highway';
42965           if (hasTag(tags, 'railway') && railways.indexOf(tags.railway) !== -1) return 'railway';
42966           if (hasTag(tags, 'waterway') && waterways.indexOf(tags.waterway) !== -1) return 'waterway';
42967
42968           return null;
42969       }
42970
42971
42972       function isLegitCrossing(way1, featureType1, way2, featureType2) {
42973           var tags1 = way1.tags;
42974           var tags2 = way2.tags;
42975
42976           // assume 0 by default
42977           var level1 = tags1.level || '0';
42978           var level2 = tags2.level || '0';
42979
42980           if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
42981               // assume features don't interact if they're indoor on different levels
42982               return true;
42983           }
42984
42985           // assume 0 by default; don't use way.layer() since we account for structures here
42986           var layer1 = tags1.layer || '0';
42987           var layer2 = tags2.layer || '0';
42988
42989           if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
42990               if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
42991               if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
42992               // crossing bridges must use different layers
42993               if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
42994           } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
42995           else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
42996
42997           if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
42998               if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
42999               if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
43000               // crossing tunnels must use different layers
43001               if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
43002           } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
43003           else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
43004
43005           if (canCover(featureType1) && canCover(featureType2)) {
43006               if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
43007               if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
43008               // crossing covered features that can themselves cover must use different layers
43009               if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
43010           } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
43011           else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
43012
43013           if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
43014               // if no structures are applicable, the layers must be different
43015               if (layer1 !== layer2) return true;
43016           }
43017           return false;
43018       }
43019
43020
43021       // highway values for which we shouldn't recommend connecting to waterways
43022       var highwaysDisallowingFords = [
43023           'motorway', 'motorway_link', 'trunk', 'trunk_link',
43024           'primary', 'primary_link', 'secondary', 'secondary_link'
43025       ];
43026       var pathHighways = {
43027           path: true, footway: true, cycleway: true, bridleway: true,
43028           pedestrian: true, steps: true, corridor: true
43029       };
43030       var nonCrossingHighways = { track: true };
43031
43032       function tagsForConnectionNodeIfAllowed(entity1, entity2) {
43033           var featureType1 = getFeatureTypeForTags(entity1.tags);
43034           var featureType2 = getFeatureTypeForTags(entity2.tags);
43035           if (featureType1 === featureType2) {
43036               if (featureType1 === 'highway') {
43037                   var entity1IsPath = pathHighways[entity1.tags.highway];
43038                   var entity2IsPath = pathHighways[entity2.tags.highway];
43039                   if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
43040                       // one feature is a path but not both
43041
43042                       var roadFeature = entity1IsPath ? entity2 : entity1;
43043                       if (nonCrossingHighways[roadFeature.tags.highway]) {
43044                           // don't mark path connections with certain roads as crossings
43045                           return {};
43046                       }
43047                       var pathFeature = entity1IsPath ? entity1 : entity2;
43048                       if (pathFeature.tags.highway === 'footway' &&
43049                           pathFeature.tags.footway === 'crossing' &&
43050                           ['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
43051                           // if the path is a crossing, match the crossing type
43052                           return { highway: 'crossing', crossing: pathFeature.tags.crossing };
43053                       }
43054                       return { highway: 'crossing' };
43055                   }
43056                   return {};
43057               }
43058               if (featureType1 === 'waterway') return {};
43059               if (featureType1 === 'railway') return {};
43060
43061           } else {
43062               var featureTypes = [featureType1, featureType2];
43063               if (featureTypes.indexOf('highway') !== -1) {
43064                   if (featureTypes.indexOf('railway') !== -1) {
43065                       if (pathHighways[entity1.tags.highway] ||
43066                           pathHighways[entity2.tags.highway]) {
43067                           // path-rail connections use this tag
43068                           return { railway: 'crossing' };
43069                       } else {
43070                           // road-rail connections use this tag
43071                           return { railway: 'level_crossing' };
43072                       }
43073                   }
43074
43075                   if (featureTypes.indexOf('waterway') !== -1) {
43076                       // do not allow fords on structures
43077                       if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
43078                       if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
43079
43080                       if (highwaysDisallowingFords.indexOf(entity1.tags.highway) !== -1 ||
43081                           highwaysDisallowingFords.indexOf(entity2.tags.highway) !== -1) {
43082                           // do not allow fords on major highways
43083                           return null;
43084                       }
43085                       return { ford: 'yes' };
43086                   }
43087               }
43088           }
43089           return null;
43090       }
43091
43092
43093       function findCrossingsByWay(way1, graph, tree) {
43094
43095           var edgeCrossInfos = [];
43096           if (way1.type !== 'way') return edgeCrossInfos;
43097
43098           var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
43099           if (way1FeatureType === null) return edgeCrossInfos;
43100
43101           var checkedSingleCrossingWays = {};
43102
43103           // declare vars ahead of time to reduce garbage collection
43104           var i, j, nodeIndex;
43105           var extent;
43106           var n1, n2, nA, nB;
43107           var segment1, segment2;
43108           var oneOnly;
43109           var intersected, way2, way2FeatureType, way2Nodes;
43110           var way1Nodes = graph.childNodes(way1);
43111           var comparedWays = {};
43112           for (i = 0; i < way1Nodes.length - 1; i++) {
43113               n1 = way1Nodes[i];
43114               n2 = way1Nodes[i + 1];
43115               extent = geoExtent([
43116                   [
43117                       Math.min(n1.loc[0], n2.loc[0]),
43118                       Math.min(n1.loc[1], n2.loc[1])
43119                   ],
43120                   [
43121                       Math.max(n1.loc[0], n2.loc[0]),
43122                       Math.max(n1.loc[1], n2.loc[1])
43123                   ]
43124               ]);
43125
43126               intersected = tree.intersects(extent, graph);
43127               for (j = 0; j < intersected.length; j++) {
43128                   way2 = intersected[j];
43129
43130                   if (way2.type !== 'way') continue;
43131
43132                   // don't check for self-intersection in this validation
43133                   if (way2.id === way1.id) continue;
43134
43135                   // skip if this way was already checked and only one issue is needed
43136                   if (checkedSingleCrossingWays[way2.id]) continue;
43137
43138                   // don't re-check previously checked features
43139                   if (issueCache[way1.id] && issueCache[way1.id][way2.id]) continue;
43140
43141                   // mark this way as checked even if there are no crossings
43142                   comparedWays[way2.id] = true;
43143
43144                   // only check crossing highway, waterway, building, and railway
43145                   way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
43146                   if (way2FeatureType === null ||
43147                       isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
43148                       continue;
43149                   }
43150
43151                   // create only one issue for building crossings
43152                   oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
43153                   segment1 = [n1.loc, n2.loc];
43154
43155                   way2Nodes = graph.childNodes(way2);
43156                   for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
43157                       nA = way2Nodes[nodeIndex];
43158                       nB = way2Nodes[nodeIndex + 1];
43159                       if (nA.id === n1.id || nA.id === n2.id ||
43160                           nB.id === n1.id || nB.id === n2.id) {
43161                           // n1 or n2 is a connection node; skip
43162                           continue;
43163                       }
43164                       segment2 = [nA.loc, nB.loc];
43165                       var point = geoLineIntersection(segment1, segment2);
43166                       if (point) {
43167                           edgeCrossInfos.push({
43168                               ways: [way1, way2],
43169                               featureTypes: [way1FeatureType, way2FeatureType],
43170                               edges: [[n1.id, n2.id], [nA.id, nB.id]],
43171                               crossPoint: point
43172                           });
43173                           if (oneOnly) {
43174                               checkedSingleCrossingWays[way2.id] = true;
43175                               break;
43176                           }
43177                       }
43178                   }
43179               }
43180           }
43181           for (var way2ID in comparedWays) {
43182               if (!issueCache[way1.id]) issueCache[way1.id] = {};
43183               if (!issueCache[way1.id][way2ID]) issueCache[way1.id][way2ID] = [];
43184               if (!issueCache[way2ID]) issueCache[way2ID] = {};
43185               if (!issueCache[way2ID][way1.id]) issueCache[way2ID][way1.id] = [];
43186           }
43187           return edgeCrossInfos;
43188       }
43189
43190
43191       function waysToCheck(entity, context) {
43192           if (!getFeatureTypeForTags(entity.tags)) {
43193               return [];
43194           }
43195           if (entity.type === 'way') {
43196               return [entity];
43197           } else if (entity.type === 'relation' &&
43198               entity.isMultipolygon() &&
43199               // only check multipolygons if they are buildings
43200               hasTag(entity.tags, 'building')) {
43201               return entity.members.reduce(function(array, member) {
43202                   if (member.type === 'way' &&
43203                       //(member.role === 'outer' || member.role === 'inner') &&
43204                       context.hasEntity(member.id)) {
43205                       var entity = context.entity(member.id);
43206                       array.push(entity);
43207                   }
43208                   return array;
43209               }, []);
43210           }
43211           return [];
43212       }
43213
43214       var validation = function(entity, context) {
43215           var graph = context.graph();
43216           var tree = context.history().tree();
43217
43218           var ways = waysToCheck(entity, context);
43219
43220           var issues = [];
43221           // declare these here to reduce garbage collection
43222           var wayIndex, crossingIndex, key, crossings, crossing, issue;
43223           for (wayIndex in ways) {
43224               var way = ways[wayIndex];
43225               crossings = findCrossingsByWay(way, graph, tree);
43226               for (crossingIndex in crossings) {
43227                   crossing = crossings[crossingIndex];
43228                   var way2 = crossing.ways[1];
43229                   issue = createIssue(crossing, context);
43230                   // cache the issues for each way
43231                   issueCache[way.id][way2.id].push(issue);
43232                   issueCache[way2.id][way.id].push(issue);
43233               }
43234               for (key in issueCache[way.id]) {
43235                   issues = issues.concat(issueCache[way.id][key]);
43236               }
43237           }
43238           return issues;
43239       };
43240
43241
43242       function createIssue(crossing, context) {
43243           var graph = context.graph();
43244
43245           // use the entities with the tags that define the feature type
43246           var entities = crossing.ways.sort(function(entity1, entity2) {
43247               var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
43248               var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
43249               if (type1 === type2) {
43250                   return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
43251               } else if (type1 === 'waterway') {
43252                   return true;
43253               } else if (type2 === 'waterway') {
43254                   return false;
43255               }
43256               return type1 < type2;
43257           });
43258           entities = entities.map(function(way) {
43259               return getFeatureWithFeatureTypeTagsForWay(way, graph);
43260           });
43261
43262           var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
43263
43264           var featureType1 = crossing.featureTypes[0];
43265           var featureType2 = crossing.featureTypes[1];
43266
43267           var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
43268           var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
43269                                   allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
43270           var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
43271                                   allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
43272
43273           var crossingTypeID;
43274
43275           if (isCrossingIndoors) {
43276               crossingTypeID = 'indoor-indoor';
43277           } else if (isCrossingTunnels) {
43278               crossingTypeID = 'tunnel-tunnel';
43279           } else if (isCrossingBridges) {
43280               crossingTypeID = 'bridge-bridge';
43281           } else {
43282               crossingTypeID = crossing.featureTypes.sort().join('-');
43283           }
43284           if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
43285               crossingTypeID += '_connectable';
43286           }
43287
43288           var messageDict = {
43289               feature: utilDisplayLabel(entities[0], context),
43290               feature2: utilDisplayLabel(entities[1], context)
43291           };
43292
43293           var fixes = [];
43294           if (connectionTags) {
43295               fixes.push(new validationIssueFix({
43296                   icon: 'iD-icon-crossing',
43297                   title: t('issues.fix.connect_features.title'),
43298                   onClick: function() {
43299                       var loc = this.issue.loc;
43300                       var connectionTags = this.issue.info.connectionTags;
43301                       var edges = this.issue.info.edges;
43302
43303                       context.perform(
43304                           function actionConnectCrossingWays(graph) {
43305                               // create the new node for the points
43306                               var node = osmNode({ loc: loc, tags: connectionTags });
43307                               graph = graph.replace(node);
43308
43309                               var nodesToMerge = [node.id];
43310                               var mergeThresholdInMeters = 0.75;
43311
43312                               edges.forEach(function(edge) {
43313                                   var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
43314                                   var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
43315                                   // if there is already a point nearby, use that
43316                                   if (closestNodeInfo.distance < mergeThresholdInMeters) {
43317                                       nodesToMerge.push(closestNodeInfo.node.id);
43318                                   // else add the new node to the way
43319                                   } else {
43320                                       graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
43321                                   }
43322                               });
43323
43324                               if (nodesToMerge.length > 1) {
43325                                   // if we're using nearby nodes, merge them with the new node
43326                                   graph = actionMergeNodes(nodesToMerge, loc)(graph);
43327                               }
43328
43329                               return graph;
43330                           },
43331                           t('issues.fix.connect_crossing_features.annotation')
43332                       );
43333                   }
43334               }));
43335           }
43336           var useFixIcon = 'iD-icon-layers';
43337           var useFixID;
43338           if (isCrossingIndoors) {
43339               useFixID = 'use_different_levels';
43340           } else if (isCrossingTunnels || isCrossingBridges) {
43341               useFixID = 'use_different_layers';
43342           // don't recommend bridges for waterways even though they're okay
43343           } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
43344                   (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
43345               useFixID = 'use_bridge_or_tunnel';
43346               useFixIcon = 'maki-bridge';
43347           } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
43348               useFixID = 'use_tunnel';
43349           } else {
43350               useFixID = 'use_different_layers';
43351           }
43352           fixes.push(new validationIssueFix({
43353               icon: useFixIcon,
43354               title: t('issues.fix.' + useFixID + '.title')
43355           }));
43356           fixes.push(new validationIssueFix({
43357               icon: 'iD-operation-move',
43358               title: t('issues.fix.reposition_features.title')
43359           }));
43360           return new validationIssue({
43361               type: type,
43362               severity: 'warning',
43363               message: t('issues.crossing_ways.message', messageDict),
43364               tooltip: t('issues.crossing_ways.'+crossingTypeID+'.tip'),
43365               entities: entities,
43366               info: { edges: crossing.edges, connectionTags: connectionTags },
43367               loc: crossing.crossPoint,
43368               fixes: fixes
43369           });
43370       }
43371
43372       validation.reset = function() {
43373           issueCache = {};
43374       };
43375
43376       validation.type = type;
43377
43378       return validation;
43379   }
43380
43381   function validationDeprecatedTag() {
43382       var type = 'deprecated_tag';
43383
43384
43385       var validation = function(entity, context) {
43386           var issues = [];
43387           var deprecatedTagsArray = entity.deprecatedTags();
43388           if (deprecatedTagsArray.length > 0) {
43389               for (var deprecatedTagIndex in deprecatedTagsArray) {
43390                   var deprecatedTags = deprecatedTagsArray[deprecatedTagIndex];
43391                   var labelTags = clone(deprecatedTags.old);
43392                   for (var key in labelTags) {
43393                       if (labelTags[key] === '*') {
43394                           // show the user the actual tag, like color=red instead of color=*
43395                           labelTags[key] = entity.tags[key];
43396                       }
43397                   }
43398                   var tagsLabel = utilTagText({ tags: labelTags });
43399                   var featureLabel = utilDisplayLabel(entity, context);
43400                   var isCombo = Object.keys(deprecatedTags.old).length > 1;
43401                   var messageObj = { feature: featureLabel };
43402                   if (isCombo) {
43403                       messageObj.tags = tagsLabel;
43404                   } else {
43405                       messageObj.tag = tagsLabel;
43406                   }
43407                   var tagMessageID = isCombo ? 'combination' : 'single';
43408                   issues.push(new validationIssue({
43409                       type: type,
43410                       severity: 'warning',
43411                       message: t('issues.deprecated_tag.' + tagMessageID + '.message', messageObj),
43412                       tooltip: t('issues.deprecated_tag.tip'),
43413                       entities: [entity],
43414                       hash: tagsLabel,
43415                       info: {
43416                           oldTags: deprecatedTags.old,
43417                           replaceTags: deprecatedTags.replace
43418                       },
43419                       fixes: [
43420                           new validationIssueFix({
43421                               icon: 'iD-icon-up',
43422                               title: t('issues.fix.' + (isCombo ? 'upgrade_tag_combo' : 'upgrade_tag') + '.title'),
43423                               onClick: function() {
43424                                   var oldTags = this.issue.info.oldTags;
43425                                   var replaceTags = this.issue.info.replaceTags;
43426                                   var fixTextID = Object.keys(oldTags).length > 1 ? 'upgrade_tag_combo' : 'upgrade_tag';
43427                                   context.perform(
43428                                       actionUpgradeTags(this.issue.entities[0].id, oldTags, replaceTags),
43429                                       t('issues.fix.' + fixTextID + '.annotation')
43430                                   );
43431                               }
43432                           }),
43433                           new validationIssueFix({
43434                               icon: 'iD-operation-delete',
43435                               title: t('issues.fix.' + (isCombo ? 'remove_tags' : 'remove_tag') + '.title'),
43436                               onClick: function() {
43437                                   var entity = this.issue.entities[0];
43438                                   var tags = clone(entity.tags);
43439                                   var oldTags = this.issue.info.oldTags;
43440                                   for (var key in oldTags) {
43441                                       delete tags[key];
43442                                   }
43443                                   var fixTextID = Object.keys(oldTags).length > 1 ? 'remove_deprecated_tag_combo' : 'remove_deprecated_tag';
43444                                   context.perform(
43445                                       actionChangeTags(entity.id, tags),
43446                                       t('issues.fix.' + fixTextID + '.annotation')
43447                                   );
43448                               }
43449                           })
43450                       ]
43451                   }));
43452               }
43453           }
43454
43455           return issues;
43456       };
43457
43458       validation.type = type;
43459
43460       return validation;
43461   }
43462
43463   function operationCircularize(selectedIDs, context) {
43464       var entityId = selectedIDs[0],
43465           entity = context.entity(entityId),
43466           extent = entity.extent(context.graph()),
43467           geometry = context.geometry(entityId),
43468           action = actionCircularize(entityId, context.projection);
43469
43470
43471       var operation = function() {
43472           context.perform(action, operation.annotation());
43473       };
43474
43475
43476       operation.available = function() {
43477           return selectedIDs.length === 1 &&
43478               entity.type === 'way' &&
43479               uniq(entity.nodes).length > 1;
43480       };
43481
43482
43483       operation.disabled = function() {
43484           var reason;
43485           if (extent.percentContainedIn(context.extent()) < 0.8) {
43486               reason = 'too_large';
43487           } else if (context.hasHiddenConnections(entityId)) {
43488               reason = 'connected_to_hidden';
43489           }
43490           return action.disabled(context.graph()) || reason;
43491       };
43492
43493
43494       operation.tooltip = function() {
43495           var disable = operation.disabled();
43496           return disable ?
43497               t('operations.circularize.' + disable) :
43498               t('operations.circularize.description.' + geometry);
43499       };
43500
43501
43502       operation.annotation = function() {
43503           return t('operations.circularize.annotation.' + geometry);
43504       };
43505
43506
43507       operation.id = 'circularize';
43508       operation.keys = [t('operations.circularize.key')];
43509       operation.title = t('operations.circularize.title');
43510       operation.behavior = behaviorOperation(context).which(operation);
43511
43512       return operation;
43513   }
43514
43515   function operationContinue(selectedIDs, context) {
43516       var graph = context.graph(),
43517           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
43518           geometries = assignIn({ line: [], vertex: [] },
43519               groupBy(entities, function(entity) { return entity.geometry(graph); })),
43520           vertex = geometries.vertex[0];
43521
43522
43523       function candidateWays() {
43524           return graph.parentWays(vertex).filter(function(parent) {
43525               return parent.geometry(graph) === 'line' &&
43526                   !parent.isClosed() &&
43527                   parent.affix(vertex.id) &&
43528                   (geometries.line.length === 0 || geometries.line[0] === parent);
43529           });
43530       }
43531
43532
43533       var operation = function() {
43534           var candidate = candidateWays()[0];
43535           context.enter(
43536               modeDrawLine(context, candidate.id, context.graph(), context.graph(), candidate.affix(vertex.id), true)
43537           );
43538       };
43539
43540
43541       operation.available = function() {
43542           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
43543               !context.features().hasHiddenConnections(vertex, context.graph());
43544       };
43545
43546
43547       operation.disabled = function() {
43548           var candidates = candidateWays();
43549           if (candidates.length === 0)
43550               return 'not_eligible';
43551           if (candidates.length > 1)
43552               return 'multiple';
43553       };
43554
43555
43556       operation.tooltip = function() {
43557           var disable = operation.disabled();
43558           return disable ?
43559               t('operations.continue.' + disable) :
43560               t('operations.continue.description');
43561       };
43562
43563
43564       operation.annotation = function() {
43565           return t('operations.continue.annotation.line');
43566       };
43567
43568
43569       operation.id = 'continue';
43570       operation.keys = [t('operations.continue.key')];
43571       operation.title = t('operations.continue.title');
43572       operation.behavior = behaviorOperation(context).which(operation);
43573
43574       return operation;
43575   }
43576
43577   function operationDelete(selectedIDs, context) {
43578       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
43579           action = actionDeleteMultiple(selectedIDs),
43580           extent = selectedIDs.reduce(function(extent, id) {
43581                   return extent.extend(context.entity(id).extent(context.graph()));
43582               }, geoExtent());
43583
43584
43585       var operation = function() {
43586           var nextSelectedID;
43587           var nextSelectedLoc;
43588
43589           if (selectedIDs.length === 1) {
43590               var id = selectedIDs[0],
43591                   entity = context.entity(id),
43592                   geometry = context.geometry(id),
43593                   parents = context.graph().parentWays(entity),
43594                   parent = parents[0];
43595
43596               // Select the next closest node in the way.
43597               if (geometry === 'vertex') {
43598                   var nodes = parent.nodes,
43599                       i = nodes.indexOf(id);
43600
43601                   if (i === 0) {
43602                       i++;
43603                   } else if (i === nodes.length - 1) {
43604                       i--;
43605                   } else {
43606                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
43607                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
43608                       i = a < b ? i - 1 : i + 1;
43609                   }
43610
43611                   nextSelectedID = nodes[i];
43612                   nextSelectedLoc = context.entity(nextSelectedID).loc;
43613               }
43614           }
43615
43616           context.perform(action, operation.annotation());
43617
43618           if (nextSelectedID && nextSelectedLoc) {
43619               if (context.hasEntity(nextSelectedID)) {
43620                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
43621               } else {
43622                   context.map().centerEase(nextSelectedLoc);
43623                   context.enter(modeBrowse(context));
43624               }
43625           } else {
43626               context.enter(modeBrowse(context));
43627           }
43628
43629       };
43630
43631
43632       operation.available = function() {
43633           return true;
43634       };
43635
43636
43637       operation.disabled = function() {
43638           var reason;
43639           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43640               reason = 'too_large';
43641           } else if (some(selectedIDs, context.hasHiddenConnections)) {
43642               reason = 'connected_to_hidden';
43643           } else if (some(selectedIDs, protectedMember)) {
43644               reason = 'part_of_relation';
43645           } else if (some(selectedIDs, incompleteRelation)) {
43646               reason = 'incomplete_relation';
43647           }
43648           return reason;
43649
43650           function incompleteRelation(id) {
43651               var entity = context.entity(id);
43652               return entity.type === 'relation' && !entity.isComplete(context.graph());
43653           }
43654
43655           function protectedMember(id) {
43656               var entity = context.entity(id);
43657               if (entity.type !== 'way') return false;
43658
43659               var parents = context.graph().parentRelations(entity);
43660               for (var i = 0; i < parents.length; i++) {
43661                   var parent = parents[i],
43662                       type = parent.tags.type,
43663                       role = parent.memberById(id).role || 'outer';
43664                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
43665                       return true;
43666                   }
43667               }
43668               return false;
43669           }
43670
43671       };
43672
43673
43674       operation.tooltip = function() {
43675           var disable = operation.disabled();
43676           return disable ?
43677               t('operations.delete.' + disable + '.' + multi) :
43678               t('operations.delete.description' + '.' + multi);
43679       };
43680
43681
43682       operation.annotation = function() {
43683           return selectedIDs.length === 1 ?
43684               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
43685               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
43686       };
43687
43688
43689       operation.id = 'delete';
43690       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
43691       operation.title = t('operations.delete.title');
43692       operation.behavior = behaviorOperation(context).which(operation);
43693
43694       return operation;
43695   }
43696
43697   function operationDisconnect(selectedIDs, context) {
43698       var vertices = filter(selectedIDs, function(entityId) {
43699           return context.geometry(entityId) === 'vertex';
43700       });
43701
43702       var entityId = vertices[0],
43703           action = actionDisconnect(entityId);
43704
43705       if (selectedIDs.length > 1) {
43706           action.limitWays(without(selectedIDs, entityId));
43707       }
43708
43709
43710       var operation = function() {
43711           context.perform(action, operation.annotation());
43712       };
43713
43714
43715       operation.available = function() {
43716           return vertices.length === 1;
43717       };
43718
43719
43720       operation.disabled = function() {
43721           var reason;
43722           if (some(selectedIDs, context.hasHiddenConnections)) {
43723               reason = 'connected_to_hidden';
43724           }
43725           return action.disabled(context.graph()) || reason;
43726       };
43727
43728
43729       operation.tooltip = function() {
43730           var disable = operation.disabled();
43731           return disable ?
43732               t('operations.disconnect.' + disable) :
43733               t('operations.disconnect.description');
43734       };
43735
43736
43737       operation.annotation = function() {
43738           return t('operations.disconnect.annotation');
43739       };
43740
43741
43742       operation.id = 'disconnect';
43743       operation.keys = [t('operations.disconnect.key')];
43744       operation.title = t('operations.disconnect.title');
43745       operation.behavior = behaviorOperation(context).which(operation);
43746
43747       return operation;
43748   }
43749
43750   function operationMerge(selectedIDs, context) {
43751
43752       function updatePresetTags(newGraph, ids) {
43753           var id = ids[0];
43754           var newEntity = newGraph.hasEntity(id);
43755
43756           if (!newEntity) return;
43757           var newPreset = context.presets().match(newEntity, newGraph);
43758           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
43759       }
43760
43761
43762       var join = actionJoin(selectedIDs);
43763       var merge = actionMerge(selectedIDs);
43764       var mergePolygon = actionMergePolygon(selectedIDs);
43765       var mergeNodes = actionMergeNodes(selectedIDs);
43766
43767
43768       var operation = function() {
43769           var doUpdateTags;
43770           var action;
43771
43772           if (!join.disabled(context.graph())) {
43773               doUpdateTags = false;
43774               action = join;
43775           } else if (!merge.disabled(context.graph())) {
43776               doUpdateTags = true;
43777               action = merge;
43778           } else if (!mergePolygon.disabled(context.graph())) {
43779               doUpdateTags = false;
43780               action = mergePolygon;
43781           } else {
43782               doUpdateTags = true;
43783               action = mergeNodes;
43784           }
43785
43786           context.perform(action, operation.annotation());
43787
43788           var ids = selectedIDs.filter(function(id) {
43789               var entity = context.hasEntity(id);
43790               return entity && entity.type !== 'node';
43791           });
43792
43793           // if we merged tags, rematch preset to update tags if necessary (#3851)
43794           if (doUpdateTags) {
43795               updatePresetTags(context.graph(), ids);
43796           }
43797
43798           context.enter(modeSelect(context, ids));
43799       };
43800
43801
43802       operation.available = function() {
43803           return selectedIDs.length >= 2;
43804       };
43805
43806
43807       operation.disabled = function() {
43808           return join.disabled(context.graph()) &&
43809               merge.disabled(context.graph()) &&
43810               mergePolygon.disabled(context.graph()) &&
43811               mergeNodes.disabled(context.graph());
43812       };
43813
43814
43815       operation.tooltip = function() {
43816           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
43817           var m = merge.disabled(context.graph());         // 'not_eligible'
43818           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
43819           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
43820
43821           // disabled for one of various reasons
43822           if (j && m && p && n) {
43823               if (j === 'restriction' || n === 'restriction') {
43824                   return t('operations.merge.restriction',
43825                       { relation: context.presets().item('type/restriction').name() });
43826
43827               } else if (p === 'incomplete_relation') {
43828                   return t('operations.merge.incomplete_relation');
43829
43830               } else if (n === 'relation') {
43831                   return t('operations.merge.relation');
43832
43833               } else {
43834                   return t('operations.merge.' + j);
43835               }
43836
43837           } else {
43838               return t('operations.merge.description');
43839           }
43840       };
43841
43842
43843       operation.annotation = function() {
43844           return t('operations.merge.annotation', { n: selectedIDs.length });
43845       };
43846
43847
43848       operation.id = 'merge';
43849       operation.keys = [t('operations.merge.key')];
43850       operation.title = t('operations.merge.title');
43851       operation.behavior = behaviorOperation(context).which(operation);
43852
43853       return operation;
43854   }
43855
43856   function operationMove(selectedIDs, context) {
43857       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
43858       var extent = selectedIDs.reduce(function(extent, id) {
43859           return extent.extend(context.entity(id).extent(context.graph()));
43860       }, geoExtent());
43861
43862
43863       var operation = function() {
43864           context.enter(modeMove(context, selectedIDs));
43865       };
43866
43867
43868       operation.available = function() {
43869           return selectedIDs.length > 1 ||
43870               context.entity(selectedIDs[0]).type !== 'node';
43871       };
43872
43873
43874       operation.disabled = function() {
43875           var reason;
43876           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
43877               reason = 'too_large';
43878           } else if (some(selectedIDs, context.hasHiddenConnections)) {
43879               reason = 'connected_to_hidden';
43880           } else if (some(selectedIDs, incompleteRelation)) {
43881               reason = 'incomplete_relation';
43882           }
43883           return reason;
43884
43885           function incompleteRelation(id) {
43886               var entity = context.entity(id);
43887               return entity.type === 'relation' && !entity.isComplete(context.graph());
43888           }
43889       };
43890
43891
43892       operation.tooltip = function() {
43893           var disable = operation.disabled();
43894           return disable ?
43895               t('operations.move.' + disable + '.' + multi) :
43896               t('operations.move.description.' + multi);
43897       };
43898
43899
43900       operation.annotation = function() {
43901           return selectedIDs.length === 1 ?
43902               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
43903               t('operations.move.annotation.multiple');
43904       };
43905
43906
43907       operation.id = 'move';
43908       operation.keys = [t('operations.move.key')];
43909       operation.title = t('operations.move.title');
43910       operation.behavior = behaviorOperation(context).which(operation);
43911
43912       return operation;
43913   }
43914
43915   function operationOrthogonalize(selectedIDs, context) {
43916       var entityId = selectedIDs[0],
43917           entity = context.entity(entityId),
43918           extent = entity.extent(context.graph()),
43919           geometry = context.geometry(entityId),
43920           action = actionOrthogonalize(entityId, context.projection);
43921
43922
43923       var operation = function() {
43924           context.perform(action, operation.annotation());
43925       };
43926
43927
43928       operation.available = function() {
43929           return selectedIDs.length === 1 &&
43930               entity.type === 'way' &&
43931               entity.isClosed() &&
43932               uniq(entity.nodes).length > 2;
43933       };
43934
43935
43936       operation.disabled = function() {
43937           var reason;
43938           if (extent.percentContainedIn(context.extent()) < 0.8) {
43939               reason = 'too_large';
43940           } else if (context.hasHiddenConnections(entityId)) {
43941               reason = 'connected_to_hidden';
43942           }
43943           return action.disabled(context.graph()) || reason;
43944       };
43945
43946
43947       operation.tooltip = function() {
43948           var disable = operation.disabled();
43949           return disable ?
43950               t('operations.orthogonalize.' + disable) :
43951               t('operations.orthogonalize.description.' + geometry);
43952       };
43953
43954
43955       operation.annotation = function() {
43956           return t('operations.orthogonalize.annotation.' + geometry);
43957       };
43958
43959
43960       operation.id = 'orthogonalize';
43961       operation.keys = [t('operations.orthogonalize.key')];
43962       operation.title = t('operations.orthogonalize.title');
43963       operation.behavior = behaviorOperation(context).which(operation);
43964
43965       return operation;
43966   }
43967
43968   /**
43969    * This method is like `_.uniq` except that it accepts `iteratee` which is
43970    * invoked for each element in `array` to generate the criterion by which
43971    * uniqueness is computed. The order of result values is determined by the
43972    * order they occur in the array. The iteratee is invoked with one argument:
43973    * (value).
43974    *
43975    * @static
43976    * @memberOf _
43977    * @since 4.0.0
43978    * @category Array
43979    * @param {Array} array The array to inspect.
43980    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
43981    * @returns {Array} Returns the new duplicate free array.
43982    * @example
43983    *
43984    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
43985    * // => [2.1, 1.2]
43986    *
43987    * // The `_.property` iteratee shorthand.
43988    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
43989    * // => [{ 'x': 1 }, { 'x': 2 }]
43990    */
43991   function uniqBy(array, iteratee) {
43992     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
43993   }
43994
43995   function operationReflectShort(selectedIDs, context) {
43996       return operationReflect(selectedIDs, context, 'short');
43997   }
43998
43999
44000   function operationReflectLong(selectedIDs, context) {
44001       return operationReflect(selectedIDs, context, 'long');
44002   }
44003
44004
44005   function operationReflect(selectedIDs, context, axis) {
44006       axis = axis || 'long';
44007       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
44008           extent = selectedIDs.reduce(function(extent, id) {
44009               return extent.extend(context.entity(id).extent(context.graph()));
44010           }, geoExtent());
44011
44012
44013       var operation = function() {
44014           var action = actionReflect(selectedIDs, context.projection)
44015               .useLongAxis(Boolean(axis === 'long'));
44016           context.perform(action, operation.annotation());
44017       };
44018
44019
44020       operation.available = function() {
44021           var nodes = utilGetAllNodes(selectedIDs, context.graph());
44022           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
44023       };
44024
44025
44026       operation.disabled = function() {
44027           var reason;
44028           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
44029               reason = 'too_large';
44030           } else if (some(selectedIDs, context.hasHiddenConnections)) {
44031               reason = 'connected_to_hidden';
44032           } else if (some(selectedIDs, incompleteRelation)) {
44033               reason = 'incomplete_relation';
44034           }
44035           return reason;
44036
44037           function incompleteRelation(id) {
44038               var entity = context.entity(id);
44039               return entity.type === 'relation' && !entity.isComplete(context.graph());
44040           }
44041       };
44042
44043
44044       operation.tooltip = function() {
44045           var disable = operation.disabled();
44046           return disable ?
44047               t('operations.reflect.' + disable + '.' + multi) :
44048               t('operations.reflect.description.' + axis + '.' + multi);
44049       };
44050
44051
44052       operation.annotation = function() {
44053           return t('operations.reflect.annotation.' + axis + '.' + multi);
44054       };
44055
44056
44057       operation.id = 'reflect-' + axis;
44058       operation.keys = [t('operations.reflect.key.' + axis)];
44059       operation.title = t('operations.reflect.title.' + axis);
44060       operation.behavior = behaviorOperation(context).which(operation);
44061
44062       return operation;
44063   }
44064
44065   function operationReverse(selectedIDs, context) {
44066       var entityId = selectedIDs[0];
44067
44068       var operation = function() {
44069           context.perform(actionReverse(entityId), operation.annotation());
44070       };
44071
44072
44073       operation.available = function() {
44074           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
44075       };
44076
44077
44078       operation.disabled = function() {
44079           return false;
44080       };
44081
44082
44083       operation.tooltip = function() {
44084           return t('operations.reverse.description');
44085       };
44086
44087
44088       operation.annotation = function() {
44089           return t('operations.reverse.annotation');
44090       };
44091
44092
44093       operation.id = 'reverse';
44094       operation.keys = [t('operations.reverse.key')];
44095       operation.title = t('operations.reverse.title');
44096       operation.behavior = behaviorOperation(context).which(operation);
44097
44098       return operation;
44099   }
44100
44101   function operationRotate(selectedIDs, context) {
44102       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
44103           extent = selectedIDs.reduce(function(extent, id) {
44104               return extent.extend(context.entity(id).extent(context.graph()));
44105           }, geoExtent());
44106
44107
44108       var operation = function() {
44109           context.enter(modeRotate(context, selectedIDs));
44110       };
44111
44112
44113       operation.available = function() {
44114           var nodes = utilGetAllNodes(selectedIDs, context.graph());
44115           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
44116       };
44117
44118
44119       operation.disabled = function() {
44120           var reason;
44121           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
44122               reason = 'too_large';
44123           } else if (some(selectedIDs, context.hasHiddenConnections)) {
44124               reason = 'connected_to_hidden';
44125           } else if (some(selectedIDs, incompleteRelation)) {
44126               reason = 'incomplete_relation';
44127           }
44128           return reason;
44129
44130           function incompleteRelation(id) {
44131               var entity = context.entity(id);
44132               return entity.type === 'relation' && !entity.isComplete(context.graph());
44133           }
44134       };
44135
44136
44137       operation.tooltip = function() {
44138           var disable = operation.disabled();
44139           return disable ?
44140               t('operations.rotate.' + disable + '.' + multi) :
44141               t('operations.rotate.description.' + multi);
44142       };
44143
44144
44145       operation.annotation = function() {
44146           return selectedIDs.length === 1 ?
44147               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
44148               t('operations.rotate.annotation.multiple');
44149       };
44150
44151
44152       operation.id = 'rotate';
44153       operation.keys = [t('operations.rotate.key')];
44154       operation.title = t('operations.rotate.title');
44155       operation.behavior = behaviorOperation(context).which(operation);
44156
44157       return operation;
44158   }
44159
44160   function operationSplit(selectedIDs, context) {
44161       var vertices = filter(selectedIDs, function(entityId) {
44162           return context.geometry(entityId) === 'vertex';
44163       });
44164
44165       var entityId = vertices[0],
44166           action = actionSplit(entityId),
44167           ways = [];
44168
44169       if (vertices.length === 1) {
44170           if (selectedIDs.length > 1) {
44171               action.limitWays(without(selectedIDs, entityId));
44172           }
44173           ways = action.ways(context.graph());
44174       }
44175
44176
44177       var operation = function() {
44178           var difference = context.perform(action, operation.annotation());
44179           context.enter(modeSelect(context, difference.extantIDs()));
44180       };
44181
44182
44183       operation.available = function() {
44184           return vertices.length === 1;
44185       };
44186
44187
44188       operation.disabled = function() {
44189           var reason;
44190           if (some(selectedIDs, context.hasHiddenConnections)) {
44191               reason = 'connected_to_hidden';
44192           }
44193           return action.disabled(context.graph()) || reason;
44194       };
44195
44196
44197       operation.tooltip = function() {
44198           var disable = operation.disabled();
44199           if (disable) {
44200               return t('operations.split.' + disable);
44201           }
44202           if (ways.length === 1) {
44203               return t('operations.split.description.' + context.geometry(ways[0].id));
44204           } else {
44205               return t('operations.split.description.multiple');
44206           }
44207       };
44208
44209
44210       operation.annotation = function() {
44211           return ways.length === 1 ?
44212               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
44213               t('operations.split.annotation.multiple', { n: ways.length });
44214       };
44215
44216
44217       operation.id = 'split';
44218       operation.keys = [t('operations.split.key')];
44219       operation.title = t('operations.split.title');
44220       operation.behavior = behaviorOperation(context).which(operation);
44221
44222       return operation;
44223   }
44224
44225   function operationStraighten(selectedIDs, context) {
44226       var entityId = selectedIDs[0],
44227           action = actionStraighten(entityId, context.projection);
44228
44229
44230       function operation() {
44231           context.perform(action, operation.annotation());
44232       }
44233
44234
44235       operation.available = function() {
44236           var entity = context.entity(entityId);
44237           return selectedIDs.length === 1 &&
44238               entity.type === 'way' &&
44239               !entity.isClosed() &&
44240               uniq(entity.nodes).length > 2;
44241       };
44242
44243
44244       operation.disabled = function() {
44245           var reason;
44246           if (context.hasHiddenConnections(entityId)) {
44247               reason = 'connected_to_hidden';
44248           }
44249           return action.disabled(context.graph()) || reason;
44250       };
44251
44252
44253       operation.tooltip = function() {
44254           var disable = operation.disabled();
44255           return disable ?
44256               t('operations.straighten.' + disable) :
44257               t('operations.straighten.description');
44258       };
44259
44260
44261       operation.annotation = function() {
44262           return t('operations.straighten.annotation');
44263       };
44264
44265
44266       operation.id = 'straighten';
44267       operation.keys = [t('operations.straighten.key')];
44268       operation.title = t('operations.straighten.title');
44269       operation.behavior = behaviorOperation(context).which(operation);
44270
44271       return operation;
44272   }
44273
44274   function operationDetachNode(selectedIDs, context) {
44275       var nodeID = selectedIDs.length && selectedIDs[0];
44276       var action = actionDetachNode(nodeID);
44277
44278       var operation = function () {
44279           context.perform(action);  // do the detach
44280
44281           var mouse = context.map().mouseCoordinates();
44282           if (mouse.some(isNaN)) {
44283               enterMoveMode();
44284
44285           } else {
44286               // move detached node to the mouse location (transitioned)
44287               context.perform(actionMoveNode(nodeID, mouse));
44288
44289               // after transition completes, put at final mouse location and enter move mode.
44290               window.setTimeout(function() {
44291                   mouse = context.map().mouseCoordinates();
44292                   context.replace(actionMoveNode(nodeID, mouse));
44293                   enterMoveMode();
44294               }, 150);
44295           }
44296
44297           function enterMoveMode() {
44298               var baseGraph = context.graph();
44299               context.enter(modeMove(context, [nodeID], baseGraph));
44300           }
44301       };
44302
44303
44304       operation.available = function () {
44305           if (selectedIDs.length !== 1) return false;
44306
44307           var graph = context.graph();
44308           var entity = graph.hasEntity(nodeID);
44309           if (!entity) return false;
44310
44311           return entity.type === 'node' &&
44312               entity.hasInterestingTags() &&
44313               graph.parentWays(entity).length > 0;
44314       };
44315
44316
44317       operation.disabled = function () {
44318           var reason;
44319           if (some(selectedIDs, context.hasHiddenConnections)) {
44320               reason = 'connected_to_hidden';
44321           }
44322           return action.disabled(context.graph()) || reason;
44323       };
44324
44325
44326       operation.tooltip = function () {
44327           var disableReason = operation.disabled();
44328           if (disableReason) {
44329               return t('operations.detach_node.' + disableReason,
44330                   { relation: context.presets().item('type/restriction').name() });
44331           } else {
44332               return t('operations.detach_node.description');
44333           }
44334       };
44335
44336
44337       operation.annotation = function () {
44338           return t('operations.detach_node.annotation');
44339       };
44340
44341
44342       operation.id = 'detach-node';
44343       operation.keys = [t('operations.detach_node.key')];
44344       operation.title = t('operations.detach_node.title');
44345       operation.behavior = behaviorOperation(context).which(operation);
44346
44347
44348       return operation;
44349   }
44350
44351
44352
44353   var Operations = /*#__PURE__*/Object.freeze({
44354     operationCircularize: operationCircularize,
44355     operationContinue: operationContinue,
44356     operationDelete: operationDelete,
44357     operationDisconnect: operationDisconnect,
44358     operationMerge: operationMerge,
44359     operationMove: operationMove,
44360     operationOrthogonalize: operationOrthogonalize,
44361     operationReflectShort: operationReflectShort,
44362     operationReflectLong: operationReflectLong,
44363     operationReverse: operationReverse,
44364     operationRotate: operationRotate,
44365     operationSplit: operationSplit,
44366     operationStraighten: operationStraighten,
44367     operationDetachNode: operationDetachNode
44368   });
44369
44370   function validationDisconnectedWay() {
44371       var type = 'disconnected_way';
44372
44373
44374       function isDisconnectedHighway(entity, graph) {
44375           if (!entity.tags.highway ||
44376               entity.tags.highway === 'no' ||
44377               entity.tags.highway === 'proposed') return false;
44378           if (entity.geometry(graph) !== 'line') return false;
44379
44380           return graph.childNodes(entity)
44381               .every(function(vertex) {
44382                   var parents = graph.parentWays(vertex);
44383                   if (parents.length === 1) {  // standalone vertex
44384                       return true;
44385                   } else {                     // shared vertex
44386                       return !vertex.tags.entrance &&
44387                           parents.filter(function(parent) {
44388                               return parent.tags.highway && parent !== entity;
44389                           }).length === 0;
44390                   }
44391               });
44392       }
44393
44394
44395       var validation = function(entity, context) {
44396           var issues = [];
44397           var graph = context.graph();
44398
44399           if (isDisconnectedHighway(entity, graph)) {
44400               var entityLabel = utilDisplayLabel(entity, context);
44401               var fixes = [];
44402
44403               if (!entity.isClosed()) {
44404                   var first = context.entity(entity.first());
44405                   if (first.tags.noexit !== 'yes') {
44406                       fixes.push(new validationIssueFix({
44407                           icon: 'iD-operation-continue-left',
44408                           title: t('issues.fix.continue_from_start.title'),
44409                           entityIds: [entity.first()],
44410                           onClick: function() {
44411                               var vertex = context.entity(entity.first());
44412                               continueDrawing(entity, vertex, context);
44413                           }
44414                       }));
44415                   }
44416                   var last = context.entity(entity.last());
44417                   if (last.tags.noexit !== 'yes') {
44418                       fixes.push(new validationIssueFix({
44419                           icon: 'iD-operation-continue',
44420                           title: t('issues.fix.continue_from_end.title'),
44421                           entityIds: [entity.last()],
44422                           onClick: function() {
44423                               var vertex = context.entity(entity.last());
44424                               continueDrawing(entity, vertex, context);
44425                           }
44426                       }));
44427                   }
44428               }
44429
44430               fixes.push(new validationIssueFix({
44431                   icon: 'iD-operation-delete',
44432                   title: t('issues.fix.delete_feature.title'),
44433                   entityIds: [entity.id],
44434                   onClick: function() {
44435                       var id = this.issue.entities[0].id;
44436                       operationDelete([id], context)();
44437                   }
44438               }));
44439
44440               issues.push(new validationIssue({
44441                   type: type,
44442                   severity: 'warning',
44443                   message: t('issues.disconnected_way.highway.message', { highway: entityLabel }),
44444                   tooltip: t('issues.disconnected_way.highway.tip'),
44445                   entities: [entity],
44446                   fixes: fixes
44447               }));
44448           }
44449
44450           return issues;
44451
44452
44453           function continueDrawing(way, vertex) {
44454               // make sure the vertex is actually visible and editable
44455               var map = context.map();
44456               if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
44457                   map.zoomToEase(vertex);
44458               }
44459
44460               context.enter(
44461                   modeDrawLine(context, way.id, context.graph(), context.graph(), way.affix(vertex.id), true)
44462               );
44463           }
44464       };
44465
44466
44467       validation.type = type;
44468
44469       return validation;
44470   }
44471
44472   var discardNames = ["\\(historical\\)","^[0-9]+$","^agencja pocztowa$","^änderungsschneiderei$","^apotek(a|et)$","^(adler|bahnhof|brunnen|burg|bären|engel|hirsch|hubertus|kur|linden|löwen)(-| )?apotheke$","^(marien|markt|neue|park|rathaus|rats|rosen|schloss|sonnen|stadt|stern)(-| )?apotheke$","^alte (apotheke|post)$","^apotheke(\\sam\\smarkt)?$","^apteka$","^аптека","^atelier de couture$","^atm$","^auto serwis$","^bank(| spółdzielczy)$","^bar$","^bar (centrale|kafe)$","^bazar$","^bäckerei$","^baguette$","^bakery$","^(the )?barber(ia|shop|\\sshop)?$","^berber$","^biletomat$","^bike sharing$","^bistro$","^blumen(laden)?$","^bodega$","^borracharia$","^bo(u)?tique$","^boucherie(\\scharcuterie)?$","^boulangerie(\\sp(a|â)tisserie)?$","^bread$","^briefkasten$","^budget inn$","^(bureau de |)change$","^bureau de poste$","^büfé$","^caf(e|é)(t(e|é)r(i|í)a)?( )?(central)?$","^caf(e|é) de(s)? (la )?(place|sports|gare)$","^carnicer(i|í)a$","^central$","^centro naturista$","^cine(ma)?$","^cleaners$","^coiff(eur|ure)$","^coffee$","^colmado$","^commercial hotel$","^correos$","^currency exchange$","^co-operative$","^d(ö|o)ner(\\skebab)?$","^drinks$","^droguer(i|í)a$","^eczane$","^el árbol$","^estanco$","^eisdiele","^eiscaf(e|é)(\\s(dolomiti|venezia))?$","^exchange$","^euroshop$","^élelmiszer$","^élelmiszerbolt$","^farm(a|à|á)ci(a|à|á|e)$","^fagyizó$","^fast food$","^fish (and|&) chips$","^fleuriste$","^florărie$","^food court$","^fotocopias$","^fris(eu|ö)r$","^fri(t|z)erie$","^frituur$","^fryzjer$","^frutería$","^funeraria$","^ferreter(i|í)a$","^game$","^garage$","^gasoline(ra)?$","^gast(haus|hof)\\s(krone|(zur)\\s(linde|post))?$","^getränkemarkt$","^gimnasio$","^gomer(i|í)a$","^gym(nase|nasium)?$","^gyógyszertár$","^haar(genau|monie|scharf)$","^hair\\s(design|lounge|salon)$","^hardware$","^(hof|dorf)laden$","^hospedaje$","^(h|m)otel$","^h(o|ô)tel\\s(astoria|central|europa|krone|panorama|plaza|royal|victoria|(zur\\s)?post|de france)$","^(central|city|europa|grand|palace|park|royal)(\\s)?hotel$","^húsbolt$","^indipend\\.$","^((drummed|independent)\\s)?(cng|filling|fuel|gas|lpg|petrol)(\\s(station|pump))?$","^istanbul(\\skebab)?$","^imbiss$","^internet cafe$","^kaf(e|é)$","^kios(co|k|ko|que)?$","^kantine$","^kantor$","^kebab(ai|\\shouse)?$","^kitchen$","^kisbolt$","^księgarnia$","^kwiaciarnia$","^ladestation$","^lékárna$","^librer(i|í)a$","^librairie$","^libro$","^ljekarna$","^lombard$","^lot 1$","^lubricentro$","^macelleria$","^mailbox$","^maison$","^magazin","^market$","^máquina de tickets$","^mécanique$","^mercado$","^mini(\\s)?(abc|market|mart|mercado|pump)","municipal","^nails$","^no name$","^obuwie$","^(okręgowa\\s)?stacja kontroli pojazdów$","^oplaadpunt$","^opti(c|k)a$","^optical center$","^outlet$","^padaria$","^panader(i|í)a$","^pancake house$","^panificio$","^panorama$","^papeler(i|í)a$","^pa(r|cz)komat$","^parafarmacia$","^parkscheinautomat$","^parquímetro$","^peluquer(i|í)a$","^pharmac(ie|y)$","^pho$","^piekarnia$","^pizz(eri)?a$","^piscine$","^poczta$","^po(s|š)t(a|e|o)$","^post(\\s)?(agentur|filiale|partner|office|stelle)?$","^punkt apteczny$","^pressing$","^rent a car$","^restaurant(e)?(\\suniversitário)?$","^rzeźnik$","^salle (omnisport|polyvalente)$","^(the\\s)?salo(o)?n( de coiffure| fryzjerski)?$","^second\\shand$","^shop$","^(coffee|pet|vulcanizing|gift)(\\sshop)?$","^sklep$","^(sklep\\s)?(spożywcz(y|o))(-przemysłowy)?$","^snack$","^souvenirs$","^stacja (benzynowa|paliw)$","^stadium$","^station service$","^steak house$","^stores?$","^(beer|convenience|corner|general|liquor|variety)(\\sstore)?$","^stromtankstelle$","^super ?america","^superm(arket|ercado)$","^sushi(\\s(bar|shop))?$","^tabaccher(i|í)a$","^taba(c|k)(os|chi)?(\\strafi(k|c))?$","^tacos$","^tankstelle$","^tattoo$","^taverna$","^tea stall$","^tienda(\\sde\\s(barrio|abarrotes))?$","^tokyo$","^trattoria$","^trafik(a)?$","^trinkhalle$","^ufficio postale$","^urząd pocztowy$","^vegyesbolt$","^venezia$","^večerka$","^virágbolt$","^vision\\splus$","^(clinica\\s)?veterinari(a|o)$","^(clinique\\s)?vétérinaire$","^warung$","^warzywniak$","^windmill$","^wok$","^wulkanizacja$","^zigarettenautomat$","^zöldséges$","^авто(рынок|ремонт|сервис|электрик|запчасти(ни)?)?$","^автома(г|газин|стерская)?$","^ателье$","^бистро$","^буфет$","^бассейн$","^ветеринарная клиника$","^ветлечебница$","^вулканизация$","^газ$","^газовая заправка$","^гостиница$","^главпочтамт$","^детский дом$","^ломбард$","^закусочная$","замена масла","^золото(й)?$","^зоо(магазин|товары)$","^канцтовары$","^касса$","^(летнее\\s)?кафе(терий)?$","^кофе(йня|\\sхауз)$","^книги$","^киоск$","^мебель$","^меблі$","^мороженое$","^оптика$","^овощи(\\sи\\s|-)фрукты$","^(спец|детская|женская)?(\\s)?одежда$","^(парикмахерская|персона|перукарня)$","^Пиццерия$","^почта$","^почтовое отделение$","^подарки$","^пресса$","^(Проездные\\s)?билет(ы)?$","^продукт(ы|и)?$","^промтовары$","^ресторан$","^ремонт\\sобуви$","^рыб(a|олов)$","^ритуал(ьные услуги)?$","^салон красоты$","^сувениры$","^супермаркет$","^столовая$","^стройматериалы$","^социальный участковый$","^спорт(зал|комплекс)$","^табак(ерка)?$","^товары для дома$","^Уют$","^универ(маг|сам)$","^φαρμακείο$","^фармация$","^химчистка$","^хоз(товары|яюшка)$","шиномонтаж","^ша(ве|у)рма$","^نانوایی$","^نانوایی بربری$","^حلاق$","^مخبز(ة)?$","^مقهى$","^محط(ه|ة) وقود$","^میوه فروشی$","^داروخانه$","^بانک$","^بقال(ة)?$","^پمپ (بنزین|گاز)$","^سوپر\\s?مارکت$","^صيدلية$","^اداره پست$","^رستوران$","^مطعم$","^მარკეტი\\s\\(Market\\)","^דלק$","^カフェ$","^ポスト$","^珈琲館$","^加油站$","^郵局$","^食堂$","^(自動販売機|自販機)$","^体育館$"];
44473
44474   function validationGenericName() {
44475       var type = 'generic_name';
44476
44477       // known list of generic names (e.g. "bar")
44478       var discardNamesRegexes = discardNames.map(function(discardName) {
44479           return new RegExp(discardName, 'i');
44480       });
44481
44482       var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
44483
44484       function isGenericName(entity) {
44485           var name = entity.tags.name;
44486           if (!name) return false;
44487           name = name.toLowerCase();
44488
44489           var i, key, val;
44490
44491           // test if the name is just the key or tag value (e.g. "park")
44492           for (i = 0; i < keysToTestForGenericValues.length; i++) {
44493               key = keysToTestForGenericValues[i];
44494               val = entity.tags[key];
44495               if (val) {
44496                   val = val.toLowerCase();
44497                   if (key === name ||
44498                       val === name ||
44499                       key.replace(/\_/g, ' ') === name ||
44500                       val.replace(/\_/g, ' ') === name) {
44501                       return entity.tags.name;
44502                   }
44503               }
44504           }
44505
44506           // test if the name is otherwise generic
44507           for (i = 0; i < discardNamesRegexes.length; i++) {
44508               if (discardNamesRegexes[i].test(name)) {
44509                   return entity.tags.name;
44510               }
44511           }
44512
44513           return false;
44514       }
44515
44516
44517       var validation = function(entity, context) {
44518           var issues = [];
44519           var generic = isGenericName(entity);
44520           if (generic) {
44521               var preset = utilPreset(entity, context);
44522               issues.push(new validationIssue({
44523                   type: type,
44524                   severity: 'warning',
44525                   message: t('issues.generic_name.message', {feature: preset.name(), name: generic}),
44526                   tooltip: t('issues.generic_name.tip'),
44527                   entities: [entity],
44528                   fixes: [
44529                       new validationIssueFix({
44530                           icon: 'iD-operation-delete',
44531                           title: t('issues.fix.remove_generic_name.title'),
44532                           onClick: function() {
44533                               var entity = this.issue.entities[0];
44534                               var tags = clone(entity.tags);
44535                               delete tags.name;
44536                               context.perform(
44537                                   actionChangeTags(entity.id, tags),
44538                                   t('issues.fix.remove_generic_name.annotation')
44539                               );
44540                           }
44541                       })
44542                   ]
44543               }));
44544           }
44545
44546           return issues;
44547       };
44548
44549       validation.type = type;
44550
44551       return validation;
44552   }
44553
44554   function validationManyDeletions() {
44555       var totalOtherGeomThreshold = 50;
44556       var relationThreshold = 10;   // relations are less common so use a lower threshold
44557
44558       var type = 'many_deletions';
44559
44560       var validation = function(changes, context) {
44561           var issues = [];
44562           var points = 0, lines = 0, areas = 0, relations = 0;
44563           var base = context.history().base();
44564           var geometry;
44565
44566           changes.deleted.forEach(function(entity) {
44567               if (entity.type === 'node' && entity.geometry(base) === 'point') {
44568                   points++;
44569               } else if (entity.type === 'way') {
44570                   geometry = entity.geometry(base);
44571                   if (geometry === 'line') {
44572                       lines++;
44573                   } else if (geometry === 'area') {
44574                        areas++;
44575                   }
44576               } else if (entity.type === 'relation') {
44577                   relations++;
44578               }
44579           });
44580
44581           if (points + lines + areas >= totalOtherGeomThreshold || relations >= relationThreshold) {
44582               var totalFeatures = points + lines + areas + relations;
44583
44584               var messageType = 'points-lines-areas';
44585               if (relations > 0) {
44586                   messageType += '-relations';
44587               }
44588               issues.push(new validationIssue({
44589                   type: type,
44590                   severity: 'warning',
44591                   message: t(
44592                       'issues.many_deletions.'+messageType+'.message',
44593                       { n: totalFeatures, p: points, l: lines, a:areas, r: relations }
44594                   ),
44595                   tooltip: t('issues.many_deletions.tip'),
44596                   hash: [points, lines, areas, relations].join()
44597               }));
44598           }
44599
44600           return issues;
44601       };
44602
44603       validation.type = type;
44604       validation.inputType = 'changes';
44605
44606       return validation;
44607   }
44608
44609   function validationMaprules() {
44610       var type = 'maprules';
44611
44612
44613       var validation = function(entity, context) {
44614           if (!services.maprules) return [];
44615
44616           var graph = context.graph();
44617
44618           var rules = services.maprules.validationRules();
44619           var issues = [];
44620
44621           for (var i = 0; i < rules.length; i++) {
44622               var rule = rules[i];
44623               rule.findIssues(entity, graph, issues);
44624           }
44625
44626           return issues;
44627       };
44628
44629
44630       validation.type = type;
44631
44632
44633       return validation;
44634   }
44635
44636   function validationMissingRole() {
44637       var type = 'missing_role';
44638
44639       var validation = function(entity, context) {
44640
44641           var issues = [];
44642           if (entity.type === 'way') {
44643               context.graph().parentRelations(entity).forEach(function(relation) {
44644                   if (!relation.isMultipolygon()) {
44645                       return;
44646                   }
44647                   var member = relation.memberById(entity.id);
44648                   if (member && isMissingRole(member)) {
44649                       issues.push(makeIssue(entity, relation, member, context));
44650                   }
44651               });
44652           } else if (entity.type === 'relation' && entity.isMultipolygon()) {
44653               entity.indexedMembers().forEach(function(member) {
44654                   var way = context.hasEntity(member.id);
44655                   if (way && isMissingRole(member)) {
44656                       issues.push(makeIssue(way, entity, member, context));
44657                   }
44658               });
44659           }
44660
44661           return issues;
44662       };
44663
44664       function isMissingRole(member) {
44665           return !member.role || !member.role.trim().length;
44666       }
44667
44668       function makeIssue(way, relation, member, context) {
44669           return new validationIssue({
44670               type: type,
44671               severity: 'warning',
44672               message: t('issues.missing_role.message', {
44673                   member: utilDisplayLabel(way, context),
44674                   relation: utilDisplayLabel(relation, context),
44675               }),
44676               tooltip: t('issues.missing_role.multipolygon.tip'),
44677               entities: [relation, way],
44678               info: {member: member},
44679               fixes: [
44680                   makeAddRoleFix('inner', context),
44681                   makeAddRoleFix('outer', context),
44682                   new validationIssueFix({
44683                       icon: 'iD-operation-delete',
44684                       title: t('issues.fix.remove_from_relation.title'),
44685                       onClick: function() {
44686                           context.perform(
44687                               actionDeleteMember(this.issue.entities[0].id, this.issue.info.member.index),
44688                               t('operations.delete_member.annotation')
44689                           );
44690                       }
44691                   })
44692               ]
44693           });
44694       }
44695
44696       function makeAddRoleFix(role, context) {
44697           return new validationIssueFix({
44698               title: t('issues.fix.set_as_' + role + '.title'),
44699               onClick: function() {
44700                   var oldMember = this.issue.info.member;
44701                   var member = { id: this.issue.entities[1].id, type: oldMember.type, role: role };
44702                   context.perform(
44703                       actionChangeMember(this.issue.entities[0].id, member, oldMember.index),
44704                       t('operations.change_role.annotation')
44705                   );
44706               }
44707           });
44708       }
44709
44710       validation.type = type;
44711
44712       return validation;
44713   }
44714
44715   function validationMissingTag() {
44716       var type = 'missing_tag';
44717
44718
44719       function hasDescriptiveTags(entity) {
44720           var keys = without(Object.keys(entity.tags), 'area', 'name').filter(osmIsInterestingTag);
44721           if (entity.type === 'relation' && keys.length === 1) {
44722               return entity.tags.type !== 'multipolygon';
44723           }
44724           return keys.length > 0;
44725       }
44726
44727
44728       var validation = function(entity, context) {
44729           var graph = context.graph();
44730
44731           // ignore vertex features and relation members
44732           if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
44733               return [];
44734           }
44735
44736           var mode = context.mode();
44737           if (entity.type === 'way' && mode &&
44738               (mode.id === 'draw-area' || (mode.id === 'draw-line' && !mode.isContinuing)) &&
44739               mode.wayID === entity.id) {
44740               // don't flag missing tag issues if drawing a new way
44741               return [];
44742           }
44743
44744           var messageObj = {};
44745           var missingTagType;
44746
44747           if (isEmpty(entity.tags)) {
44748               missingTagType = 'any';
44749           } else if (!hasDescriptiveTags(entity)) {
44750               missingTagType = 'descriptive';
44751           } else if (entity.type === 'relation' && !entity.tags.type) {
44752               missingTagType = 'specific';
44753               messageObj.tag = 'type';
44754           }
44755
44756           if (!missingTagType) {
44757               return [];
44758           }
44759
44760           messageObj.feature = utilDisplayLabel(entity, context);
44761
44762           var issues = [];
44763
44764           var deleteFixOnClick = function() {
44765               var id = this.issue.entities[0].id;
44766               operationDelete([id], context)();
44767           };
44768           var canDelete = true;
44769           
44770           if (entity.type === 'relation' &&
44771               !entity.members.every(function(member) { return context.hasEntity(member.id); })) {
44772               deleteFixOnClick = null;
44773               canDelete = false;
44774           }
44775
44776           issues.push(new validationIssue({
44777               type: type,
44778               // error if created or modified and is deletable, else warning
44779               severity: (!entity.version || entity.v) && canDelete  ? 'error' : 'warning',
44780               message: t('issues.missing_tag.' + missingTagType + '.message', messageObj),
44781               tooltip: t('issues.missing_tag.tip'),
44782               entities: [entity],
44783               fixes: [
44784                   new validationIssueFix({
44785                       icon: 'iD-icon-search',
44786                       title: t('issues.fix.select_preset.title'),
44787                       onClick: function() {
44788                           context.ui().sidebar.showPresetList();
44789                       }
44790                   }),
44791                   new validationIssueFix({
44792                       icon: 'iD-operation-delete',
44793                       title: t('issues.fix.delete_feature.title'),
44794                       onClick: deleteFixOnClick
44795                   })
44796               ]
44797           }));
44798
44799           return issues;
44800       };
44801
44802       validation.type = type;
44803
44804       return validation;
44805   }
44806
44807   function validationOldMultipolygon() {
44808       var type = 'old_multipolygon';
44809
44810
44811       var validation = function(entity, context) {
44812           var issues = [];
44813           var graph = context.graph();
44814
44815           var multipolygon, outerWay;
44816           if (entity.type === 'relation') {
44817               outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
44818               multipolygon = entity;
44819           } else if (entity.type === 'way') {
44820               multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
44821               outerWay = entity;
44822           } else {
44823               return issues;
44824           }
44825
44826           if (multipolygon && outerWay) {
44827               var multipolygonLabel = utilDisplayLabel(multipolygon, context);
44828               issues.push(new validationIssue({
44829                   type: type,
44830                   severity: 'warning',
44831                   message: t('issues.old_multipolygon.message', { multipolygon: multipolygonLabel }),
44832                   tooltip: t('issues.old_multipolygon.tip'),
44833                   entities: [outerWay, multipolygon],
44834                   fixes: [
44835                       new validationIssueFix({
44836                           title: t('issues.fix.move_tags.title'),
44837                           onClick: function() {
44838                               var outerWay = this.issue.entities[0];
44839                               var multipolygon =  this.issue.entities[1];
44840                               context.perform(
44841                                   function(graph) {
44842                                       multipolygon = multipolygon.mergeTags(outerWay.tags);
44843                                       graph = graph.replace(multipolygon);
44844                                       graph = actionChangeTags(outerWay.id, {})(graph);
44845                                       return graph;
44846                                   },
44847                                   t('issues.fix.move_tags.annotation')
44848                               );
44849                           }
44850                       })
44851                   ]
44852               }));
44853           }
44854           return issues;
44855       };
44856
44857       validation.type = type;
44858
44859       return validation;
44860   }
44861
44862   function validationTagSuggestsArea() {
44863       var type = 'tag_suggests_area';
44864
44865
44866       var validation = function(entity, context) {
44867           if (entity.type !== 'way' || entity.isClosed()) return [];
44868
44869           var tagSuggestingArea = entity.tagSuggestingArea();
44870           if (!tagSuggestingArea) {
44871               return [];
44872           }
44873
44874           if (context.presets().matchTags(tagSuggestingArea, 'line') ===
44875               context.presets().matchTags(tagSuggestingArea, 'area')) {
44876               // these tags also allow lines and making this an area wouldn't matter
44877               return [];
44878           }
44879
44880           var tagText = utilTagText({ tags: tagSuggestingArea });
44881           var fixes = [];
44882
44883           var connectEndpointsOnClick;
44884
44885           // must have at least three nodes to close this automatically
44886           if (entity.nodes.length >= 3) {
44887               var nodes = context.graph().childNodes(entity), testNodes;
44888               var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
44889
44890               // if the distance is very small, attempt to merge the endpoints
44891               if (firstToLastDistanceMeters < 0.75) {
44892                   testNodes = clone(nodes);
44893                   testNodes.pop();
44894                   testNodes.push(testNodes[0]);
44895                   // make sure this will not create a self-intersection
44896                   if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
44897                       connectEndpointsOnClick = function() {
44898                           var way = this.issue.entities[0];
44899                           context.perform(
44900                               actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
44901                               t('issues.fix.connect_endpoints.annotation')
44902                           );
44903                       };
44904                   }
44905               }
44906
44907               if (!connectEndpointsOnClick) {
44908                   // if the points were not merged, attempt to close the way
44909                   testNodes = clone(nodes);
44910                   testNodes.push(testNodes[0]);
44911                   // make sure this will not create a self-intersection
44912                   if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
44913                       connectEndpointsOnClick = function() {
44914                           var way = this.issue.entities[0];
44915                           var nodeId = way.nodes[0];
44916                           var index = way.nodes.length;
44917                           context.perform(
44918                               actionAddVertex(way.id, nodeId, index),
44919                               t('issues.fix.connect_endpoints.annotation')
44920                           );
44921                       };
44922                   }
44923               }
44924           }
44925
44926           fixes.push(new validationIssueFix({
44927               title: t('issues.fix.connect_endpoints.title'),
44928               onClick: connectEndpointsOnClick
44929           }));
44930
44931           fixes.push(new validationIssueFix({
44932               icon: 'iD-operation-delete',
44933               title: t('issues.fix.remove_tag.title'),
44934               onClick: function() {
44935                   var entity = this.issue.entities[0];
44936                   var tags = clone(entity.tags);
44937                   for (var key in tagSuggestingArea) {
44938                       delete tags[key];
44939                   }
44940                   context.perform(
44941                       actionChangeTags(entity.id, tags),
44942                       t('issues.fix.remove_tag.annotation')
44943                   );
44944               }
44945           }));
44946
44947           var featureLabel = utilDisplayLabel(entity, context);
44948           return [new validationIssue({
44949               type: type,
44950               severity: 'warning',
44951               message: t('issues.tag_suggests_area.message', { feature: featureLabel, tag: tagText }),
44952               tooltip: t('issues.tag_suggests_area.tip'),
44953               entities: [entity],
44954               fixes: fixes
44955           })];
44956       };
44957
44958       validation.type = type;
44959
44960       return validation;
44961   }
44962
44963
44964
44965   var Validations = /*#__PURE__*/Object.freeze({
44966     validationAlmostJunction: validationAlmostJunction,
44967     validationCrossingWays: validationCrossingWays,
44968     validationDeprecatedTag: validationDeprecatedTag,
44969     validationDisconnectedWay: validationDisconnectedWay,
44970     validationGenericName: validationGenericName,
44971     validationManyDeletions: validationManyDeletions,
44972     validationMaprules: validationMaprules,
44973     validationMissingRole: validationMissingRole,
44974     validationMissingTag: validationMissingTag,
44975     validationOldMultipolygon: validationOldMultipolygon,
44976     validationTagSuggestsArea: validationTagSuggestsArea
44977   });
44978
44979   function coreValidator(context) {
44980       var dispatch$1 = dispatch('reload');
44981       var self = {};
44982       var _issues = [];
44983       var _issuesByEntityID = {};
44984
44985       var _disabledValidations = {};
44986
44987       var validations = filter(Validations, isFunction).reduce(function(obj, validation) {
44988           var func = validation();
44989           obj[func.type] = func;
44990           return obj;
44991       }, {});
44992
44993       var entityValidationIDs = [];
44994       var changesValidationIDs = [];
44995
44996       for (var key in validations) {
44997           var validation = validations[key];
44998           if (validation.inputType && validation.inputType === 'changes') {
44999               changesValidationIDs.push(key);
45000           } else {
45001               entityValidationIDs.push(key);
45002           }
45003       }
45004
45005       var validationIDsToDisplay = Object.keys(validations).filter(function(rule) {
45006           return rule !== 'maprules';
45007       });
45008       validationIDsToDisplay.sort(function(rule1, rule2) {
45009           return t('issues.' + rule1 + '.title') > t('issues.' + rule2 + '.title');
45010       });
45011
45012       //self.featureApplicabilityOptions = ['edited', 'all'];
45013
45014       /*var featureApplicability = context.storage('issue-features') || 'edited';
45015
45016       self.getFeatureApplicability = function() {
45017           return featureApplicability;
45018       };
45019
45020       self.setFeatureApplicability = function(applicability) {
45021           featureApplicability = applicability;
45022           context.storage('issue-features', applicability);
45023       };*/
45024
45025       self.getIssues = function() {
45026           return _issues;
45027       };
45028
45029       self.getWarnings = function() {
45030           return _issues.filter(function(d) { return d.severity === 'warning'; });
45031       };
45032
45033       self.getErrors = function() {
45034           return _issues.filter(function(d) { return d.severity === 'error'; });
45035       };
45036
45037       self.getIssuesForEntityWithID = function(entityID) {
45038           if (!context.hasEntity(entityID)) return [];
45039           var entity = context.entity(entityID);
45040           var key = osmEntity.key(entity);
45041
45042           if (!_issuesByEntityID[key]) {
45043               _issuesByEntityID[key] = validateEntity(entity);
45044           }
45045           return _issuesByEntityID[key];
45046       };
45047
45048       self.getRuleIDs = function(){
45049           return validationIDsToDisplay;
45050       };
45051
45052       self.getDisabledRules = function(){
45053           return _disabledValidations;
45054       };
45055
45056       self.toggleRule = function(ruleID) {
45057           if (_disabledValidations[ruleID]) {
45058               delete _disabledValidations[ruleID];
45059           } else {
45060               _disabledValidations[ruleID] = true;
45061           }
45062           self.validate();
45063       };
45064
45065       function validateEntity(entity) {
45066           var _issues = [];
45067           var ran = {};
45068
45069           // runs validation and appends resulting issues, returning true if validation passed
45070           function runValidation(which) {
45071               if (ran[which]) return true;
45072
45073               if (_disabledValidations[which]) {
45074                   // don't run disabled validations but mark as having run
45075                   ran[which] = true;
45076                   return true;
45077               }
45078
45079               var fn = validations[which];
45080               var typeIssues = fn(entity, context);
45081               _issues = _issues.concat(typeIssues);
45082               ran[which] = true;   // mark this validation as having run
45083               return !typeIssues.length;
45084           }
45085
45086           runValidation('missing_role');
45087           
45088           if (entity.type === 'relation') {
45089               if (!runValidation('old_multipolygon')) {
45090                   // don't flag missing tags if they are on the outer way
45091                   ran.missing_tag = true;
45092               }
45093           }
45094
45095           // other validations require feature to be tagged
45096           if (!runValidation('missing_tag')) return _issues;
45097
45098           if (entity.type === 'way') {
45099               runValidation('crossing_ways');
45100
45101               // only check for disconnected way if no almost junctions
45102               if (runValidation('almost_junction')) {
45103                   runValidation('disconnected_way');
45104               } else {
45105                   ran.disconnected_way = true;
45106               }
45107
45108               runValidation('tag_suggests_area');
45109           }
45110
45111           // run all validations not yet run manually
45112           entityValidationIDs.forEach(runValidation);
45113
45114           return _issues;
45115       }
45116
45117
45118       self.validate = function() {
45119           _issuesByEntityID = {};   // clear cached
45120           _issues = [];
45121
45122           for (var validationIndex in validations) {
45123               if (validations[validationIndex].reset) {
45124                   validations[validationIndex].reset();
45125               }
45126           }
45127
45128           var history = context.history();
45129           var changes = history.changes();
45130           var entitiesToCheck = changes.created.concat(changes.modified);
45131           var graph = history.graph();
45132
45133           _issues = flatten(changesValidationIDs.map(function(ruleID) {
45134               if (_disabledValidations[ruleID]) {
45135                   return [];
45136               }
45137               var validation = validations[ruleID];
45138               return validation(changes, context);
45139           }));
45140
45141           entitiesToCheck = uniq(flattenDeep(entitiesToCheck.map(function(entity) {
45142               var entities = [entity];
45143               if (entity.type === 'node') {  // validate ways if their nodes have changed
45144                   entities = entities.concat(graph.parentWays(entity));
45145               }
45146               entities = entities.map(function(entity) {
45147                   if (entity.type !== 'relation') {  // validate relations if their geometries have changed
45148                       return [entity].concat(graph.parentRelations(entity));
45149                   }
45150                   return entity;
45151               });
45152               return entities;
45153           })));
45154
45155           var issuesByID = {};
45156
45157           for (var entityIndex in entitiesToCheck) {
45158               var entity = entitiesToCheck[entityIndex];
45159               var entityIssues = validateEntity(entity);
45160               _issuesByEntityID[entity.id] = entityIssues;
45161               entityIssues.forEach(function(issue) {
45162                   // Different entities can produce the same issue so store them by
45163                   // the ID to ensure that there are no duplicate issues.
45164                   issuesByID[issue.id()] = issue;
45165               });
45166           }
45167
45168           for (var issueID in issuesByID) {
45169               _issues.push(issuesByID[issueID]);
45170           }
45171
45172           dispatch$1.call('reload', self, _issues);
45173       };
45174
45175       return utilRebind(self, dispatch$1, 'on');
45176   }
45177
45178
45179   function validationIssue(attrs) {
45180       this.type = attrs.type;                // required
45181       this.severity = attrs.severity;        // required - 'warning' or 'error'
45182       this.message = attrs.message;          // required - localized string
45183       this.tooltip = attrs.tooltip;          // required - localized string
45184       this.entities = attrs.entities;        // optional - array of entities
45185       this.loc = attrs.loc;                  // optional - expect a [lon, lat] array
45186       this.info = attrs.info;                // optional - object containing arbitrary extra information
45187       this.fixes = attrs.fixes;              // optional - array of validationIssueFix objects
45188       this.hash = attrs.hash;                // optional - string to further differentiate the issue
45189
45190
45191       var _id;
45192
45193       // A unique, deterministic string hash.
45194       // Issues with identical id values are considered identical.
45195       this.id = function() {
45196           if (_id) {
45197               return _id;
45198           }
45199
45200           _id = this.type;
45201
45202           if (this.hash) {   // subclasses can pass in their own differentiator
45203               _id += this.hash;
45204           }
45205
45206           // factor in the entities this issue is for
45207           // (sort them so the id is deterministic)
45208           var entityKeys = this.entities.map(osmEntity.key);
45209           _id += entityKeys.sort().join();
45210
45211           // factor in loc since two separate issues can have an
45212           // idential type and entities, e.g. in crossing_ways
45213           if (this.loc) {
45214               _id += this.loc.join();
45215           }
45216           return _id;
45217       };
45218
45219
45220       this.extent = function(resolver) {
45221           if (this.loc) {
45222               return geoExtent(this.loc);
45223           }
45224           if (this.entities && this.entities.length) {
45225               return this.entities.reduce(function(extent, entity) {
45226                   return extent.extend(entity.extent(resolver));
45227               }, geoExtent());
45228           }
45229           return null;
45230       };
45231
45232
45233       if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
45234           for (var i = 0; i < this.fixes.length; i++) {
45235               this.fixes[i].issue = this;
45236           }
45237       }
45238   }
45239
45240
45241   function validationIssueFix(attrs) {
45242       this.icon = attrs.icon;
45243       this.title = attrs.title;
45244       this.onClick = attrs.onClick;
45245       this.entityIds = attrs.entityIds || [];  // Used for hover-higlighting.
45246       this.issue = null;    // the issue this fix is for
45247   }
45248
45249   var buildRuleChecks = function() {
45250       return {
45251           equals: function (equals) {
45252               return function(tags) {
45253                   return isMatch(tags, equals);
45254               };
45255           },
45256           notEquals: function (notEquals) {
45257               return function(tags) {
45258                   return !isMatch(tags, notEquals);
45259               };
45260           },
45261           absence: function(absence) {
45262               return function(tags) {
45263                   return Object.keys(tags).indexOf(absence) === -1;
45264               };
45265           },
45266           presence: function(presence) {
45267               return function(tags) {
45268                   return Object.keys(tags).indexOf(presence) > -1;
45269               };
45270           },
45271           greaterThan: function(greaterThan) {
45272               var key = Object.keys(greaterThan)[0];
45273               var value = greaterThan[key];
45274
45275               return function(tags) {
45276                   return tags[key] > value;
45277               };
45278           },
45279           greaterThanEqual: function(greaterThanEqual) {
45280               var key = Object.keys(greaterThanEqual)[0];
45281               var value = greaterThanEqual[key];
45282
45283               return function(tags) {
45284                   return tags[key] >= value;
45285               };
45286           },
45287           lessThan: function(lessThan) {
45288               var key = Object.keys(lessThan)[0];
45289               var value = lessThan[key];
45290
45291               return function(tags) {
45292                   return tags[key] < value;
45293               };
45294           },
45295           lessThanEqual: function(lessThanEqual) {
45296               var key = Object.keys(lessThanEqual)[0];
45297               var value = lessThanEqual[key];
45298
45299               return function(tags) {
45300                   return tags[key] <= value;
45301               };
45302           },
45303           positiveRegex: function(positiveRegex) {
45304               var tagKey = Object.keys(positiveRegex)[0];
45305               var expression = positiveRegex[tagKey].join('|');
45306               var regex = new RegExp(expression);
45307
45308               return function(tags) {
45309                   return regex.test(tags[tagKey]);
45310               };
45311           },
45312           negativeRegex: function(negativeRegex) {
45313               var tagKey = Object.keys(negativeRegex)[0];
45314               var expression = negativeRegex[tagKey].join('|');
45315               var regex = new RegExp(expression);
45316
45317               return function(tags) {
45318                   return !regex.test(tags[tagKey]);
45319               };
45320           }
45321       };
45322   };
45323
45324   var buildLineKeys = function() {
45325       return {
45326           highway: {
45327               rest_area: true,
45328               services: true
45329           },
45330           railway: {
45331               roundhouse: true,
45332               station: true,
45333               traverser: true,
45334               turntable: true,
45335               wash: true
45336           }
45337       };
45338   };
45339
45340   var serviceMapRules = {
45341       init: function() {
45342           this._ruleChecks  = buildRuleChecks();
45343           this._validationRules = [];
45344           this._areaKeys = areaKeys;
45345           this._lineKeys = buildLineKeys();
45346       },
45347
45348       // list of rules only relevant to tag checks...
45349       filterRuleChecks: function(selector) {
45350           var _ruleChecks = this._ruleChecks;
45351           return reduce(Object.keys(selector), function(rules, key) {
45352               if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
45353                   rules.push(_ruleChecks[key](selector[key]));
45354               }
45355               return rules;
45356           }, []);
45357       },
45358
45359       // builds tagMap from mapcss-parse selector object...
45360       buildTagMap: function(selector) {
45361           var getRegexValues = function(regexes) {
45362               return regexes.map(function(regex) {
45363                   return regex.replace(/\$|\^/g, '');
45364               });
45365           };
45366
45367           var selectorKeys = Object.keys(selector);
45368           var tagMap = reduce(selectorKeys, function (expectedTags, key) {
45369               var values;
45370               var isRegex = /regex/gi.test(key);
45371               var isEqual = /equals/gi.test(key);
45372
45373               if (isRegex || isEqual) {
45374                   Object.keys(selector[key]).forEach(function(selectorKey) {
45375                       values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
45376
45377                       if (expectedTags.hasOwnProperty(selectorKey)) {
45378                           values = values.concat(expectedTags[selectorKey]);
45379                       }
45380
45381                       expectedTags[selectorKey] = values;
45382                   });
45383
45384               } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
45385                   var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
45386
45387                   values = [selector[key][tagKey]];
45388
45389                   if (expectedTags.hasOwnProperty(tagKey)) {
45390                       values = values.concat(expectedTags[tagKey]);
45391                   }
45392
45393                   expectedTags[tagKey] = values;
45394               }
45395
45396               return expectedTags;
45397           }, {});
45398
45399           return tagMap;
45400       },
45401
45402       // inspired by osmWay#isArea()
45403       inferGeometry: function(tagMap) {
45404           var _lineKeys = this._lineKeys;
45405           var _areaKeys = this._areaKeys;
45406
45407           var isAreaKeyBlackList = function(key) {
45408               return intersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
45409           };
45410           var isLineKeysWhiteList = function(key) {
45411               return intersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
45412           };
45413
45414           if (tagMap.hasOwnProperty('area')) {
45415               if (tagMap.area.indexOf('yes') > -1) {
45416                   return 'area';
45417               }
45418               if (tagMap.area.indexOf('no') > -1) {
45419                   return 'line';
45420               }
45421           }
45422
45423           for (var key in tagMap) {
45424               if (key in _areaKeys && !isAreaKeyBlackList(key)) {
45425                   return 'area';
45426               }
45427               if (key in _lineKeys && isLineKeysWhiteList(key)) {
45428                   return 'area';
45429               }
45430           }
45431
45432           return 'line';
45433       },
45434
45435       // adds from mapcss-parse selector check...
45436       addRule: function(selector) {
45437           var rule = {
45438               // checks relevant to mapcss-selector
45439               checks: this.filterRuleChecks(selector),
45440               // true if all conditions for a tag error are true..
45441               matches: function(entity) {
45442                   return every(this.checks, function(check) {
45443                       return check(entity.tags);
45444                   });
45445               },
45446               // borrowed from Way#isArea()
45447               inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
45448               geometryMatches: function(entity, graph) {
45449                   if (entity.type === 'node' || entity.type === 'relation') {
45450                       return selector.geometry === entity.type;
45451                   } else if (entity.type === 'way') {
45452                       return this.inferredGeometry === entity.geometry(graph);
45453                   }
45454               },
45455               // when geometries match and tag matches are present, return a warning...
45456               findIssues: function (entity, graph, issues) {
45457                   if (this.geometryMatches(entity, graph) && this.matches(entity)) {
45458                       var severity = Object.keys(selector).indexOf('error') > -1
45459                               ? 'error'
45460                               : 'warning';
45461                       issues.push(new validationIssue({
45462                           type: 'maprules',
45463                           severity: severity,
45464                           message: selector[severity],
45465                           entities: [entity],
45466                       }));
45467                   }
45468               }
45469           };
45470           this._validationRules.push(rule);
45471       },
45472
45473       clearRules: function() { this._validationRules = []; },
45474
45475       // returns validationRules...
45476       validationRules: function() { return this._validationRules; },
45477
45478       // returns ruleChecks
45479       ruleChecks: function() { return this._ruleChecks; }
45480   };
45481
45482   var apibase$1 = 'https://nominatim.openstreetmap.org/',
45483       inflight = {},
45484       nominatimCache;
45485
45486
45487   var serviceNominatim = {
45488
45489       init: function() {
45490           inflight = {};
45491           nominatimCache = rbush_1();
45492       },
45493
45494       reset: function() {
45495           forEach(inflight, function(req) { req.abort(); });
45496           inflight = {};
45497           nominatimCache = rbush_1();
45498       },
45499
45500
45501       countryCode: function (location, callback) {
45502           this.reverse(location, function(err, result) {
45503               if (err) {
45504                   return callback(err);
45505               } else if (result.address) {
45506                   return callback(null, result.address.country_code);
45507               } else {
45508                   return callback('Unable to geocode', null);
45509               }
45510           });
45511       },
45512
45513
45514       reverse: function (location, callback) {
45515           var cached = nominatimCache.search(
45516               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
45517           );
45518
45519           if (cached.length > 0) {
45520               return callback(null, cached[0].data);
45521           }
45522
45523           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
45524           var url = apibase$1 + 'reverse?' + utilQsString(params);
45525           if (inflight[url]) return;
45526
45527           inflight[url] = d3_json(url, function(err, result) {
45528               delete inflight[url];
45529
45530               if (err) {
45531                   return callback(err);
45532               } else if (result && result.error) {
45533                   return callback(result.error);
45534               }
45535
45536               var extent = geoExtent(location).padByMeters(200);
45537               nominatimCache.insert(assign(extent.bbox(), {data: result}));
45538
45539               callback(null, result);
45540           });
45541       },
45542
45543
45544       search: function (val, callback) {
45545           var searchVal = encodeURIComponent(val);
45546           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
45547           if (inflight[url]) return;
45548
45549           inflight[url] = d3_json(url, function(err, result) {
45550               delete inflight[url];
45551               callback(err, result);
45552           });
45553       }
45554
45555   };
45556
45557   var apibase$2 = 'https://openstreetcam.org';
45558   var maxResults$1 = 1000;
45559   var tileZoom$1 = 14;
45560   var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
45561   var dispatch$4 = dispatch('loadedImages');
45562   var imgZoom = d3_zoom()
45563       .extent([[0, 0], [320, 240]])
45564       .translateExtent([[0, 0], [320, 240]])
45565       .scaleExtent([1, 15])
45566       .on('zoom', zoomPan);
45567   var _oscCache;
45568   var _oscSelectedImage;
45569
45570
45571   function abortRequest$3(i) {
45572       i.abort();
45573   }
45574
45575
45576   function maxPageAtZoom$1(z) {
45577       if (z < 15)   return 2;
45578       if (z === 15) return 5;
45579       if (z === 16) return 10;
45580       if (z === 17) return 20;
45581       if (z === 18) return 40;
45582       if (z > 18)   return 80;
45583   }
45584
45585
45586   function loadTiles$1(which, url, projection) {
45587       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
45588       var tiles = tiler$3.getTiles(projection);
45589
45590       // abort inflight requests that are no longer needed
45591       var cache = _oscCache[which];
45592       forEach(cache.inflight, function(v, k) {
45593           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
45594
45595           if (!wanted) {
45596               abortRequest$3(v);
45597               delete cache.inflight[k];
45598           }
45599       });
45600
45601       tiles.forEach(function(tile) {
45602           loadNextTilePage$1(which, currZoom, url, tile);
45603       });
45604   }
45605
45606
45607   function loadNextTilePage$1(which, currZoom, url, tile) {
45608       var cache = _oscCache[which];
45609       var bbox = tile.extent.bbox();
45610       var maxPages = maxPageAtZoom$1(currZoom);
45611       var nextPage = cache.nextPage[tile.id] || 1;
45612       var params = utilQsString({
45613           ipp: maxResults$1,
45614           page: nextPage,
45615           // client_id: clientId,
45616           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
45617           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
45618       }, true);
45619
45620       if (nextPage > maxPages) return;
45621
45622       var id = tile.id + ',' + String(nextPage);
45623       if (cache.loaded[id] || cache.inflight[id]) return;
45624
45625       cache.inflight[id] = request(url)
45626           .mimeType('application/json')
45627           .header('Content-type', 'application/x-www-form-urlencoded')
45628           .response(function(xhr) { return JSON.parse(xhr.responseText); })
45629           .post(params, function(err, data) {
45630               cache.loaded[id] = true;
45631               delete cache.inflight[id];
45632               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
45633
45634               function localeDateString(s) {
45635                   if (!s) return null;
45636                   var detected = utilDetect();
45637                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
45638                   var d = new Date(s);
45639                   if (isNaN(d.getTime())) return null;
45640                   return d.toLocaleDateString(detected.locale, options);
45641               }
45642
45643               var features = data.currentPageItems.map(function(item) {
45644                   var loc = [+item.lng, +item.lat];
45645                   var d;
45646
45647                   if (which === 'images') {
45648                       d = {
45649                           loc: loc,
45650                           key: item.id,
45651                           ca: +item.heading,
45652                           captured_at: localeDateString(item.shot_date || item.date_added),
45653                           captured_by: item.username,
45654                           imagePath: item.lth_name,
45655                           sequence_id: item.sequence_id,
45656                           sequence_index: +item.sequence_index
45657                       };
45658
45659                       // cache sequence info
45660                       var seq = _oscCache.sequences[d.sequence_id];
45661                       if (!seq) {
45662                           seq = { rotation: 0, images: [] };
45663                           _oscCache.sequences[d.sequence_id] = seq;
45664                       }
45665                       seq.images[d.sequence_index] = d;
45666                   }
45667
45668                   return {
45669                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
45670                   };
45671               });
45672
45673               cache.rtree.load(features);
45674
45675               if (which === 'images') {
45676                   dispatch$4.call('loadedImages');
45677               }
45678
45679               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
45680                   cache.nextPage[tile.id] = nextPage + 1;
45681                   loadNextTilePage$1(which, currZoom, url, tile);
45682               } else {
45683                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
45684               }
45685           });
45686   }
45687
45688
45689   // partition viewport into higher zoom tiles
45690   function partitionViewport$1(projection) {
45691       var z = geoScaleToZoom(projection.scale());
45692       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
45693       var tiler = utilTiler().zoomExtent([z2, z2]);
45694
45695       return tiler.getTiles(projection)
45696           .map(function(tile) { return tile.extent; });
45697   }
45698
45699
45700   // no more than `limit` results per partition.
45701   function searchLimited$1(limit, projection, rtree) {
45702       limit = limit || 5;
45703
45704       return partitionViewport$1(projection)
45705           .reduce(function(result, extent) {
45706               var found = rtree.search(extent.bbox())
45707                   .slice(0, limit)
45708                   .map(function(d) { return d.data; });
45709
45710               return (found.length ? result.concat(found) : result);
45711           }, []);
45712   }
45713
45714
45715   function zoomPan() {
45716       var t = event.transform;
45717       select('#photoviewer .osc-image-wrap')
45718           .call(utilSetTransform, t.x, t.y, t.k);
45719   }
45720
45721
45722   var serviceOpenstreetcam = {
45723
45724       init: function() {
45725           if (!_oscCache) {
45726               this.reset();
45727           }
45728
45729           this.event = utilRebind(this, dispatch$4, 'on');
45730       },
45731
45732       reset: function() {
45733           var cache = _oscCache;
45734
45735           if (cache) {
45736               if (cache.images && cache.images.inflight) {
45737                   forEach(cache.images.inflight, abortRequest$3);
45738               }
45739           }
45740
45741           _oscCache = {
45742               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
45743               sequences: {}
45744           };
45745
45746           _oscSelectedImage = null;
45747       },
45748
45749
45750       images: function(projection) {
45751           var limit = 5;
45752           return searchLimited$1(limit, projection, _oscCache.images.rtree);
45753       },
45754
45755
45756       sequences: function(projection) {
45757           var viewport = projection.clipExtent();
45758           var min = [viewport[0][0], viewport[1][1]];
45759           var max = [viewport[1][0], viewport[0][1]];
45760           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
45761           var sequenceKeys = {};
45762
45763           // all sequences for images in viewport
45764           _oscCache.images.rtree.search(bbox)
45765               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
45766
45767           // make linestrings from those sequences
45768           var lineStrings = [];
45769           Object.keys(sequenceKeys)
45770               .forEach(function(sequenceKey) {
45771                   var seq = _oscCache.sequences[sequenceKey];
45772                   var images = seq && seq.images;
45773                   if (images) {
45774                       lineStrings.push({
45775                           type: 'LineString',
45776                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
45777                           properties: { key: sequenceKey }
45778                       });
45779                   }
45780               });
45781           return lineStrings;
45782       },
45783
45784
45785       loadImages: function(projection) {
45786           var url = apibase$2 + '/1.0/list/nearby-photos/';
45787           loadTiles$1('images', url, projection);
45788       },
45789
45790
45791       loadViewer: function(context) {
45792           var that = this;
45793
45794           // add osc-wrapper
45795           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
45796               .data([0]);
45797
45798           var wrapEnter = wrap.enter()
45799               .append('div')
45800               .attr('class', 'photo-wrapper osc-wrapper')
45801               .classed('hide', true)
45802               .call(imgZoom)
45803               .on('dblclick.zoom', null);
45804
45805           wrapEnter
45806               .append('div')
45807               .attr('class', 'photo-attribution fillD');
45808
45809           var controlsEnter = wrapEnter
45810               .append('div')
45811               .attr('class', 'photo-controls-wrap')
45812               .append('div')
45813               .attr('class', 'photo-controls');
45814
45815           controlsEnter
45816               .append('button')
45817               .on('click.back', step(-1))
45818               .text('◄');
45819
45820           controlsEnter
45821               .append('button')
45822               .on('click.rotate-ccw', rotate(-90))
45823               .text('⤿');
45824
45825           controlsEnter
45826               .append('button')
45827               .on('click.rotate-cw', rotate(90))
45828               .text('⤾');
45829
45830           controlsEnter
45831               .append('button')
45832               .on('click.forward', step(1))
45833               .text('►');
45834
45835           wrapEnter
45836               .append('div')
45837               .attr('class', 'osc-image-wrap');
45838
45839
45840           // Register viewer resize handler
45841           context.ui().photoviewer.on('resize', function(dimensions) {
45842               imgZoom = d3_zoom()
45843                   .extent([[0, 0], dimensions])
45844                   .translateExtent([[0, 0], dimensions])
45845                   .scaleExtent([1, 15])
45846                   .on('zoom', zoomPan);
45847           });
45848
45849
45850           function rotate(deg) {
45851               return function() {
45852                   if (!_oscSelectedImage) return;
45853                   var sequenceKey = _oscSelectedImage.sequence_id;
45854                   var sequence = _oscCache.sequences[sequenceKey];
45855                   if (!sequence) return;
45856
45857                   var r = sequence.rotation || 0;
45858                   r += deg;
45859
45860                   if (r > 180) r -= 360;
45861                   if (r < -180) r += 360;
45862                   sequence.rotation = r;
45863
45864                   var wrap = select('#photoviewer .osc-wrapper');
45865
45866                   wrap
45867                       .transition()
45868                       .duration(100)
45869                       .call(imgZoom.transform, identity$7);
45870
45871                   wrap.selectAll('.osc-image')
45872                       .transition()
45873                       .duration(100)
45874                       .style('transform', 'rotate(' + r + 'deg)');
45875               };
45876           }
45877
45878           function step(stepBy) {
45879               return function() {
45880                   if (!_oscSelectedImage) return;
45881                   var sequenceKey = _oscSelectedImage.sequence_id;
45882                   var sequence = _oscCache.sequences[sequenceKey];
45883                   if (!sequence) return;
45884
45885                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
45886                   var nextImage = sequence.images[nextIndex];
45887                   if (!nextImage) return;
45888
45889                   context.map().centerEase(nextImage.loc);
45890
45891                   that
45892                       .selectImage(nextImage)
45893                       .updateViewer(nextImage);
45894               };
45895           }
45896       },
45897
45898
45899       showViewer: function() {
45900           var viewer = select('#photoviewer')
45901               .classed('hide', false);
45902
45903           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
45904
45905           if (isHidden) {
45906               viewer
45907                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
45908                   .classed('hide', true);
45909
45910               viewer
45911                   .selectAll('.photo-wrapper.osc-wrapper')
45912                   .classed('hide', false);
45913           }
45914
45915           return this;
45916       },
45917
45918
45919       hideViewer: function() {
45920           _oscSelectedImage = null;
45921
45922           var viewer = select('#photoviewer');
45923           if (!viewer.empty()) viewer.datum(null);
45924
45925           viewer
45926               .classed('hide', true)
45927               .selectAll('.photo-wrapper')
45928               .classed('hide', true);
45929
45930           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
45931               .classed('currentView', false);
45932
45933           return this.setStyles(null, true);
45934       },
45935
45936
45937       updateViewer: function(d) {
45938           var wrap = select('#photoviewer .osc-wrapper');
45939           var imageWrap = wrap.selectAll('.osc-image-wrap');
45940           var attribution = wrap.selectAll('.photo-attribution').html('');
45941
45942           wrap
45943               .transition()
45944               .duration(100)
45945               .call(imgZoom.transform, identity$7);
45946
45947           imageWrap
45948               .selectAll('.osc-image')
45949               .remove();
45950
45951           if (d) {
45952               var sequence = _oscCache.sequences[d.sequence_id];
45953               var r = (sequence && sequence.rotation) || 0;
45954
45955               imageWrap
45956                   .append('img')
45957                   .attr('class', 'osc-image')
45958                   .attr('src', apibase$2 + '/' + d.imagePath)
45959                   .style('transform', 'rotate(' + r + 'deg)');
45960
45961               if (d.captured_by) {
45962                   attribution
45963                       .append('a')
45964                       .attr('class', 'captured_by')
45965                       .attr('target', '_blank')
45966                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
45967                       .text('@' + d.captured_by);
45968
45969                   attribution
45970                       .append('span')
45971                       .text('|');
45972               }
45973
45974               if (d.captured_at) {
45975                   attribution
45976                       .append('span')
45977                       .attr('class', 'captured_at')
45978                       .text(d.captured_at);
45979
45980                   attribution
45981                       .append('span')
45982                       .text('|');
45983               }
45984
45985               attribution
45986                   .append('a')
45987                   .attr('class', 'image-link')
45988                   .attr('target', '_blank')
45989                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
45990                   .text('openstreetcam.org');
45991           }
45992           return this;
45993       },
45994
45995
45996       selectImage: function(d) {
45997           _oscSelectedImage = d;
45998           var viewer = select('#photoviewer');
45999           if (!viewer.empty()) viewer.datum(d);
46000
46001           this.setStyles(null, true);
46002
46003           d3_selectAll('.icon-sign')
46004               .classed('currentView', false);
46005
46006           return this;
46007       },
46008
46009
46010       getSelectedImage: function() {
46011           return _oscSelectedImage;
46012       },
46013
46014
46015       getSequenceKeyForImage: function(d) {
46016           return d && d.sequence_id;
46017       },
46018
46019
46020       // Updates the currently highlighted sequence and selected bubble.
46021       // Reset is only necessary when interacting with the viewport because
46022       // this implicitly changes the currently selected bubble/sequence
46023       setStyles: function(hovered, reset) {
46024           if (reset) {  // reset all layers
46025               d3_selectAll('.viewfield-group')
46026                   .classed('highlighted', false)
46027                   .classed('hovered', false)
46028                   .classed('currentView', false);
46029
46030               d3_selectAll('.sequence')
46031                   .classed('highlighted', false)
46032                   .classed('currentView', false);
46033           }
46034
46035           var hoveredImageKey = hovered && hovered.key;
46036           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
46037           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
46038           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
46039
46040           var viewer = select('#photoviewer');
46041           var selected = viewer.empty() ? undefined : viewer.datum();
46042           var selectedImageKey = selected && selected.key;
46043           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
46044           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
46045           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
46046
46047           // highlight sibling viewfields on either the selected or the hovered sequences
46048           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
46049
46050           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
46051               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
46052               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
46053               .classed('currentView', function(d) { return d.key === selectedImageKey; });
46054
46055           d3_selectAll('.layer-openstreetcam-images .sequence')
46056               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
46057               .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
46058
46059           // update viewfields if needed
46060           d3_selectAll('.viewfield-group .viewfield')
46061               .attr('d', viewfieldPath);
46062
46063           function viewfieldPath() {
46064               var d = this.parentNode.__data__;
46065               if (d.pano && d.key !== selectedImageKey) {
46066                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
46067               } else {
46068                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
46069               }
46070           }
46071
46072           return this;
46073       },
46074
46075
46076       cache: function() {
46077           return _oscCache;
46078       }
46079
46080   };
46081
46082   /* Built-in method references for those with the same name as other `lodash` methods. */
46083   var nativeCeil = Math.ceil,
46084       nativeMax$4 = Math.max;
46085
46086   /**
46087    * Creates an array of elements split into groups the length of `size`.
46088    * If `array` can't be split evenly, the final chunk will be the remaining
46089    * elements.
46090    *
46091    * @static
46092    * @memberOf _
46093    * @since 3.0.0
46094    * @category Array
46095    * @param {Array} array The array to process.
46096    * @param {number} [size=1] The length of each chunk
46097    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
46098    * @returns {Array} Returns the new array of chunks.
46099    * @example
46100    *
46101    * _.chunk(['a', 'b', 'c', 'd'], 2);
46102    * // => [['a', 'b'], ['c', 'd']]
46103    *
46104    * _.chunk(['a', 'b', 'c', 'd'], 3);
46105    * // => [['a', 'b', 'c'], ['d']]
46106    */
46107   function chunk(array, size, guard) {
46108     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
46109       size = 1;
46110     } else {
46111       size = nativeMax$4(toInteger(size), 0);
46112     }
46113     var length = array == null ? 0 : array.length;
46114     if (!length || size < 1) {
46115       return [];
46116     }
46117     var index = 0,
46118         resIndex = 0,
46119         result = Array(nativeCeil(length / size));
46120
46121     while (index < length) {
46122       result[resIndex++] = baseSlice(array, index, (index += size));
46123     }
46124     return result;
46125   }
46126
46127   var hashes = createCommonjsModule(function (module, exports) {
46128   /**
46129    * jshashes - https://github.com/h2non/jshashes
46130    * Released under the "New BSD" license
46131    *
46132    * Algorithms specification:
46133    *
46134    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
46135    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
46136    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
46137    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
46138    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
46139    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
46140    */
46141   (function() {
46142     var Hashes;
46143
46144     function utf8Encode(str) {
46145       var x, y, output = '',
46146         i = -1,
46147         l;
46148
46149       if (str && str.length) {
46150         l = str.length;
46151         while ((i += 1) < l) {
46152           /* Decode utf-16 surrogate pairs */
46153           x = str.charCodeAt(i);
46154           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
46155           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
46156             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
46157             i += 1;
46158           }
46159           /* Encode output as utf-8 */
46160           if (x <= 0x7F) {
46161             output += String.fromCharCode(x);
46162           } else if (x <= 0x7FF) {
46163             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
46164               0x80 | (x & 0x3F));
46165           } else if (x <= 0xFFFF) {
46166             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
46167               0x80 | ((x >>> 6) & 0x3F),
46168               0x80 | (x & 0x3F));
46169           } else if (x <= 0x1FFFFF) {
46170             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
46171               0x80 | ((x >>> 12) & 0x3F),
46172               0x80 | ((x >>> 6) & 0x3F),
46173               0x80 | (x & 0x3F));
46174           }
46175         }
46176       }
46177       return output;
46178     }
46179
46180     function utf8Decode(str) {
46181       var i, ac, c1, c2, c3, arr = [],
46182         l;
46183       i = ac = c1 = c2 = c3 = 0;
46184
46185       if (str && str.length) {
46186         l = str.length;
46187         str += '';
46188
46189         while (i < l) {
46190           c1 = str.charCodeAt(i);
46191           ac += 1;
46192           if (c1 < 128) {
46193             arr[ac] = String.fromCharCode(c1);
46194             i += 1;
46195           } else if (c1 > 191 && c1 < 224) {
46196             c2 = str.charCodeAt(i + 1);
46197             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
46198             i += 2;
46199           } else {
46200             c2 = str.charCodeAt(i + 1);
46201             c3 = str.charCodeAt(i + 2);
46202             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
46203             i += 3;
46204           }
46205         }
46206       }
46207       return arr.join('');
46208     }
46209
46210     /**
46211      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
46212      * to work around bugs in some JS interpreters.
46213      */
46214
46215     function safe_add(x, y) {
46216       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
46217         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
46218       return (msw << 16) | (lsw & 0xFFFF);
46219     }
46220
46221     /**
46222      * Bitwise rotate a 32-bit number to the left.
46223      */
46224
46225     function bit_rol(num, cnt) {
46226       return (num << cnt) | (num >>> (32 - cnt));
46227     }
46228
46229     /**
46230      * Convert a raw string to a hex string
46231      */
46232
46233     function rstr2hex(input, hexcase) {
46234       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
46235         output = '',
46236         x, i = 0,
46237         l = input.length;
46238       for (; i < l; i += 1) {
46239         x = input.charCodeAt(i);
46240         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
46241       }
46242       return output;
46243     }
46244
46245     /**
46246      * Convert an array of big-endian words to a string
46247      */
46248
46249     function binb2rstr(input) {
46250       var i, l = input.length * 32,
46251         output = '';
46252       for (i = 0; i < l; i += 8) {
46253         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
46254       }
46255       return output;
46256     }
46257
46258     /**
46259      * Convert an array of little-endian words to a string
46260      */
46261
46262     function binl2rstr(input) {
46263       var i, l = input.length * 32,
46264         output = '';
46265       for (i = 0; i < l; i += 8) {
46266         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
46267       }
46268       return output;
46269     }
46270
46271     /**
46272      * Convert a raw string to an array of little-endian words
46273      * Characters >255 have their high-byte silently ignored.
46274      */
46275
46276     function rstr2binl(input) {
46277       var i, l = input.length * 8,
46278         output = Array(input.length >> 2),
46279         lo = output.length;
46280       for (i = 0; i < lo; i += 1) {
46281         output[i] = 0;
46282       }
46283       for (i = 0; i < l; i += 8) {
46284         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
46285       }
46286       return output;
46287     }
46288
46289     /**
46290      * Convert a raw string to an array of big-endian words
46291      * Characters >255 have their high-byte silently ignored.
46292      */
46293
46294     function rstr2binb(input) {
46295       var i, l = input.length * 8,
46296         output = Array(input.length >> 2),
46297         lo = output.length;
46298       for (i = 0; i < lo; i += 1) {
46299         output[i] = 0;
46300       }
46301       for (i = 0; i < l; i += 8) {
46302         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
46303       }
46304       return output;
46305     }
46306
46307     /**
46308      * Convert a raw string to an arbitrary string encoding
46309      */
46310
46311     function rstr2any(input, encoding) {
46312       var divisor = encoding.length,
46313         remainders = Array(),
46314         i, q, x, ld, quotient, dividend, output, full_length;
46315
46316       /* Convert to an array of 16-bit big-endian values, forming the dividend */
46317       dividend = Array(Math.ceil(input.length / 2));
46318       ld = dividend.length;
46319       for (i = 0; i < ld; i += 1) {
46320         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
46321       }
46322
46323       /**
46324        * Repeatedly perform a long division. The binary array forms the dividend,
46325        * the length of the encoding is the divisor. Once computed, the quotient
46326        * forms the dividend for the next step. We stop when the dividend is zerHashes.
46327        * All remainders are stored for later use.
46328        */
46329       while (dividend.length > 0) {
46330         quotient = Array();
46331         x = 0;
46332         for (i = 0; i < dividend.length; i += 1) {
46333           x = (x << 16) + dividend[i];
46334           q = Math.floor(x / divisor);
46335           x -= q * divisor;
46336           if (quotient.length > 0 || q > 0) {
46337             quotient[quotient.length] = q;
46338           }
46339         }
46340         remainders[remainders.length] = x;
46341         dividend = quotient;
46342       }
46343
46344       /* Convert the remainders to the output string */
46345       output = '';
46346       for (i = remainders.length - 1; i >= 0; i--) {
46347         output += encoding.charAt(remainders[i]);
46348       }
46349
46350       /* Append leading zero equivalents */
46351       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
46352       for (i = output.length; i < full_length; i += 1) {
46353         output = encoding[0] + output;
46354       }
46355       return output;
46356     }
46357
46358     /**
46359      * Convert a raw string to a base-64 string
46360      */
46361
46362     function rstr2b64(input, b64pad) {
46363       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
46364         output = '',
46365         len = input.length,
46366         i, j, triplet;
46367       b64pad = b64pad || '=';
46368       for (i = 0; i < len; i += 3) {
46369         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
46370         for (j = 0; j < 4; j += 1) {
46371           if (i * 8 + j * 6 > input.length * 8) {
46372             output += b64pad;
46373           } else {
46374             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
46375           }
46376         }
46377       }
46378       return output;
46379     }
46380
46381     Hashes = {
46382       /**
46383        * @property {String} version
46384        * @readonly
46385        */
46386       VERSION: '1.0.6',
46387       /**
46388        * @member Hashes
46389        * @class Base64
46390        * @constructor
46391        */
46392       Base64: function() {
46393         // private properties
46394         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
46395           pad = '=', // default pad according with the RFC standard
46396           utf8 = true; // by default enable UTF-8 support encoding
46397
46398         // public method for encoding
46399         this.encode = function(input) {
46400           var i, j, triplet,
46401             output = '',
46402             len = input.length;
46403
46404           pad = pad || '=';
46405           input = (utf8) ? utf8Encode(input) : input;
46406
46407           for (i = 0; i < len; i += 3) {
46408             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
46409             for (j = 0; j < 4; j += 1) {
46410               if (i * 8 + j * 6 > len * 8) {
46411                 output += pad;
46412               } else {
46413                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
46414               }
46415             }
46416           }
46417           return output;
46418         };
46419
46420         // public method for decoding
46421         this.decode = function(input) {
46422           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
46423           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
46424             dec = '',
46425             arr = [];
46426           if (!input) {
46427             return input;
46428           }
46429
46430           i = ac = 0;
46431           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
46432           //input += '';
46433
46434           do { // unpack four hexets into three octets using index points in b64
46435             h1 = tab.indexOf(input.charAt(i += 1));
46436             h2 = tab.indexOf(input.charAt(i += 1));
46437             h3 = tab.indexOf(input.charAt(i += 1));
46438             h4 = tab.indexOf(input.charAt(i += 1));
46439
46440             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
46441
46442             o1 = bits >> 16 & 0xff;
46443             o2 = bits >> 8 & 0xff;
46444             o3 = bits & 0xff;
46445             ac += 1;
46446
46447             if (h3 === 64) {
46448               arr[ac] = String.fromCharCode(o1);
46449             } else if (h4 === 64) {
46450               arr[ac] = String.fromCharCode(o1, o2);
46451             } else {
46452               arr[ac] = String.fromCharCode(o1, o2, o3);
46453             }
46454           } while (i < input.length);
46455
46456           dec = arr.join('');
46457           dec = (utf8) ? utf8Decode(dec) : dec;
46458
46459           return dec;
46460         };
46461
46462         // set custom pad string
46463         this.setPad = function(str) {
46464           pad = str || pad;
46465           return this;
46466         };
46467         // set custom tab string characters
46468         this.setTab = function(str) {
46469           tab = str || tab;
46470           return this;
46471         };
46472         this.setUTF8 = function(bool) {
46473           if (typeof bool === 'boolean') {
46474             utf8 = bool;
46475           }
46476           return this;
46477         };
46478       },
46479
46480       /**
46481        * CRC-32 calculation
46482        * @member Hashes
46483        * @method CRC32
46484        * @static
46485        * @param {String} str Input String
46486        * @return {String}
46487        */
46488       CRC32: function(str) {
46489         var crc = 0,
46490           x = 0,
46491           y = 0,
46492           table, i, iTop;
46493         str = utf8Encode(str);
46494
46495         table = [
46496           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
46497           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
46498           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
46499           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
46500           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
46501           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
46502           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
46503           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
46504           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
46505           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
46506           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
46507           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
46508           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
46509           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
46510           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
46511           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
46512           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
46513           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
46514           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
46515           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
46516           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
46517           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
46518           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
46519           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
46520           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
46521           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
46522         ].join('');
46523
46524         crc = crc ^ (-1);
46525         for (i = 0, iTop = str.length; i < iTop; i += 1) {
46526           y = (crc ^ str.charCodeAt(i)) & 0xFF;
46527           x = '0x' + table.substr(y * 9, 8);
46528           crc = (crc >>> 8) ^ x;
46529         }
46530         // always return a positive number (that's what >>> 0 does)
46531         return (crc ^ (-1)) >>> 0;
46532       },
46533       /**
46534        * @member Hashes
46535        * @class MD5
46536        * @constructor
46537        * @param {Object} [config]
46538        *
46539        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
46540        * Digest Algorithm, as defined in RFC 1321.
46541        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
46542        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46543        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
46544        */
46545       MD5: function(options) {
46546         /**
46547          * Private config properties. You may need to tweak these to be compatible with
46548          * the server-side, but the defaults work in most cases.
46549          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
46550          */
46551         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
46552           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
46553           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
46554
46555         // privileged (public) methods
46556         this.hex = function(s) {
46557           return rstr2hex(rstr(s, utf8), hexcase);
46558         };
46559         this.b64 = function(s) {
46560           return rstr2b64(rstr(s), b64pad);
46561         };
46562         this.any = function(s, e) {
46563           return rstr2any(rstr(s, utf8), e);
46564         };
46565         this.raw = function(s) {
46566           return rstr(s, utf8);
46567         };
46568         this.hex_hmac = function(k, d) {
46569           return rstr2hex(rstr_hmac(k, d), hexcase);
46570         };
46571         this.b64_hmac = function(k, d) {
46572           return rstr2b64(rstr_hmac(k, d), b64pad);
46573         };
46574         this.any_hmac = function(k, d, e) {
46575           return rstr2any(rstr_hmac(k, d), e);
46576         };
46577         /**
46578          * Perform a simple self-test to see if the VM is working
46579          * @return {String} Hexadecimal hash sample
46580          */
46581         this.vm_test = function() {
46582           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46583         };
46584         /**
46585          * Enable/disable uppercase hexadecimal returned string
46586          * @param {Boolean}
46587          * @return {Object} this
46588          */
46589         this.setUpperCase = function(a) {
46590           if (typeof a === 'boolean') {
46591             hexcase = a;
46592           }
46593           return this;
46594         };
46595         /**
46596          * Defines a base64 pad string
46597          * @param {String} Pad
46598          * @return {Object} this
46599          */
46600         this.setPad = function(a) {
46601           b64pad = a || b64pad;
46602           return this;
46603         };
46604         /**
46605          * Defines a base64 pad string
46606          * @param {Boolean}
46607          * @return {Object} [this]
46608          */
46609         this.setUTF8 = function(a) {
46610           if (typeof a === 'boolean') {
46611             utf8 = a;
46612           }
46613           return this;
46614         };
46615
46616         // private methods
46617
46618         /**
46619          * Calculate the MD5 of a raw string
46620          */
46621
46622         function rstr(s) {
46623           s = (utf8) ? utf8Encode(s) : s;
46624           return binl2rstr(binl(rstr2binl(s), s.length * 8));
46625         }
46626
46627         /**
46628          * Calculate the HMAC-MD5, of a key and some data (raw strings)
46629          */
46630
46631         function rstr_hmac(key, data) {
46632           var bkey, ipad, opad, hash, i;
46633
46634           key = (utf8) ? utf8Encode(key) : key;
46635           data = (utf8) ? utf8Encode(data) : data;
46636           bkey = rstr2binl(key);
46637           if (bkey.length > 16) {
46638             bkey = binl(bkey, key.length * 8);
46639           }
46640
46641           ipad = Array(16), opad = Array(16);
46642           for (i = 0; i < 16; i += 1) {
46643             ipad[i] = bkey[i] ^ 0x36363636;
46644             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46645           }
46646           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
46647           return binl2rstr(binl(opad.concat(hash), 512 + 128));
46648         }
46649
46650         /**
46651          * Calculate the MD5 of an array of little-endian words, and a bit length.
46652          */
46653
46654         function binl(x, len) {
46655           var i, olda, oldb, oldc, oldd,
46656             a = 1732584193,
46657             b = -271733879,
46658             c = -1732584194,
46659             d = 271733878;
46660
46661           /* append padding */
46662           x[len >> 5] |= 0x80 << ((len) % 32);
46663           x[(((len + 64) >>> 9) << 4) + 14] = len;
46664
46665           for (i = 0; i < x.length; i += 16) {
46666             olda = a;
46667             oldb = b;
46668             oldc = c;
46669             oldd = d;
46670
46671             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
46672             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
46673             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
46674             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
46675             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
46676             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
46677             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
46678             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
46679             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
46680             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
46681             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
46682             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
46683             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
46684             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
46685             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
46686             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
46687
46688             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
46689             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
46690             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
46691             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
46692             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
46693             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
46694             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
46695             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
46696             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
46697             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
46698             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
46699             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
46700             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
46701             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
46702             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
46703             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
46704
46705             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
46706             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
46707             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
46708             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
46709             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
46710             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
46711             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
46712             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
46713             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
46714             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
46715             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
46716             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
46717             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
46718             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
46719             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
46720             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
46721
46722             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
46723             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
46724             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
46725             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
46726             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
46727             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
46728             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
46729             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
46730             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
46731             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
46732             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
46733             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
46734             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
46735             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
46736             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
46737             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
46738
46739             a = safe_add(a, olda);
46740             b = safe_add(b, oldb);
46741             c = safe_add(c, oldc);
46742             d = safe_add(d, oldd);
46743           }
46744           return Array(a, b, c, d);
46745         }
46746
46747         /**
46748          * These functions implement the four basic operations the algorithm uses.
46749          */
46750
46751         function md5_cmn(q, a, b, x, s, t) {
46752           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
46753         }
46754
46755         function md5_ff(a, b, c, d, x, s, t) {
46756           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
46757         }
46758
46759         function md5_gg(a, b, c, d, x, s, t) {
46760           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
46761         }
46762
46763         function md5_hh(a, b, c, d, x, s, t) {
46764           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
46765         }
46766
46767         function md5_ii(a, b, c, d, x, s, t) {
46768           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
46769         }
46770       },
46771       /**
46772        * @member Hashes
46773        * @class Hashes.SHA1
46774        * @param {Object} [config]
46775        * @constructor
46776        *
46777        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
46778        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
46779        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46780        * See http://pajhome.org.uk/crypt/md5 for details.
46781        */
46782       SHA1: function(options) {
46783         /**
46784          * Private config properties. You may need to tweak these to be compatible with
46785          * the server-side, but the defaults work in most cases.
46786          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
46787          */
46788         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
46789           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
46790           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
46791
46792         // public methods
46793         this.hex = function(s) {
46794           return rstr2hex(rstr(s, utf8), hexcase);
46795         };
46796         this.b64 = function(s) {
46797           return rstr2b64(rstr(s, utf8), b64pad);
46798         };
46799         this.any = function(s, e) {
46800           return rstr2any(rstr(s, utf8), e);
46801         };
46802         this.raw = function(s) {
46803           return rstr(s, utf8);
46804         };
46805         this.hex_hmac = function(k, d) {
46806           return rstr2hex(rstr_hmac(k, d));
46807         };
46808         this.b64_hmac = function(k, d) {
46809           return rstr2b64(rstr_hmac(k, d), b64pad);
46810         };
46811         this.any_hmac = function(k, d, e) {
46812           return rstr2any(rstr_hmac(k, d), e);
46813         };
46814         /**
46815          * Perform a simple self-test to see if the VM is working
46816          * @return {String} Hexadecimal hash sample
46817          * @public
46818          */
46819         this.vm_test = function() {
46820           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
46821         };
46822         /**
46823          * @description Enable/disable uppercase hexadecimal returned string
46824          * @param {boolean}
46825          * @return {Object} this
46826          * @public
46827          */
46828         this.setUpperCase = function(a) {
46829           if (typeof a === 'boolean') {
46830             hexcase = a;
46831           }
46832           return this;
46833         };
46834         /**
46835          * @description Defines a base64 pad string
46836          * @param {string} Pad
46837          * @return {Object} this
46838          * @public
46839          */
46840         this.setPad = function(a) {
46841           b64pad = a || b64pad;
46842           return this;
46843         };
46844         /**
46845          * @description Defines a base64 pad string
46846          * @param {boolean}
46847          * @return {Object} this
46848          * @public
46849          */
46850         this.setUTF8 = function(a) {
46851           if (typeof a === 'boolean') {
46852             utf8 = a;
46853           }
46854           return this;
46855         };
46856
46857         // private methods
46858
46859         /**
46860          * Calculate the SHA-512 of a raw string
46861          */
46862
46863         function rstr(s) {
46864           s = (utf8) ? utf8Encode(s) : s;
46865           return binb2rstr(binb(rstr2binb(s), s.length * 8));
46866         }
46867
46868         /**
46869          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
46870          */
46871
46872         function rstr_hmac(key, data) {
46873           var bkey, ipad, opad, i, hash;
46874           key = (utf8) ? utf8Encode(key) : key;
46875           data = (utf8) ? utf8Encode(data) : data;
46876           bkey = rstr2binb(key);
46877
46878           if (bkey.length > 16) {
46879             bkey = binb(bkey, key.length * 8);
46880           }
46881           ipad = Array(16), opad = Array(16);
46882           for (i = 0; i < 16; i += 1) {
46883             ipad[i] = bkey[i] ^ 0x36363636;
46884             opad[i] = bkey[i] ^ 0x5C5C5C5C;
46885           }
46886           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
46887           return binb2rstr(binb(opad.concat(hash), 512 + 160));
46888         }
46889
46890         /**
46891          * Calculate the SHA-1 of an array of big-endian words, and a bit length
46892          */
46893
46894         function binb(x, len) {
46895           var i, j, t, olda, oldb, oldc, oldd, olde,
46896             w = Array(80),
46897             a = 1732584193,
46898             b = -271733879,
46899             c = -1732584194,
46900             d = 271733878,
46901             e = -1009589776;
46902
46903           /* append padding */
46904           x[len >> 5] |= 0x80 << (24 - len % 32);
46905           x[((len + 64 >> 9) << 4) + 15] = len;
46906
46907           for (i = 0; i < x.length; i += 16) {
46908             olda = a;
46909             oldb = b;
46910             oldc = c;
46911             oldd = d;
46912             olde = e;
46913
46914             for (j = 0; j < 80; j += 1) {
46915               if (j < 16) {
46916                 w[j] = x[i + j];
46917               } else {
46918                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
46919               }
46920               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
46921                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
46922               e = d;
46923               d = c;
46924               c = bit_rol(b, 30);
46925               b = a;
46926               a = t;
46927             }
46928
46929             a = safe_add(a, olda);
46930             b = safe_add(b, oldb);
46931             c = safe_add(c, oldc);
46932             d = safe_add(d, oldd);
46933             e = safe_add(e, olde);
46934           }
46935           return Array(a, b, c, d, e);
46936         }
46937
46938         /**
46939          * Perform the appropriate triplet combination function for the current
46940          * iteration
46941          */
46942
46943         function sha1_ft(t, b, c, d) {
46944           if (t < 20) {
46945             return (b & c) | ((~b) & d);
46946           }
46947           if (t < 40) {
46948             return b ^ c ^ d;
46949           }
46950           if (t < 60) {
46951             return (b & c) | (b & d) | (c & d);
46952           }
46953           return b ^ c ^ d;
46954         }
46955
46956         /**
46957          * Determine the appropriate additive constant for the current iteration
46958          */
46959
46960         function sha1_kt(t) {
46961           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
46962             (t < 60) ? -1894007588 : -899497514;
46963         }
46964       },
46965       /**
46966        * @class Hashes.SHA256
46967        * @param {config}
46968        *
46969        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
46970        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
46971        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
46972        * See http://pajhome.org.uk/crypt/md5 for details.
46973        * Also http://anmar.eu.org/projects/jssha2/
46974        */
46975       SHA256: function(options) {
46976         /**
46977          * Private properties configuration variables. You may need to tweak these to be compatible with
46978          * the server-side, but the defaults work in most cases.
46979          * @see this.setUpperCase() method
46980          * @see this.setPad() method
46981          */
46982         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
46983           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
46984           /* base-64 pad character. Default '=' for strict RFC compliance   */
46985           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
46986           /* enable/disable utf8 encoding */
46987           sha256_K;
46988
46989         /* privileged (public) methods */
46990         this.hex = function(s) {
46991           return rstr2hex(rstr(s, utf8));
46992         };
46993         this.b64 = function(s) {
46994           return rstr2b64(rstr(s, utf8), b64pad);
46995         };
46996         this.any = function(s, e) {
46997           return rstr2any(rstr(s, utf8), e);
46998         };
46999         this.raw = function(s) {
47000           return rstr(s, utf8);
47001         };
47002         this.hex_hmac = function(k, d) {
47003           return rstr2hex(rstr_hmac(k, d));
47004         };
47005         this.b64_hmac = function(k, d) {
47006           return rstr2b64(rstr_hmac(k, d), b64pad);
47007         };
47008         this.any_hmac = function(k, d, e) {
47009           return rstr2any(rstr_hmac(k, d), e);
47010         };
47011         /**
47012          * Perform a simple self-test to see if the VM is working
47013          * @return {String} Hexadecimal hash sample
47014          * @public
47015          */
47016         this.vm_test = function() {
47017           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
47018         };
47019         /**
47020          * Enable/disable uppercase hexadecimal returned string
47021          * @param {boolean}
47022          * @return {Object} this
47023          * @public
47024          */
47025         this.setUpperCase = function(a) {
47026           if (typeof a === 'boolean') {
47027             hexcase = a;
47028           }
47029           return this;
47030         };
47031         /**
47032          * @description Defines a base64 pad string
47033          * @param {string} Pad
47034          * @return {Object} this
47035          * @public
47036          */
47037         this.setPad = function(a) {
47038           b64pad = a || b64pad;
47039           return this;
47040         };
47041         /**
47042          * Defines a base64 pad string
47043          * @param {boolean}
47044          * @return {Object} this
47045          * @public
47046          */
47047         this.setUTF8 = function(a) {
47048           if (typeof a === 'boolean') {
47049             utf8 = a;
47050           }
47051           return this;
47052         };
47053
47054         // private methods
47055
47056         /**
47057          * Calculate the SHA-512 of a raw string
47058          */
47059
47060         function rstr(s, utf8) {
47061           s = (utf8) ? utf8Encode(s) : s;
47062           return binb2rstr(binb(rstr2binb(s), s.length * 8));
47063         }
47064
47065         /**
47066          * Calculate the HMAC-sha256 of a key and some data (raw strings)
47067          */
47068
47069         function rstr_hmac(key, data) {
47070           key = (utf8) ? utf8Encode(key) : key;
47071           data = (utf8) ? utf8Encode(data) : data;
47072           var hash, i = 0,
47073             bkey = rstr2binb(key),
47074             ipad = Array(16),
47075             opad = Array(16);
47076
47077           if (bkey.length > 16) {
47078             bkey = binb(bkey, key.length * 8);
47079           }
47080
47081           for (; i < 16; i += 1) {
47082             ipad[i] = bkey[i] ^ 0x36363636;
47083             opad[i] = bkey[i] ^ 0x5C5C5C5C;
47084           }
47085
47086           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
47087           return binb2rstr(binb(opad.concat(hash), 512 + 256));
47088         }
47089
47090         /*
47091          * Main sha256 function, with its support functions
47092          */
47093
47094         function sha256_S(X, n) {
47095           return (X >>> n) | (X << (32 - n));
47096         }
47097
47098         function sha256_R(X, n) {
47099           return (X >>> n);
47100         }
47101
47102         function sha256_Ch(x, y, z) {
47103           return ((x & y) ^ ((~x) & z));
47104         }
47105
47106         function sha256_Maj(x, y, z) {
47107           return ((x & y) ^ (x & z) ^ (y & z));
47108         }
47109
47110         function sha256_Sigma0256(x) {
47111           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
47112         }
47113
47114         function sha256_Sigma1256(x) {
47115           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
47116         }
47117
47118         function sha256_Gamma0256(x) {
47119           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
47120         }
47121
47122         function sha256_Gamma1256(x) {
47123           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
47124         }
47125
47126         sha256_K = [
47127           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
47128           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
47129           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
47130           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
47131           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
47132           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
47133           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
47134         ];
47135
47136         function binb(m, l) {
47137           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
47138             1359893119, -1694144372, 528734635, 1541459225
47139           ];
47140           var W = new Array(64);
47141           var a, b, c, d, e, f, g, h;
47142           var i, j, T1, T2;
47143
47144           /* append padding */
47145           m[l >> 5] |= 0x80 << (24 - l % 32);
47146           m[((l + 64 >> 9) << 4) + 15] = l;
47147
47148           for (i = 0; i < m.length; i += 16) {
47149             a = HASH[0];
47150             b = HASH[1];
47151             c = HASH[2];
47152             d = HASH[3];
47153             e = HASH[4];
47154             f = HASH[5];
47155             g = HASH[6];
47156             h = HASH[7];
47157
47158             for (j = 0; j < 64; j += 1) {
47159               if (j < 16) {
47160                 W[j] = m[j + i];
47161               } else {
47162                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
47163                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
47164               }
47165
47166               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
47167                 sha256_K[j]), W[j]);
47168               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
47169               h = g;
47170               g = f;
47171               f = e;
47172               e = safe_add(d, T1);
47173               d = c;
47174               c = b;
47175               b = a;
47176               a = safe_add(T1, T2);
47177             }
47178
47179             HASH[0] = safe_add(a, HASH[0]);
47180             HASH[1] = safe_add(b, HASH[1]);
47181             HASH[2] = safe_add(c, HASH[2]);
47182             HASH[3] = safe_add(d, HASH[3]);
47183             HASH[4] = safe_add(e, HASH[4]);
47184             HASH[5] = safe_add(f, HASH[5]);
47185             HASH[6] = safe_add(g, HASH[6]);
47186             HASH[7] = safe_add(h, HASH[7]);
47187           }
47188           return HASH;
47189         }
47190
47191       },
47192
47193       /**
47194        * @class Hashes.SHA512
47195        * @param {config}
47196        *
47197        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
47198        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
47199        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
47200        * See http://pajhome.org.uk/crypt/md5 for details.
47201        */
47202       SHA512: function(options) {
47203         /**
47204          * Private properties configuration variables. You may need to tweak these to be compatible with
47205          * the server-side, but the defaults work in most cases.
47206          * @see this.setUpperCase() method
47207          * @see this.setPad() method
47208          */
47209         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
47210           /* hexadecimal output case format. false - lowercase; true - uppercase  */
47211           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
47212           /* base-64 pad character. Default '=' for strict RFC compliance   */
47213           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
47214           /* enable/disable utf8 encoding */
47215           sha512_k;
47216
47217         /* privileged (public) methods */
47218         this.hex = function(s) {
47219           return rstr2hex(rstr(s));
47220         };
47221         this.b64 = function(s) {
47222           return rstr2b64(rstr(s), b64pad);
47223         };
47224         this.any = function(s, e) {
47225           return rstr2any(rstr(s), e);
47226         };
47227         this.raw = function(s) {
47228           return rstr(s, utf8);
47229         };
47230         this.hex_hmac = function(k, d) {
47231           return rstr2hex(rstr_hmac(k, d));
47232         };
47233         this.b64_hmac = function(k, d) {
47234           return rstr2b64(rstr_hmac(k, d), b64pad);
47235         };
47236         this.any_hmac = function(k, d, e) {
47237           return rstr2any(rstr_hmac(k, d), e);
47238         };
47239         /**
47240          * Perform a simple self-test to see if the VM is working
47241          * @return {String} Hexadecimal hash sample
47242          * @public
47243          */
47244         this.vm_test = function() {
47245           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
47246         };
47247         /**
47248          * @description Enable/disable uppercase hexadecimal returned string
47249          * @param {boolean}
47250          * @return {Object} this
47251          * @public
47252          */
47253         this.setUpperCase = function(a) {
47254           if (typeof a === 'boolean') {
47255             hexcase = a;
47256           }
47257           return this;
47258         };
47259         /**
47260          * @description Defines a base64 pad string
47261          * @param {string} Pad
47262          * @return {Object} this
47263          * @public
47264          */
47265         this.setPad = function(a) {
47266           b64pad = a || b64pad;
47267           return this;
47268         };
47269         /**
47270          * @description Defines a base64 pad string
47271          * @param {boolean}
47272          * @return {Object} this
47273          * @public
47274          */
47275         this.setUTF8 = function(a) {
47276           if (typeof a === 'boolean') {
47277             utf8 = a;
47278           }
47279           return this;
47280         };
47281
47282         /* private methods */
47283
47284         /**
47285          * Calculate the SHA-512 of a raw string
47286          */
47287
47288         function rstr(s) {
47289           s = (utf8) ? utf8Encode(s) : s;
47290           return binb2rstr(binb(rstr2binb(s), s.length * 8));
47291         }
47292         /*
47293          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
47294          */
47295
47296         function rstr_hmac(key, data) {
47297           key = (utf8) ? utf8Encode(key) : key;
47298           data = (utf8) ? utf8Encode(data) : data;
47299
47300           var hash, i = 0,
47301             bkey = rstr2binb(key),
47302             ipad = Array(32),
47303             opad = Array(32);
47304
47305           if (bkey.length > 32) {
47306             bkey = binb(bkey, key.length * 8);
47307           }
47308
47309           for (; i < 32; i += 1) {
47310             ipad[i] = bkey[i] ^ 0x36363636;
47311             opad[i] = bkey[i] ^ 0x5C5C5C5C;
47312           }
47313
47314           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
47315           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
47316         }
47317
47318         /**
47319          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
47320          */
47321
47322         function binb(x, len) {
47323           var j, i, l,
47324             W = new Array(80),
47325             hash = new Array(16),
47326             //Initial hash values
47327             H = [
47328               new int64(0x6a09e667, -205731576),
47329               new int64(-1150833019, -2067093701),
47330               new int64(0x3c6ef372, -23791573),
47331               new int64(-1521486534, 0x5f1d36f1),
47332               new int64(0x510e527f, -1377402159),
47333               new int64(-1694144372, 0x2b3e6c1f),
47334               new int64(0x1f83d9ab, -79577749),
47335               new int64(0x5be0cd19, 0x137e2179)
47336             ],
47337             T1 = new int64(0, 0),
47338             T2 = new int64(0, 0),
47339             a = new int64(0, 0),
47340             b = new int64(0, 0),
47341             c = new int64(0, 0),
47342             d = new int64(0, 0),
47343             e = new int64(0, 0),
47344             f = new int64(0, 0),
47345             g = new int64(0, 0),
47346             h = new int64(0, 0),
47347             //Temporary variables not specified by the document
47348             s0 = new int64(0, 0),
47349             s1 = new int64(0, 0),
47350             Ch = new int64(0, 0),
47351             Maj = new int64(0, 0),
47352             r1 = new int64(0, 0),
47353             r2 = new int64(0, 0),
47354             r3 = new int64(0, 0);
47355
47356           if (sha512_k === undefined) {
47357             //SHA512 constants
47358             sha512_k = [
47359               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
47360               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
47361               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
47362               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
47363               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
47364               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
47365               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
47366               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
47367               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
47368               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
47369               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
47370               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
47371               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
47372               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
47373               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
47374               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
47375               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
47376               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
47377               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
47378               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
47379               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
47380               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
47381               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
47382               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
47383               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
47384               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
47385               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
47386               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
47387               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
47388               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
47389               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
47390               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
47391               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
47392               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
47393               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
47394               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
47395               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
47396               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
47397               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
47398               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
47399             ];
47400           }
47401
47402           for (i = 0; i < 80; i += 1) {
47403             W[i] = new int64(0, 0);
47404           }
47405
47406           // append padding to the source string. The format is described in the FIPS.
47407           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
47408           x[((len + 128 >> 10) << 5) + 31] = len;
47409           l = x.length;
47410           for (i = 0; i < l; i += 32) { //32 dwords is the block size
47411             int64copy(a, H[0]);
47412             int64copy(b, H[1]);
47413             int64copy(c, H[2]);
47414             int64copy(d, H[3]);
47415             int64copy(e, H[4]);
47416             int64copy(f, H[5]);
47417             int64copy(g, H[6]);
47418             int64copy(h, H[7]);
47419
47420             for (j = 0; j < 16; j += 1) {
47421               W[j].h = x[i + 2 * j];
47422               W[j].l = x[i + 2 * j + 1];
47423             }
47424
47425             for (j = 16; j < 80; j += 1) {
47426               //sigma1
47427               int64rrot(r1, W[j - 2], 19);
47428               int64revrrot(r2, W[j - 2], 29);
47429               int64shr(r3, W[j - 2], 6);
47430               s1.l = r1.l ^ r2.l ^ r3.l;
47431               s1.h = r1.h ^ r2.h ^ r3.h;
47432               //sigma0
47433               int64rrot(r1, W[j - 15], 1);
47434               int64rrot(r2, W[j - 15], 8);
47435               int64shr(r3, W[j - 15], 7);
47436               s0.l = r1.l ^ r2.l ^ r3.l;
47437               s0.h = r1.h ^ r2.h ^ r3.h;
47438
47439               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
47440             }
47441
47442             for (j = 0; j < 80; j += 1) {
47443               //Ch
47444               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
47445               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
47446
47447               //Sigma1
47448               int64rrot(r1, e, 14);
47449               int64rrot(r2, e, 18);
47450               int64revrrot(r3, e, 9);
47451               s1.l = r1.l ^ r2.l ^ r3.l;
47452               s1.h = r1.h ^ r2.h ^ r3.h;
47453
47454               //Sigma0
47455               int64rrot(r1, a, 28);
47456               int64revrrot(r2, a, 2);
47457               int64revrrot(r3, a, 7);
47458               s0.l = r1.l ^ r2.l ^ r3.l;
47459               s0.h = r1.h ^ r2.h ^ r3.h;
47460
47461               //Maj
47462               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
47463               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
47464
47465               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
47466               int64add(T2, s0, Maj);
47467
47468               int64copy(h, g);
47469               int64copy(g, f);
47470               int64copy(f, e);
47471               int64add(e, d, T1);
47472               int64copy(d, c);
47473               int64copy(c, b);
47474               int64copy(b, a);
47475               int64add(a, T1, T2);
47476             }
47477             int64add(H[0], H[0], a);
47478             int64add(H[1], H[1], b);
47479             int64add(H[2], H[2], c);
47480             int64add(H[3], H[3], d);
47481             int64add(H[4], H[4], e);
47482             int64add(H[5], H[5], f);
47483             int64add(H[6], H[6], g);
47484             int64add(H[7], H[7], h);
47485           }
47486
47487           //represent the hash as an array of 32-bit dwords
47488           for (i = 0; i < 8; i += 1) {
47489             hash[2 * i] = H[i].h;
47490             hash[2 * i + 1] = H[i].l;
47491           }
47492           return hash;
47493         }
47494
47495         //A constructor for 64-bit numbers
47496
47497         function int64(h, l) {
47498           this.h = h;
47499           this.l = l;
47500           //this.toString = int64toString;
47501         }
47502
47503         //Copies src into dst, assuming both are 64-bit numbers
47504
47505         function int64copy(dst, src) {
47506           dst.h = src.h;
47507           dst.l = src.l;
47508         }
47509
47510         //Right-rotates a 64-bit number by shift
47511         //Won't handle cases of shift>=32
47512         //The function revrrot() is for that
47513
47514         function int64rrot(dst, x, shift) {
47515           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
47516           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
47517         }
47518
47519         //Reverses the dwords of the source and then rotates right by shift.
47520         //This is equivalent to rotation by 32+shift
47521
47522         function int64revrrot(dst, x, shift) {
47523           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
47524           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
47525         }
47526
47527         //Bitwise-shifts right a 64-bit number by shift
47528         //Won't handle shift>=32, but it's never needed in SHA512
47529
47530         function int64shr(dst, x, shift) {
47531           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
47532           dst.h = (x.h >>> shift);
47533         }
47534
47535         //Adds two 64-bit numbers
47536         //Like the original implementation, does not rely on 32-bit operations
47537
47538         function int64add(dst, x, y) {
47539           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
47540           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
47541           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
47542           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
47543           dst.l = (w0 & 0xffff) | (w1 << 16);
47544           dst.h = (w2 & 0xffff) | (w3 << 16);
47545         }
47546
47547         //Same, except with 4 addends. Works faster than adding them one by one.
47548
47549         function int64add4(dst, a, b, c, d) {
47550           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
47551           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
47552           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
47553           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
47554           dst.l = (w0 & 0xffff) | (w1 << 16);
47555           dst.h = (w2 & 0xffff) | (w3 << 16);
47556         }
47557
47558         //Same, except with 5 addends
47559
47560         function int64add5(dst, a, b, c, d, e) {
47561           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
47562             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
47563             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
47564             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
47565           dst.l = (w0 & 0xffff) | (w1 << 16);
47566           dst.h = (w2 & 0xffff) | (w3 << 16);
47567         }
47568       },
47569       /**
47570        * @class Hashes.RMD160
47571        * @constructor
47572        * @param {Object} [config]
47573        *
47574        * A JavaScript implementation of the RIPEMD-160 Algorithm
47575        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
47576        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
47577        * See http://pajhome.org.uk/crypt/md5 for details.
47578        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
47579        */
47580       RMD160: function(options) {
47581         /**
47582          * Private properties configuration variables. You may need to tweak these to be compatible with
47583          * the server-side, but the defaults work in most cases.
47584          * @see this.setUpperCase() method
47585          * @see this.setPad() method
47586          */
47587         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
47588           /* hexadecimal output case format. false - lowercase; true - uppercase  */
47589           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
47590           /* base-64 pad character. Default '=' for strict RFC compliance   */
47591           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
47592           /* enable/disable utf8 encoding */
47593           rmd160_r1 = [
47594             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
47595             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
47596             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
47597             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
47598             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
47599           ],
47600           rmd160_r2 = [
47601             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
47602             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
47603             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
47604             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
47605             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
47606           ],
47607           rmd160_s1 = [
47608             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
47609             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
47610             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
47611             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
47612             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
47613           ],
47614           rmd160_s2 = [
47615             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
47616             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
47617             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
47618             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
47619             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
47620           ];
47621
47622         /* privileged (public) methods */
47623         this.hex = function(s) {
47624           return rstr2hex(rstr(s, utf8));
47625         };
47626         this.b64 = function(s) {
47627           return rstr2b64(rstr(s, utf8), b64pad);
47628         };
47629         this.any = function(s, e) {
47630           return rstr2any(rstr(s, utf8), e);
47631         };
47632         this.raw = function(s) {
47633           return rstr(s, utf8);
47634         };
47635         this.hex_hmac = function(k, d) {
47636           return rstr2hex(rstr_hmac(k, d));
47637         };
47638         this.b64_hmac = function(k, d) {
47639           return rstr2b64(rstr_hmac(k, d), b64pad);
47640         };
47641         this.any_hmac = function(k, d, e) {
47642           return rstr2any(rstr_hmac(k, d), e);
47643         };
47644         /**
47645          * Perform a simple self-test to see if the VM is working
47646          * @return {String} Hexadecimal hash sample
47647          * @public
47648          */
47649         this.vm_test = function() {
47650           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
47651         };
47652         /**
47653          * @description Enable/disable uppercase hexadecimal returned string
47654          * @param {boolean}
47655          * @return {Object} this
47656          * @public
47657          */
47658         this.setUpperCase = function(a) {
47659           if (typeof a === 'boolean') {
47660             hexcase = a;
47661           }
47662           return this;
47663         };
47664         /**
47665          * @description Defines a base64 pad string
47666          * @param {string} Pad
47667          * @return {Object} this
47668          * @public
47669          */
47670         this.setPad = function(a) {
47671           if (typeof a !== 'undefined') {
47672             b64pad = a;
47673           }
47674           return this;
47675         };
47676         /**
47677          * @description Defines a base64 pad string
47678          * @param {boolean}
47679          * @return {Object} this
47680          * @public
47681          */
47682         this.setUTF8 = function(a) {
47683           if (typeof a === 'boolean') {
47684             utf8 = a;
47685           }
47686           return this;
47687         };
47688
47689         /* private methods */
47690
47691         /**
47692          * Calculate the rmd160 of a raw string
47693          */
47694
47695         function rstr(s) {
47696           s = (utf8) ? utf8Encode(s) : s;
47697           return binl2rstr(binl(rstr2binl(s), s.length * 8));
47698         }
47699
47700         /**
47701          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
47702          */
47703
47704         function rstr_hmac(key, data) {
47705           key = (utf8) ? utf8Encode(key) : key;
47706           data = (utf8) ? utf8Encode(data) : data;
47707           var i, hash,
47708             bkey = rstr2binl(key),
47709             ipad = Array(16),
47710             opad = Array(16);
47711
47712           if (bkey.length > 16) {
47713             bkey = binl(bkey, key.length * 8);
47714           }
47715
47716           for (i = 0; i < 16; i += 1) {
47717             ipad[i] = bkey[i] ^ 0x36363636;
47718             opad[i] = bkey[i] ^ 0x5C5C5C5C;
47719           }
47720           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
47721           return binl2rstr(binl(opad.concat(hash), 512 + 160));
47722         }
47723
47724         /**
47725          * Convert an array of little-endian words to a string
47726          */
47727
47728         function binl2rstr(input) {
47729           var i, output = '',
47730             l = input.length * 32;
47731           for (i = 0; i < l; i += 8) {
47732             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
47733           }
47734           return output;
47735         }
47736
47737         /**
47738          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
47739          */
47740
47741         function binl(x, len) {
47742           var T, j, i, l,
47743             h0 = 0x67452301,
47744             h1 = 0xefcdab89,
47745             h2 = 0x98badcfe,
47746             h3 = 0x10325476,
47747             h4 = 0xc3d2e1f0,
47748             A1, B1, C1, D1, E1,
47749             A2, B2, C2, D2, E2;
47750
47751           /* append padding */
47752           x[len >> 5] |= 0x80 << (len % 32);
47753           x[(((len + 64) >>> 9) << 4) + 14] = len;
47754           l = x.length;
47755
47756           for (i = 0; i < l; i += 16) {
47757             A1 = A2 = h0;
47758             B1 = B2 = h1;
47759             C1 = C2 = h2;
47760             D1 = D2 = h3;
47761             E1 = E2 = h4;
47762             for (j = 0; j <= 79; j += 1) {
47763               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
47764               T = safe_add(T, x[i + rmd160_r1[j]]);
47765               T = safe_add(T, rmd160_K1(j));
47766               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
47767               A1 = E1;
47768               E1 = D1;
47769               D1 = bit_rol(C1, 10);
47770               C1 = B1;
47771               B1 = T;
47772               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
47773               T = safe_add(T, x[i + rmd160_r2[j]]);
47774               T = safe_add(T, rmd160_K2(j));
47775               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
47776               A2 = E2;
47777               E2 = D2;
47778               D2 = bit_rol(C2, 10);
47779               C2 = B2;
47780               B2 = T;
47781             }
47782
47783             T = safe_add(h1, safe_add(C1, D2));
47784             h1 = safe_add(h2, safe_add(D1, E2));
47785             h2 = safe_add(h3, safe_add(E1, A2));
47786             h3 = safe_add(h4, safe_add(A1, B2));
47787             h4 = safe_add(h0, safe_add(B1, C2));
47788             h0 = T;
47789           }
47790           return [h0, h1, h2, h3, h4];
47791         }
47792
47793         // specific algorithm methods
47794
47795         function rmd160_f(j, x, y, z) {
47796           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
47797             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
47798             (32 <= j && j <= 47) ? (x | ~y) ^ z :
47799             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
47800             (64 <= j && j <= 79) ? x ^ (y | ~z) :
47801             'rmd160_f: j out of range';
47802         }
47803
47804         function rmd160_K1(j) {
47805           return (0 <= j && j <= 15) ? 0x00000000 :
47806             (16 <= j && j <= 31) ? 0x5a827999 :
47807             (32 <= j && j <= 47) ? 0x6ed9eba1 :
47808             (48 <= j && j <= 63) ? 0x8f1bbcdc :
47809             (64 <= j && j <= 79) ? 0xa953fd4e :
47810             'rmd160_K1: j out of range';
47811         }
47812
47813         function rmd160_K2(j) {
47814           return (0 <= j && j <= 15) ? 0x50a28be6 :
47815             (16 <= j && j <= 31) ? 0x5c4dd124 :
47816             (32 <= j && j <= 47) ? 0x6d703ef3 :
47817             (48 <= j && j <= 63) ? 0x7a6d76e9 :
47818             (64 <= j && j <= 79) ? 0x00000000 :
47819             'rmd160_K2: j out of range';
47820         }
47821       }
47822     };
47823
47824     // exposes Hashes
47825     (function(window, undefined$1) {
47826       var freeExports = false;
47827       {
47828         freeExports = exports;
47829         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
47830           window = commonjsGlobal;
47831         }
47832       }
47833
47834       if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
47835         // define as an anonymous module, so, through path mapping, it can be aliased
47836         undefined$1(function() {
47837           return Hashes;
47838         });
47839       } else if (freeExports) {
47840         // in Node.js or RingoJS v0.8.0+
47841         if (module && module.exports === freeExports) {
47842           module.exports = Hashes;
47843         }
47844         // in Narwhal or RingoJS v0.7.0-
47845         else {
47846           freeExports.Hashes = Hashes;
47847         }
47848       } else {
47849         // in a browser or Rhino
47850         window.Hashes = Hashes;
47851       }
47852     }(this));
47853   }()); // IIFE
47854   });
47855
47856   var immutable = extend$2;
47857
47858   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
47859
47860   function extend$2() {
47861       var target = {};
47862
47863       for (var i = 0; i < arguments.length; i++) {
47864           var source = arguments[i];
47865
47866           for (var key in source) {
47867               if (hasOwnProperty$g.call(source, key)) {
47868                   target[key] = source[key];
47869               }
47870           }
47871       }
47872
47873       return target
47874   }
47875
47876   var sha1 = new hashes.SHA1();
47877
47878   var ohauth = {};
47879
47880   ohauth.qsString = function(obj) {
47881       return Object.keys(obj).sort().map(function(key) {
47882           return ohauth.percentEncode(key) + '=' +
47883               ohauth.percentEncode(obj[key]);
47884       }).join('&');
47885   };
47886
47887   ohauth.stringQs = function(str) {
47888       return str.split('&').filter(function (pair) {
47889           return pair !== '';
47890       }).reduce(function(obj, pair){
47891           var parts = pair.split('=');
47892           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
47893               '' : decodeURIComponent(parts[1]);
47894           return obj;
47895       }, {});
47896   };
47897
47898   ohauth.rawxhr = function(method, url, data, headers, callback) {
47899       var xhr = new XMLHttpRequest(),
47900           twoHundred = /^20\d$/;
47901       xhr.onreadystatechange = function() {
47902           if (4 === xhr.readyState && 0 !== xhr.status) {
47903               if (twoHundred.test(xhr.status)) callback(null, xhr);
47904               else return callback(xhr, null);
47905           }
47906       };
47907       xhr.onerror = function(e) { return callback(e, null); };
47908       xhr.open(method, url, true);
47909       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
47910       xhr.send(data);
47911       return xhr;
47912   };
47913
47914   ohauth.xhr = function(method, url, auth, data, options, callback) {
47915       var headers = (options && options.header) || {
47916           'Content-Type': 'application/x-www-form-urlencoded'
47917       };
47918       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
47919       return ohauth.rawxhr(method, url, data, headers, callback);
47920   };
47921
47922   ohauth.nonce = function() {
47923       for (var o = ''; o.length < 6;) {
47924           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
47925       }
47926       return o;
47927   };
47928
47929   ohauth.authHeader = function(obj) {
47930       return Object.keys(obj).sort().map(function(key) {
47931           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
47932       }).join(', ');
47933   };
47934
47935   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
47936
47937   ohauth.percentEncode = function(s) {
47938       return encodeURIComponent(s)
47939           .replace(/\!/g, '%21').replace(/\'/g, '%27')
47940           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
47941   };
47942
47943   ohauth.baseString = function(method, url, params) {
47944       if (params.oauth_signature) delete params.oauth_signature;
47945       return [
47946           method,
47947           ohauth.percentEncode(url),
47948           ohauth.percentEncode(ohauth.qsString(params))].join('&');
47949   };
47950
47951   ohauth.signature = function(oauth_secret, token_secret, baseString) {
47952       return sha1.b64_hmac(
47953           ohauth.percentEncode(oauth_secret) + '&' +
47954           ohauth.percentEncode(token_secret),
47955           baseString);
47956   };
47957
47958   /**
47959    * Takes an options object for configuration (consumer_key,
47960    * consumer_secret, version, signature_method, token, token_secret)
47961    * and returns a function that generates the Authorization header
47962    * for given data.
47963    *
47964    * The returned function takes these parameters:
47965    * - method: GET/POST/...
47966    * - uri: full URI with protocol, port, path and query string
47967    * - extra_params: any extra parameters (that are passed in the POST data),
47968    *   can be an object or a from-urlencoded string.
47969    *
47970    * Returned function returns full OAuth header with "OAuth" string in it.
47971    */
47972
47973   ohauth.headerGenerator = function(options) {
47974       options = options || {};
47975       var consumer_key = options.consumer_key || '',
47976           consumer_secret = options.consumer_secret || '',
47977           signature_method = options.signature_method || 'HMAC-SHA1',
47978           version = options.version || '1.0',
47979           token = options.token || '',
47980           token_secret = options.token_secret || '';
47981
47982       return function(method, uri, extra_params) {
47983           method = method.toUpperCase();
47984           if (typeof extra_params === 'string' && extra_params.length > 0) {
47985               extra_params = ohauth.stringQs(extra_params);
47986           }
47987
47988           var uri_parts = uri.split('?', 2),
47989           base_uri = uri_parts[0];
47990
47991           var query_params = uri_parts.length === 2 ?
47992               ohauth.stringQs(uri_parts[1]) : {};
47993
47994           var oauth_params = {
47995               oauth_consumer_key: consumer_key,
47996               oauth_signature_method: signature_method,
47997               oauth_version: version,
47998               oauth_timestamp: ohauth.timestamp(),
47999               oauth_nonce: ohauth.nonce()
48000           };
48001
48002           if (token) oauth_params.oauth_token = token;
48003
48004           var all_params = immutable({}, oauth_params, query_params, extra_params),
48005               base_str = ohauth.baseString(method, base_uri, all_params);
48006
48007           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
48008
48009           return 'OAuth ' + ohauth.authHeader(oauth_params);
48010       };
48011   };
48012
48013   var ohauth_1 = ohauth;
48014
48015   var resolveUrl = createCommonjsModule(function (module, exports) {
48016   // Copyright 2014 Simon Lydell
48017   // X11 (“MIT”) Licensed. (See LICENSE.)
48018
48019   void (function(root, factory) {
48020     {
48021       module.exports = factory();
48022     }
48023   }(commonjsGlobal, function() {
48024
48025     function resolveUrl(/* ...urls */) {
48026       var numUrls = arguments.length;
48027
48028       if (numUrls === 0) {
48029         throw new Error("resolveUrl requires at least one argument; got none.")
48030       }
48031
48032       var base = document.createElement("base");
48033       base.href = arguments[0];
48034
48035       if (numUrls === 1) {
48036         return base.href
48037       }
48038
48039       var head = document.getElementsByTagName("head")[0];
48040       head.insertBefore(base, head.firstChild);
48041
48042       var a = document.createElement("a");
48043       var resolved;
48044
48045       for (var index = 1; index < numUrls; index++) {
48046         a.href = arguments[index];
48047         resolved = a.href;
48048         base.href = resolved;
48049       }
48050
48051       head.removeChild(base);
48052
48053       return resolved
48054     }
48055
48056     return resolveUrl
48057
48058   }));
48059   });
48060
48061   var assign$1 = make_assign();
48062   var create$2 = make_create();
48063   var trim = make_trim();
48064   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
48065
48066   var util = {
48067         assign: assign$1,
48068         create: create$2,
48069         trim: trim,
48070         bind: bind,
48071         slice: slice$7,
48072         each: each,
48073         map: map$4,
48074         pluck: pluck,
48075         isList: isList,
48076         isFunction: isFunction$1,
48077         isObject: isObject$1,
48078         Global: Global
48079   };
48080
48081   function make_assign() {
48082         if (Object.assign) {
48083                 return Object.assign
48084         } else {
48085                 return function shimAssign(obj, props1, props2, etc) {
48086                         for (var i = 1; i < arguments.length; i++) {
48087                                 each(Object(arguments[i]), function(val, key) {
48088                                         obj[key] = val;
48089                                 });
48090                         }                       
48091                         return obj
48092                 }
48093         }
48094   }
48095
48096   function make_create() {
48097         if (Object.create) {
48098                 return function create(obj, assignProps1, assignProps2, etc) {
48099                         var assignArgsList = slice$7(arguments, 1);
48100                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
48101                 }
48102         } else {
48103                 function F() {} // eslint-disable-line no-inner-declarations
48104                 return function create(obj, assignProps1, assignProps2, etc) {
48105                         var assignArgsList = slice$7(arguments, 1);
48106                         F.prototype = obj;
48107                         return assign$1.apply(this, [new F()].concat(assignArgsList))
48108                 }
48109         }
48110   }
48111
48112   function make_trim() {
48113         if (String.prototype.trim) {
48114                 return function trim(str) {
48115                         return String.prototype.trim.call(str)
48116                 }
48117         } else {
48118                 return function trim(str) {
48119                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
48120                 }
48121         }
48122   }
48123
48124   function bind(obj, fn) {
48125         return function() {
48126                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
48127         }
48128   }
48129
48130   function slice$7(arr, index) {
48131         return Array.prototype.slice.call(arr, index || 0)
48132   }
48133
48134   function each(obj, fn) {
48135         pluck(obj, function(val, key) {
48136                 fn(val, key);
48137                 return false
48138         });
48139   }
48140
48141   function map$4(obj, fn) {
48142         var res = (isList(obj) ? [] : {});
48143         pluck(obj, function(v, k) {
48144                 res[k] = fn(v, k);
48145                 return false
48146         });
48147         return res
48148   }
48149
48150   function pluck(obj, fn) {
48151         if (isList(obj)) {
48152                 for (var i=0; i<obj.length; i++) {
48153                         if (fn(obj[i], i)) {
48154                                 return obj[i]
48155                         }
48156                 }
48157         } else {
48158                 for (var key in obj) {
48159                         if (obj.hasOwnProperty(key)) {
48160                                 if (fn(obj[key], key)) {
48161                                         return obj[key]
48162                                 }
48163                         }
48164                 }
48165         }
48166   }
48167
48168   function isList(val) {
48169         return (val != null && typeof val != 'function' && typeof val.length == 'number')
48170   }
48171
48172   function isFunction$1(val) {
48173         return val && {}.toString.call(val) === '[object Function]'
48174   }
48175
48176   function isObject$1(val) {
48177         return val && {}.toString.call(val) === '[object Object]'
48178   }
48179
48180   var slice$8 = util.slice;
48181   var pluck$1 = util.pluck;
48182   var each$1 = util.each;
48183   var bind$1 = util.bind;
48184   var create$3 = util.create;
48185   var isList$1 = util.isList;
48186   var isFunction$2 = util.isFunction;
48187   var isObject$2 = util.isObject;
48188
48189   var storeEngine = {
48190         createStore: createStore
48191   };
48192
48193   var storeAPI = {
48194         version: '2.0.12',
48195         enabled: false,
48196         
48197         // get returns the value of the given key. If that value
48198         // is undefined, it returns optionalDefaultValue instead.
48199         get: function(key, optionalDefaultValue) {
48200                 var data = this.storage.read(this._namespacePrefix + key);
48201                 return this._deserialize(data, optionalDefaultValue)
48202         },
48203
48204         // set will store the given value at key and returns value.
48205         // Calling set with value === undefined is equivalent to calling remove.
48206         set: function(key, value) {
48207                 if (value === undefined) {
48208                         return this.remove(key)
48209                 }
48210                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
48211                 return value
48212         },
48213
48214         // remove deletes the key and value stored at the given key.
48215         remove: function(key) {
48216                 this.storage.remove(this._namespacePrefix + key);
48217         },
48218
48219         // each will call the given callback once for each key-value pair
48220         // in this store.
48221         each: function(callback) {
48222                 var self = this;
48223                 this.storage.each(function(val, namespacedKey) {
48224                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
48225                 });
48226         },
48227
48228         // clearAll will remove all the stored key-value pairs in this store.
48229         clearAll: function() {
48230                 this.storage.clearAll();
48231         },
48232
48233         // additional functionality that can't live in plugins
48234         // ---------------------------------------------------
48235
48236         // hasNamespace returns true if this store instance has the given namespace.
48237         hasNamespace: function(namespace) {
48238                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
48239         },
48240
48241         // createStore creates a store.js instance with the first
48242         // functioning storage in the list of storage candidates,
48243         // and applies the the given mixins to the instance.
48244         createStore: function() {
48245                 return createStore.apply(this, arguments)
48246         },
48247         
48248         addPlugin: function(plugin) {
48249                 this._addPlugin(plugin);
48250         },
48251         
48252         namespace: function(namespace) {
48253                 return createStore(this.storage, this.plugins, namespace)
48254         }
48255   };
48256
48257   function _warn() {
48258         var _console = (typeof console == 'undefined' ? null : console);
48259         if (!_console) { return }
48260         var fn = (_console.warn ? _console.warn : _console.log);
48261         fn.apply(_console, arguments);
48262   }
48263
48264   function createStore(storages, plugins, namespace) {
48265         if (!namespace) {
48266                 namespace = '';
48267         }
48268         if (storages && !isList$1(storages)) {
48269                 storages = [storages];
48270         }
48271         if (plugins && !isList$1(plugins)) {
48272                 plugins = [plugins];
48273         }
48274
48275         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
48276         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
48277         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
48278         if (!legalNamespaces.test(namespace)) {
48279                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
48280         }
48281         
48282         var _privateStoreProps = {
48283                 _namespacePrefix: namespacePrefix,
48284                 _namespaceRegexp: namespaceRegexp,
48285
48286                 _testStorage: function(storage) {
48287                         try {
48288                                 var testStr = '__storejs__test__';
48289                                 storage.write(testStr, testStr);
48290                                 var ok = (storage.read(testStr) === testStr);
48291                                 storage.remove(testStr);
48292                                 return ok
48293                         } catch(e) {
48294                                 return false
48295                         }
48296                 },
48297
48298                 _assignPluginFnProp: function(pluginFnProp, propName) {
48299                         var oldFn = this[propName];
48300                         this[propName] = function pluginFn() {
48301                                 var args = slice$8(arguments, 0);
48302                                 var self = this;
48303
48304                                 // super_fn calls the old function which was overwritten by
48305                                 // this mixin.
48306                                 function super_fn() {
48307                                         if (!oldFn) { return }
48308                                         each$1(arguments, function(arg, i) {
48309                                                 args[i] = arg;
48310                                         });
48311                                         return oldFn.apply(self, args)
48312                                 }
48313
48314                                 // Give mixing function access to super_fn by prefixing all mixin function
48315                                 // arguments with super_fn.
48316                                 var newFnArgs = [super_fn].concat(args);
48317
48318                                 return pluginFnProp.apply(self, newFnArgs)
48319                         };
48320                 },
48321
48322                 _serialize: function(obj) {
48323                         return JSON.stringify(obj)
48324                 },
48325
48326                 _deserialize: function(strVal, defaultVal) {
48327                         if (!strVal) { return defaultVal }
48328                         // It is possible that a raw string value has been previously stored
48329                         // in a storage without using store.js, meaning it will be a raw
48330                         // string value instead of a JSON serialized string. By defaulting
48331                         // to the raw string value in case of a JSON parse error, we allow
48332                         // for past stored values to be forwards-compatible with store.js
48333                         var val = '';
48334                         try { val = JSON.parse(strVal); }
48335                         catch(e) { val = strVal; }
48336
48337                         return (val !== undefined ? val : defaultVal)
48338                 },
48339                 
48340                 _addStorage: function(storage) {
48341                         if (this.enabled) { return }
48342                         if (this._testStorage(storage)) {
48343                                 this.storage = storage;
48344                                 this.enabled = true;
48345                         }
48346                 },
48347
48348                 _addPlugin: function(plugin) {
48349                         var self = this;
48350
48351                         // If the plugin is an array, then add all plugins in the array.
48352                         // This allows for a plugin to depend on other plugins.
48353                         if (isList$1(plugin)) {
48354                                 each$1(plugin, function(plugin) {
48355                                         self._addPlugin(plugin);
48356                                 });
48357                                 return
48358                         }
48359
48360                         // Keep track of all plugins we've seen so far, so that we
48361                         // don't add any of them twice.
48362                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
48363                                 return (plugin === seenPlugin)
48364                         });
48365                         if (seenPlugin) {
48366                                 return
48367                         }
48368                         this.plugins.push(plugin);
48369
48370                         // Check that the plugin is properly formed
48371                         if (!isFunction$2(plugin)) {
48372                                 throw new Error('Plugins must be function values that return objects')
48373                         }
48374
48375                         var pluginProperties = plugin.call(this);
48376                         if (!isObject$2(pluginProperties)) {
48377                                 throw new Error('Plugins must return an object of function properties')
48378                         }
48379
48380                         // Add the plugin function properties to this store instance.
48381                         each$1(pluginProperties, function(pluginFnProp, propName) {
48382                                 if (!isFunction$2(pluginFnProp)) {
48383                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
48384                                 }
48385                                 self._assignPluginFnProp(pluginFnProp, propName);
48386                         });
48387                 },
48388                 
48389                 // Put deprecated properties in the private API, so as to not expose it to accidential
48390                 // discovery through inspection of the store object.
48391                 
48392                 // Deprecated: addStorage
48393                 addStorage: function(storage) {
48394                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
48395                         this._addStorage(storage);
48396                 }
48397         };
48398
48399         var store = create$3(_privateStoreProps, storeAPI, {
48400                 plugins: []
48401         });
48402         store.raw = {};
48403         each$1(store, function(prop, propName) {
48404                 if (isFunction$2(prop)) {
48405                         store.raw[propName] = bind$1(store, prop);                      
48406                 }
48407         });
48408         each$1(storages, function(storage) {
48409                 store._addStorage(storage);
48410         });
48411         each$1(plugins, function(plugin) {
48412                 store._addPlugin(plugin);
48413         });
48414         return store
48415   }
48416
48417   var Global$1 = util.Global;
48418
48419   var localStorage_1 = {
48420         name: 'localStorage',
48421         read: read,
48422         write: write,
48423         each: each$2,
48424         remove: remove$2,
48425         clearAll: clearAll,
48426   };
48427
48428   function localStorage$1() {
48429         return Global$1.localStorage
48430   }
48431
48432   function read(key) {
48433         return localStorage$1().getItem(key)
48434   }
48435
48436   function write(key, data) {
48437         return localStorage$1().setItem(key, data)
48438   }
48439
48440   function each$2(fn) {
48441         for (var i = localStorage$1().length - 1; i >= 0; i--) {
48442                 var key = localStorage$1().key(i);
48443                 fn(read(key), key);
48444         }
48445   }
48446
48447   function remove$2(key) {
48448         return localStorage$1().removeItem(key)
48449   }
48450
48451   function clearAll() {
48452         return localStorage$1().clear()
48453   }
48454
48455   // oldFF-globalStorage provides storage for Firefox
48456   // versions 6 and 7, where no localStorage, etc
48457   // is available.
48458
48459
48460   var Global$2 = util.Global;
48461
48462   var oldFFGlobalStorage = {
48463         name: 'oldFF-globalStorage',
48464         read: read$1,
48465         write: write$1,
48466         each: each$3,
48467         remove: remove$3,
48468         clearAll: clearAll$1,
48469   };
48470
48471   var globalStorage = Global$2.globalStorage;
48472
48473   function read$1(key) {
48474         return globalStorage[key]
48475   }
48476
48477   function write$1(key, data) {
48478         globalStorage[key] = data;
48479   }
48480
48481   function each$3(fn) {
48482         for (var i = globalStorage.length - 1; i >= 0; i--) {
48483                 var key = globalStorage.key(i);
48484                 fn(globalStorage[key], key);
48485         }
48486   }
48487
48488   function remove$3(key) {
48489         return globalStorage.removeItem(key)
48490   }
48491
48492   function clearAll$1() {
48493         each$3(function(key, _) {
48494                 delete globalStorage[key];
48495         });
48496   }
48497
48498   // oldIE-userDataStorage provides storage for Internet Explorer
48499   // versions 6 and 7, where no localStorage, sessionStorage, etc
48500   // is available.
48501
48502
48503   var Global$3 = util.Global;
48504
48505   var oldIEUserDataStorage = {
48506         name: 'oldIE-userDataStorage',
48507         write: write$2,
48508         read: read$2,
48509         each: each$4,
48510         remove: remove$4,
48511         clearAll: clearAll$2,
48512   };
48513
48514   var storageName = 'storejs';
48515   var doc = Global$3.document;
48516   var _withStorageEl = _makeIEStorageElFunction();
48517   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
48518
48519   function write$2(unfixedKey, data) {
48520         if (disable) { return }
48521         var fixedKey = fixKey(unfixedKey);
48522         _withStorageEl(function(storageEl) {
48523                 storageEl.setAttribute(fixedKey, data);
48524                 storageEl.save(storageName);
48525         });
48526   }
48527
48528   function read$2(unfixedKey) {
48529         if (disable) { return }
48530         var fixedKey = fixKey(unfixedKey);
48531         var res = null;
48532         _withStorageEl(function(storageEl) {
48533                 res = storageEl.getAttribute(fixedKey);
48534         });
48535         return res
48536   }
48537
48538   function each$4(callback) {
48539         _withStorageEl(function(storageEl) {
48540                 var attributes = storageEl.XMLDocument.documentElement.attributes;
48541                 for (var i=attributes.length-1; i>=0; i--) {
48542                         var attr = attributes[i];
48543                         callback(storageEl.getAttribute(attr.name), attr.name);
48544                 }
48545         });
48546   }
48547
48548   function remove$4(unfixedKey) {
48549         var fixedKey = fixKey(unfixedKey);
48550         _withStorageEl(function(storageEl) {
48551                 storageEl.removeAttribute(fixedKey);
48552                 storageEl.save(storageName);
48553         });
48554   }
48555
48556   function clearAll$2() {
48557         _withStorageEl(function(storageEl) {
48558                 var attributes = storageEl.XMLDocument.documentElement.attributes;
48559                 storageEl.load(storageName);
48560                 for (var i=attributes.length-1; i>=0; i--) {
48561                         storageEl.removeAttribute(attributes[i].name);
48562                 }
48563                 storageEl.save(storageName);
48564         });
48565   }
48566
48567   // Helpers
48568   //////////
48569
48570   // In IE7, keys cannot start with a digit or contain certain chars.
48571   // See https://github.com/marcuswestin/store.js/issues/40
48572   // See https://github.com/marcuswestin/store.js/issues/83
48573   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
48574   function fixKey(key) {
48575         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
48576   }
48577
48578   function _makeIEStorageElFunction() {
48579         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
48580                 return null
48581         }
48582         var scriptTag = 'script',
48583                 storageOwner,
48584                 storageContainer,
48585                 storageEl;
48586
48587         // Since #userData storage applies only to specific paths, we need to
48588         // somehow link our data to a specific path.  We choose /favicon.ico
48589         // as a pretty safe option, since all browsers already make a request to
48590         // this URL anyway and being a 404 will not hurt us here.  We wrap an
48591         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
48592         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
48593         // since the iframe access rules appear to allow direct access and
48594         // manipulation of the document element, even for a 404 page.  This
48595         // document can be used instead of the current document (which would
48596         // have been limited to the current path) to perform #userData storage.
48597         try {
48598                 /* global ActiveXObject */
48599                 storageContainer = new ActiveXObject('htmlfile');
48600                 storageContainer.open();
48601                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
48602                 storageContainer.close();
48603                 storageOwner = storageContainer.w.frames[0].document;
48604                 storageEl = storageOwner.createElement('div');
48605         } catch(e) {
48606                 // somehow ActiveXObject instantiation failed (perhaps some special
48607                 // security settings or otherwse), fall back to per-path storage
48608                 storageEl = doc.createElement('div');
48609                 storageOwner = doc.body;
48610         }
48611
48612         return function(storeFunction) {
48613                 var args = [].slice.call(arguments, 0);
48614                 args.unshift(storageEl);
48615                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
48616                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
48617                 storageOwner.appendChild(storageEl);
48618                 storageEl.addBehavior('#default#userData');
48619                 storageEl.load(storageName);
48620                 storeFunction.apply(this, args);
48621                 storageOwner.removeChild(storageEl);
48622                 return
48623         }
48624   }
48625
48626   // cookieStorage is useful Safari private browser mode, where localStorage
48627   // doesn't work but cookies do. This implementation is adopted from
48628   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
48629
48630
48631   var Global$4 = util.Global;
48632   var trim$1 = util.trim;
48633
48634   var cookieStorage = {
48635         name: 'cookieStorage',
48636         read: read$3,
48637         write: write$3,
48638         each: each$5,
48639         remove: remove$5,
48640         clearAll: clearAll$3,
48641   };
48642
48643   var doc$1 = Global$4.document;
48644
48645   function read$3(key) {
48646         if (!key || !_has(key)) { return null }
48647         var regexpStr = "(?:^|.*;\\s*)" +
48648                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
48649                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
48650         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
48651   }
48652
48653   function each$5(callback) {
48654         var cookies = doc$1.cookie.split(/; ?/g);
48655         for (var i = cookies.length - 1; i >= 0; i--) {
48656                 if (!trim$1(cookies[i])) {
48657                         continue
48658                 }
48659                 var kvp = cookies[i].split('=');
48660                 var key = unescape(kvp[0]);
48661                 var val = unescape(kvp[1]);
48662                 callback(val, key);
48663         }
48664   }
48665
48666   function write$3(key, data) {
48667         if(!key) { return }
48668         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
48669   }
48670
48671   function remove$5(key) {
48672         if (!key || !_has(key)) {
48673                 return
48674         }
48675         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
48676   }
48677
48678   function clearAll$3() {
48679         each$5(function(_, key) {
48680                 remove$5(key);
48681         });
48682   }
48683
48684   function _has(key) {
48685         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
48686   }
48687
48688   var Global$5 = util.Global;
48689
48690   var sessionStorage_1 = {
48691         name: 'sessionStorage',
48692         read: read$4,
48693         write: write$4,
48694         each: each$6,
48695         remove: remove$6,
48696         clearAll: clearAll$4
48697   };
48698
48699   function sessionStorage() {
48700         return Global$5.sessionStorage
48701   }
48702
48703   function read$4(key) {
48704         return sessionStorage().getItem(key)
48705   }
48706
48707   function write$4(key, data) {
48708         return sessionStorage().setItem(key, data)
48709   }
48710
48711   function each$6(fn) {
48712         for (var i = sessionStorage().length - 1; i >= 0; i--) {
48713                 var key = sessionStorage().key(i);
48714                 fn(read$4(key), key);
48715         }
48716   }
48717
48718   function remove$6(key) {
48719         return sessionStorage().removeItem(key)
48720   }
48721
48722   function clearAll$4() {
48723         return sessionStorage().clear()
48724   }
48725
48726   // memoryStorage is a useful last fallback to ensure that the store
48727   // is functions (meaning store.get(), store.set(), etc will all function).
48728   // However, stored values will not persist when the browser navigates to
48729   // a new page or reloads the current page.
48730
48731   var memoryStorage_1 = {
48732         name: 'memoryStorage',
48733         read: read$5,
48734         write: write$5,
48735         each: each$7,
48736         remove: remove$7,
48737         clearAll: clearAll$5,
48738   };
48739
48740   var memoryStorage = {};
48741
48742   function read$5(key) {
48743         return memoryStorage[key]
48744   }
48745
48746   function write$5(key, data) {
48747         memoryStorage[key] = data;
48748   }
48749
48750   function each$7(callback) {
48751         for (var key in memoryStorage) {
48752                 if (memoryStorage.hasOwnProperty(key)) {
48753                         callback(memoryStorage[key], key);
48754                 }
48755         }
48756   }
48757
48758   function remove$7(key) {
48759         delete memoryStorage[key];
48760   }
48761
48762   function clearAll$5(key) {
48763         memoryStorage = {};
48764   }
48765
48766   var all = [
48767         // Listed in order of usage preference
48768         localStorage_1,
48769         oldFFGlobalStorage,
48770         oldIEUserDataStorage,
48771         cookieStorage,
48772         sessionStorage_1,
48773         memoryStorage_1
48774   ];
48775
48776   /* eslint-disable */
48777
48778   //  json2.js
48779   //  2016-10-28
48780   //  Public Domain.
48781   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
48782   //  See http://www.JSON.org/js.html
48783   //  This code should be minified before deployment.
48784   //  See http://javascript.crockford.com/jsmin.html
48785
48786   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
48787   //  NOT CONTROL.
48788
48789   //  This file creates a global JSON object containing two methods: stringify
48790   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
48791   //  If a project might run on IE8 or earlier, then this file should be included.
48792   //  This file does nothing on ES5 systems.
48793
48794   //      JSON.stringify(value, replacer, space)
48795   //          value       any JavaScript value, usually an object or array.
48796   //          replacer    an optional parameter that determines how object
48797   //                      values are stringified for objects. It can be a
48798   //                      function or an array of strings.
48799   //          space       an optional parameter that specifies the indentation
48800   //                      of nested structures. If it is omitted, the text will
48801   //                      be packed without extra whitespace. If it is a number,
48802   //                      it will specify the number of spaces to indent at each
48803   //                      level. If it is a string (such as "\t" or "&nbsp;"),
48804   //                      it contains the characters used to indent at each level.
48805   //          This method produces a JSON text from a JavaScript value.
48806   //          When an object value is found, if the object contains a toJSON
48807   //          method, its toJSON method will be called and the result will be
48808   //          stringified. A toJSON method does not serialize: it returns the
48809   //          value represented by the name/value pair that should be serialized,
48810   //          or undefined if nothing should be serialized. The toJSON method
48811   //          will be passed the key associated with the value, and this will be
48812   //          bound to the value.
48813
48814   //          For example, this would serialize Dates as ISO strings.
48815
48816   //              Date.prototype.toJSON = function (key) {
48817   //                  function f(n) {
48818   //                      // Format integers to have at least two digits.
48819   //                      return (n < 10)
48820   //                          ? "0" + n
48821   //                          : n;
48822   //                  }
48823   //                  return this.getUTCFullYear()   + "-" +
48824   //                       f(this.getUTCMonth() + 1) + "-" +
48825   //                       f(this.getUTCDate())      + "T" +
48826   //                       f(this.getUTCHours())     + ":" +
48827   //                       f(this.getUTCMinutes())   + ":" +
48828   //                       f(this.getUTCSeconds())   + "Z";
48829   //              };
48830
48831   //          You can provide an optional replacer method. It will be passed the
48832   //          key and value of each member, with this bound to the containing
48833   //          object. The value that is returned from your method will be
48834   //          serialized. If your method returns undefined, then the member will
48835   //          be excluded from the serialization.
48836
48837   //          If the replacer parameter is an array of strings, then it will be
48838   //          used to select the members to be serialized. It filters the results
48839   //          such that only members with keys listed in the replacer array are
48840   //          stringified.
48841
48842   //          Values that do not have JSON representations, such as undefined or
48843   //          functions, will not be serialized. Such values in objects will be
48844   //          dropped; in arrays they will be replaced with null. You can use
48845   //          a replacer function to replace those with JSON values.
48846
48847   //          JSON.stringify(undefined) returns undefined.
48848
48849   //          The optional space parameter produces a stringification of the
48850   //          value that is filled with line breaks and indentation to make it
48851   //          easier to read.
48852
48853   //          If the space parameter is a non-empty string, then that string will
48854   //          be used for indentation. If the space parameter is a number, then
48855   //          the indentation will be that many spaces.
48856
48857   //          Example:
48858
48859   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
48860   //          // text is '["e",{"pluribus":"unum"}]'
48861
48862   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
48863   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
48864
48865   //          text = JSON.stringify([new Date()], function (key, value) {
48866   //              return this[key] instanceof Date
48867   //                  ? "Date(" + this[key] + ")"
48868   //                  : value;
48869   //          });
48870   //          // text is '["Date(---current time---)"]'
48871
48872   //      JSON.parse(text, reviver)
48873   //          This method parses a JSON text to produce an object or array.
48874   //          It can throw a SyntaxError exception.
48875
48876   //          The optional reviver parameter is a function that can filter and
48877   //          transform the results. It receives each of the keys and values,
48878   //          and its return value is used instead of the original value.
48879   //          If it returns what it received, then the structure is not modified.
48880   //          If it returns undefined then the member is deleted.
48881
48882   //          Example:
48883
48884   //          // Parse the text. Values that look like ISO date strings will
48885   //          // be converted to Date objects.
48886
48887   //          myData = JSON.parse(text, function (key, value) {
48888   //              var a;
48889   //              if (typeof value === "string") {
48890   //                  a =
48891   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
48892   //                  if (a) {
48893   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
48894   //                          +a[5], +a[6]));
48895   //                  }
48896   //              }
48897   //              return value;
48898   //          });
48899
48900   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
48901   //              var d;
48902   //              if (typeof value === "string" &&
48903   //                      value.slice(0, 5) === "Date(" &&
48904   //                      value.slice(-1) === ")") {
48905   //                  d = new Date(value.slice(5, -1));
48906   //                  if (d) {
48907   //                      return d;
48908   //                  }
48909   //              }
48910   //              return value;
48911   //          });
48912
48913   //  This is a reference implementation. You are free to copy, modify, or
48914   //  redistribute.
48915
48916   /*jslint
48917       eval, for, this
48918   */
48919
48920   /*property
48921       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
48922       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
48923       lastIndex, length, parse, prototype, push, replace, slice, stringify,
48924       test, toJSON, toString, valueOf
48925   */
48926
48927
48928   // Create a JSON object only if one does not already exist. We create the
48929   // methods in a closure to avoid creating global variables.
48930
48931   if (typeof JSON !== "object") {
48932       JSON = {};
48933   }
48934
48935   (function () {
48936
48937       var rx_one = /^[\],:{}\s]*$/;
48938       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
48939       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
48940       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
48941       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
48942       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
48943
48944       function f(n) {
48945           // Format integers to have at least two digits.
48946           return n < 10
48947               ? "0" + n
48948               : n;
48949       }
48950
48951       function this_value() {
48952           return this.valueOf();
48953       }
48954
48955       if (typeof Date.prototype.toJSON !== "function") {
48956
48957           Date.prototype.toJSON = function () {
48958
48959               return isFinite(this.valueOf())
48960                   ? this.getUTCFullYear() + "-" +
48961                           f(this.getUTCMonth() + 1) + "-" +
48962                           f(this.getUTCDate()) + "T" +
48963                           f(this.getUTCHours()) + ":" +
48964                           f(this.getUTCMinutes()) + ":" +
48965                           f(this.getUTCSeconds()) + "Z"
48966                   : null;
48967           };
48968
48969           Boolean.prototype.toJSON = this_value;
48970           Number.prototype.toJSON = this_value;
48971           String.prototype.toJSON = this_value;
48972       }
48973
48974       var gap;
48975       var indent;
48976       var meta;
48977       var rep;
48978
48979
48980       function quote(string) {
48981
48982   // If the string contains no control characters, no quote characters, and no
48983   // backslash characters, then we can safely slap some quotes around it.
48984   // Otherwise we must also replace the offending characters with safe escape
48985   // sequences.
48986
48987           rx_escapable.lastIndex = 0;
48988           return rx_escapable.test(string)
48989               ? "\"" + string.replace(rx_escapable, function (a) {
48990                   var c = meta[a];
48991                   return typeof c === "string"
48992                       ? c
48993                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
48994               }) + "\""
48995               : "\"" + string + "\"";
48996       }
48997
48998
48999       function str(key, holder) {
49000
49001   // Produce a string from holder[key].
49002
49003           var i;          // The loop counter.
49004           var k;          // The member key.
49005           var v;          // The member value.
49006           var length;
49007           var mind = gap;
49008           var partial;
49009           var value = holder[key];
49010
49011   // If the value has a toJSON method, call it to obtain a replacement value.
49012
49013           if (value && typeof value === "object" &&
49014                   typeof value.toJSON === "function") {
49015               value = value.toJSON(key);
49016           }
49017
49018   // If we were called with a replacer function, then call the replacer to
49019   // obtain a replacement value.
49020
49021           if (typeof rep === "function") {
49022               value = rep.call(holder, key, value);
49023           }
49024
49025   // What happens next depends on the value's type.
49026
49027           switch (typeof value) {
49028           case "string":
49029               return quote(value);
49030
49031           case "number":
49032
49033   // JSON numbers must be finite. Encode non-finite numbers as null.
49034
49035               return isFinite(value)
49036                   ? String(value)
49037                   : "null";
49038
49039           case "boolean":
49040           case "null":
49041
49042   // If the value is a boolean or null, convert it to a string. Note:
49043   // typeof null does not produce "null". The case is included here in
49044   // the remote chance that this gets fixed someday.
49045
49046               return String(value);
49047
49048   // If the type is "object", we might be dealing with an object or an array or
49049   // null.
49050
49051           case "object":
49052
49053   // Due to a specification blunder in ECMAScript, typeof null is "object",
49054   // so watch out for that case.
49055
49056               if (!value) {
49057                   return "null";
49058               }
49059
49060   // Make an array to hold the partial results of stringifying this object value.
49061
49062               gap += indent;
49063               partial = [];
49064
49065   // Is the value an array?
49066
49067               if (Object.prototype.toString.apply(value) === "[object Array]") {
49068
49069   // The value is an array. Stringify every element. Use null as a placeholder
49070   // for non-JSON values.
49071
49072                   length = value.length;
49073                   for (i = 0; i < length; i += 1) {
49074                       partial[i] = str(i, value) || "null";
49075                   }
49076
49077   // Join all of the elements together, separated with commas, and wrap them in
49078   // brackets.
49079
49080                   v = partial.length === 0
49081                       ? "[]"
49082                       : gap
49083                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
49084                           : "[" + partial.join(",") + "]";
49085                   gap = mind;
49086                   return v;
49087               }
49088
49089   // If the replacer is an array, use it to select the members to be stringified.
49090
49091               if (rep && typeof rep === "object") {
49092                   length = rep.length;
49093                   for (i = 0; i < length; i += 1) {
49094                       if (typeof rep[i] === "string") {
49095                           k = rep[i];
49096                           v = str(k, value);
49097                           if (v) {
49098                               partial.push(quote(k) + (
49099                                   gap
49100                                       ? ": "
49101                                       : ":"
49102                               ) + v);
49103                           }
49104                       }
49105                   }
49106               } else {
49107
49108   // Otherwise, iterate through all of the keys in the object.
49109
49110                   for (k in value) {
49111                       if (Object.prototype.hasOwnProperty.call(value, k)) {
49112                           v = str(k, value);
49113                           if (v) {
49114                               partial.push(quote(k) + (
49115                                   gap
49116                                       ? ": "
49117                                       : ":"
49118                               ) + v);
49119                           }
49120                       }
49121                   }
49122               }
49123
49124   // Join all of the member texts together, separated with commas,
49125   // and wrap them in braces.
49126
49127               v = partial.length === 0
49128                   ? "{}"
49129                   : gap
49130                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
49131                       : "{" + partial.join(",") + "}";
49132               gap = mind;
49133               return v;
49134           }
49135       }
49136
49137   // If the JSON object does not yet have a stringify method, give it one.
49138
49139       if (typeof JSON.stringify !== "function") {
49140           meta = {    // table of character substitutions
49141               "\b": "\\b",
49142               "\t": "\\t",
49143               "\n": "\\n",
49144               "\f": "\\f",
49145               "\r": "\\r",
49146               "\"": "\\\"",
49147               "\\": "\\\\"
49148           };
49149           JSON.stringify = function (value, replacer, space) {
49150
49151   // The stringify method takes a value and an optional replacer, and an optional
49152   // space parameter, and returns a JSON text. The replacer can be a function
49153   // that can replace values, or an array of strings that will select the keys.
49154   // A default replacer method can be provided. Use of the space parameter can
49155   // produce text that is more easily readable.
49156
49157               var i;
49158               gap = "";
49159               indent = "";
49160
49161   // If the space parameter is a number, make an indent string containing that
49162   // many spaces.
49163
49164               if (typeof space === "number") {
49165                   for (i = 0; i < space; i += 1) {
49166                       indent += " ";
49167                   }
49168
49169   // If the space parameter is a string, it will be used as the indent string.
49170
49171               } else if (typeof space === "string") {
49172                   indent = space;
49173               }
49174
49175   // If there is a replacer, it must be a function or an array.
49176   // Otherwise, throw an error.
49177
49178               rep = replacer;
49179               if (replacer && typeof replacer !== "function" &&
49180                       (typeof replacer !== "object" ||
49181                       typeof replacer.length !== "number")) {
49182                   throw new Error("JSON.stringify");
49183               }
49184
49185   // Make a fake root object containing our value under the key of "".
49186   // Return the result of stringifying the value.
49187
49188               return str("", {"": value});
49189           };
49190       }
49191
49192
49193   // If the JSON object does not yet have a parse method, give it one.
49194
49195       if (typeof JSON.parse !== "function") {
49196           JSON.parse = function (text, reviver) {
49197
49198   // The parse method takes a text and an optional reviver function, and returns
49199   // a JavaScript value if the text is a valid JSON text.
49200
49201               var j;
49202
49203               function walk(holder, key) {
49204
49205   // The walk method is used to recursively walk the resulting structure so
49206   // that modifications can be made.
49207
49208                   var k;
49209                   var v;
49210                   var value = holder[key];
49211                   if (value && typeof value === "object") {
49212                       for (k in value) {
49213                           if (Object.prototype.hasOwnProperty.call(value, k)) {
49214                               v = walk(value, k);
49215                               if (v !== undefined) {
49216                                   value[k] = v;
49217                               } else {
49218                                   delete value[k];
49219                               }
49220                           }
49221                       }
49222                   }
49223                   return reviver.call(holder, key, value);
49224               }
49225
49226
49227   // Parsing happens in four stages. In the first stage, we replace certain
49228   // Unicode characters with escape sequences. JavaScript handles many characters
49229   // incorrectly, either silently deleting them, or treating them as line endings.
49230
49231               text = String(text);
49232               rx_dangerous.lastIndex = 0;
49233               if (rx_dangerous.test(text)) {
49234                   text = text.replace(rx_dangerous, function (a) {
49235                       return "\\u" +
49236                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
49237                   });
49238               }
49239
49240   // In the second stage, we run the text against regular expressions that look
49241   // for non-JSON patterns. We are especially concerned with "()" and "new"
49242   // because they can cause invocation, and "=" because it can cause mutation.
49243   // But just to be safe, we want to reject all unexpected forms.
49244
49245   // We split the second stage into 4 regexp operations in order to work around
49246   // crippling inefficiencies in IE's and Safari's regexp engines. First we
49247   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
49248   // replace all simple value tokens with "]" characters. Third, we delete all
49249   // open brackets that follow a colon or comma or that begin the text. Finally,
49250   // we look to see that the remaining characters are only whitespace or "]" or
49251   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
49252
49253               if (
49254                   rx_one.test(
49255                       text
49256                           .replace(rx_two, "@")
49257                           .replace(rx_three, "]")
49258                           .replace(rx_four, "")
49259                   )
49260               ) {
49261
49262   // In the third stage we use the eval function to compile the text into a
49263   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
49264   // in JavaScript: it can begin a block or an object literal. We wrap the text
49265   // in parens to eliminate the ambiguity.
49266
49267                   j = eval("(" + text + ")");
49268
49269   // In the optional fourth stage, we recursively walk the new structure, passing
49270   // each name/value pair to a reviver function for possible transformation.
49271
49272                   return (typeof reviver === "function")
49273                       ? walk({"": j}, "")
49274                       : j;
49275               }
49276
49277   // If the text is not JSON parseable, then a SyntaxError is thrown.
49278
49279               throw new SyntaxError("JSON.parse");
49280           };
49281       }
49282   }());
49283
49284   var json2 = json2Plugin;
49285
49286   function json2Plugin() {
49287         
49288         return {}
49289   }
49290
49291   var plugins = [json2];
49292
49293   var store_legacy = storeEngine.createStore(all, plugins);
49294
49295   // # osm-auth
49296   //
49297   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
49298   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
49299   // does not support custom headers, which this uses everywhere.
49300   var osmAuth = function(o) {
49301
49302       var oauth = {};
49303
49304       // authenticated users will also have a request token secret, but it's
49305       // not used in transactions with the server
49306       oauth.authenticated = function() {
49307           return !!(token('oauth_token') && token('oauth_token_secret'));
49308       };
49309
49310       oauth.logout = function() {
49311           token('oauth_token', '');
49312           token('oauth_token_secret', '');
49313           token('oauth_request_token_secret', '');
49314           return oauth;
49315       };
49316
49317       // TODO: detect lack of click event
49318       oauth.authenticate = function(callback) {
49319           if (oauth.authenticated()) return callback();
49320
49321           oauth.logout();
49322
49323           // ## Getting a request token
49324           var params = timenonce(getAuth(o)),
49325               url = o.url + '/oauth/request_token';
49326
49327           params.oauth_signature = ohauth_1.signature(
49328               o.oauth_secret, '',
49329               ohauth_1.baseString('POST', url, params));
49330
49331           if (!o.singlepage) {
49332               // Create a 600x550 popup window in the center of the screen
49333               var w = 600, h = 550,
49334                   settings = [
49335                       ['width', w], ['height', h],
49336                       ['left', screen.width / 2 - w / 2],
49337                       ['top', screen.height / 2 - h / 2]].map(function(x) {
49338                           return x.join('=');
49339                       }).join(','),
49340                   popup = window.open('about:blank', 'oauth_window', settings);
49341           }
49342
49343           // Request a request token. When this is complete, the popup
49344           // window is redirected to OSM's authorization page.
49345           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
49346           o.loading();
49347
49348           function reqTokenDone(err, xhr) {
49349               o.done();
49350               if (err) return callback(err);
49351               var resp = ohauth_1.stringQs(xhr.response);
49352               token('oauth_request_token_secret', resp.oauth_token_secret);
49353               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
49354                   oauth_token: resp.oauth_token,
49355                   oauth_callback: resolveUrl(o.landing)
49356               });
49357
49358               if (o.singlepage) {
49359                   location.href = authorize_url;
49360               } else {
49361                   popup.location = authorize_url;
49362               }
49363           }
49364
49365           // Called by a function in a landing page, in the popup window. The
49366           // window closes itself.
49367           window.authComplete = function(token) {
49368               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
49369               get_access_token(oauth_token.oauth_token);
49370               delete window.authComplete;
49371           };
49372
49373           // ## Getting an request token
49374           //
49375           // At this point we have an `oauth_token`, brought in from a function
49376           // call on a landing page popup.
49377           function get_access_token(oauth_token) {
49378               var url = o.url + '/oauth/access_token',
49379                   params = timenonce(getAuth(o)),
49380                   request_token_secret = token('oauth_request_token_secret');
49381               params.oauth_token = oauth_token;
49382               params.oauth_signature = ohauth_1.signature(
49383                   o.oauth_secret,
49384                   request_token_secret,
49385                   ohauth_1.baseString('POST', url, params));
49386
49387               // ## Getting an access token
49388               //
49389               // The final token required for authentication. At this point
49390               // we have a `request token secret`
49391               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
49392               o.loading();
49393           }
49394
49395           function accessTokenDone(err, xhr) {
49396               o.done();
49397               if (err) return callback(err);
49398               var access_token = ohauth_1.stringQs(xhr.response);
49399               token('oauth_token', access_token.oauth_token);
49400               token('oauth_token_secret', access_token.oauth_token_secret);
49401               callback(null, oauth);
49402           }
49403       };
49404
49405       oauth.bootstrapToken = function(oauth_token, callback) {
49406           // ## Getting an request token
49407           // At this point we have an `oauth_token`, brought in from a function
49408           // call on a landing page popup.
49409           function get_access_token(oauth_token) {
49410               var url = o.url + '/oauth/access_token',
49411                   params = timenonce(getAuth(o)),
49412                   request_token_secret = token('oauth_request_token_secret');
49413               params.oauth_token = oauth_token;
49414               params.oauth_signature = ohauth_1.signature(
49415                   o.oauth_secret,
49416                   request_token_secret,
49417                   ohauth_1.baseString('POST', url, params));
49418
49419               // ## Getting an access token
49420               // The final token required for authentication. At this point
49421               // we have a `request token secret`
49422               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
49423               o.loading();
49424           }
49425
49426           function accessTokenDone(err, xhr) {
49427               o.done();
49428               if (err) return callback(err);
49429               var access_token = ohauth_1.stringQs(xhr.response);
49430               token('oauth_token', access_token.oauth_token);
49431               token('oauth_token_secret', access_token.oauth_token_secret);
49432               callback(null, oauth);
49433           }
49434
49435           get_access_token(oauth_token);
49436       };
49437
49438       // # xhr
49439       //
49440       // A single XMLHttpRequest wrapper that does authenticated calls if the
49441       // user has logged in.
49442       oauth.xhr = function(options, callback) {
49443           if (!oauth.authenticated()) {
49444               if (o.auto) {
49445                   return oauth.authenticate(run);
49446               } else {
49447                   callback('not authenticated', null);
49448                   return;
49449               }
49450           } else {
49451               return run();
49452           }
49453
49454           function run() {
49455               var params = timenonce(getAuth(o)),
49456                   oauth_token_secret = token('oauth_token_secret'),
49457                   url = (options.prefix !== false) ? o.url + options.path : options.path,
49458                   url_parts = url.replace(/#.*$/, '').split('?', 2),
49459                   base_url = url_parts[0],
49460                   query = (url_parts.length === 2) ? url_parts[1] : '';
49461
49462               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
49463               if ((!options.options || !options.options.header ||
49464                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
49465                   options.content) {
49466                   params = immutable(params, ohauth_1.stringQs(options.content));
49467               }
49468
49469               params.oauth_token = token('oauth_token');
49470               params.oauth_signature = ohauth_1.signature(
49471                   o.oauth_secret,
49472                   oauth_token_secret,
49473                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
49474               );
49475
49476               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
49477           }
49478
49479           function done(err, xhr) {
49480               if (err) return callback(err);
49481               else if (xhr.responseXML) return callback(err, xhr.responseXML);
49482               else return callback(err, xhr.response);
49483           }
49484       };
49485
49486       // pre-authorize this object, if we can just get a token and token_secret
49487       // from the start
49488       oauth.preauth = function(c) {
49489           if (!c) return;
49490           if (c.oauth_token) token('oauth_token', c.oauth_token);
49491           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
49492           return oauth;
49493       };
49494
49495       oauth.options = function(_) {
49496           if (!arguments.length) return o;
49497
49498           o = _;
49499           o.url = o.url || 'https://www.openstreetmap.org';
49500           o.landing = o.landing || 'land.html';
49501           o.singlepage = o.singlepage || false;
49502
49503           // Optional loading and loading-done functions for nice UI feedback.
49504           // by default, no-ops
49505           o.loading = o.loading || function() {};
49506           o.done = o.done || function() {};
49507
49508           return oauth.preauth(o);
49509       };
49510
49511       // 'stamp' an authentication object from `getAuth()`
49512       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
49513       // and timestamp
49514       function timenonce(o) {
49515           o.oauth_timestamp = ohauth_1.timestamp();
49516           o.oauth_nonce = ohauth_1.nonce();
49517           return o;
49518       }
49519
49520       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
49521       // can be used with multiple APIs and the keys in `localStorage`
49522       // will not clash
49523       var token;
49524
49525       if (store_legacy.enabled) {
49526           token = function (x, y) {
49527               if (arguments.length === 1) return store_legacy.get(o.url + x);
49528               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
49529           };
49530       } else {
49531           var storage = {};
49532           token = function (x, y) {
49533               if (arguments.length === 1) return storage[o.url + x];
49534               else if (arguments.length === 2) return storage[o.url + x] = y;
49535           };
49536       }
49537
49538       // Get an authentication object. If you just add and remove properties
49539       // from a single object, you'll need to use `delete` to make sure that
49540       // it doesn't contain undesired properties for authentication
49541       function getAuth(o) {
49542           return {
49543               oauth_consumer_key: o.oauth_consumer_key,
49544               oauth_signature_method: 'HMAC-SHA1'
49545           };
49546       }
49547
49548       // potentially pre-authorize
49549       oauth.options(o);
49550
49551       return oauth;
49552   };
49553
49554   var JXON = new (function () {
49555     var
49556       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
49557       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
49558
49559     function parseText (sValue) {
49560       if (rIsNull.test(sValue)) { return null; }
49561       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
49562       if (isFinite(sValue)) { return parseFloat(sValue); }
49563       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
49564       return sValue;
49565     }
49566
49567     function EmptyTree () { }
49568     EmptyTree.prototype.toString = function () { return 'null'; };
49569     EmptyTree.prototype.valueOf = function () { return null; };
49570
49571     function objectify (vValue) {
49572       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
49573     }
49574
49575     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
49576       var
49577         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
49578         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
49579
49580       var
49581         sProp, vContent, nLength = 0, sCollectedTxt = '',
49582         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
49583
49584       if (bChildren) {
49585         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
49586           oNode = oParentNode.childNodes.item(nItem);
49587           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
49588           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
49589           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
49590         }
49591       }
49592
49593       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
49594
49595       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
49596
49597       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
49598         sProp = aCache[nElId].nodeName.toLowerCase();
49599         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
49600         if (vResult.hasOwnProperty(sProp)) {
49601           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
49602           vResult[sProp].push(vContent);
49603         } else {
49604           vResult[sProp] = vContent;
49605           nLength++;
49606         }
49607       }
49608
49609       if (bAttributes) {
49610         var
49611           nAttrLen = oParentNode.attributes.length,
49612           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
49613
49614         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
49615           oAttrib = oParentNode.attributes.item(nAttrib);
49616           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
49617         }
49618
49619         if (bNesteAttr) {
49620           if (bFreeze) { Object.freeze(oAttrParent); }
49621           vResult[sAttributesProp] = oAttrParent;
49622           nLength -= nAttrLen - 1;
49623         }
49624       }
49625
49626       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
49627         vResult[sValueProp] = vBuiltVal;
49628       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
49629         vResult = vBuiltVal;
49630       }
49631
49632       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
49633
49634       aCache.length = nLevelStart;
49635
49636       return vResult;
49637     }
49638
49639     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
49640       var vValue, oChild;
49641
49642       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
49643         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
49644       } else if (oParentObj.constructor === Date) {
49645         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
49646       }
49647
49648       for (var sName in oParentObj) {
49649         vValue = oParentObj[sName];
49650         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
49651         if (sName === sValueProp) {
49652           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
49653         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
49654           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
49655         } else if (sName.charAt(0) === sAttrPref) {
49656           oParentEl.setAttribute(sName.slice(1), vValue);
49657         } else if (vValue.constructor === Array) {
49658           for (var nItem = 0; nItem < vValue.length; nItem++) {
49659             oChild = oXMLDoc.createElement(sName);
49660             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
49661             oParentEl.appendChild(oChild);
49662           }
49663         } else {
49664           oChild = oXMLDoc.createElement(sName);
49665           if (vValue instanceof Object) {
49666             loadObjTree(oXMLDoc, oChild, vValue);
49667           } else if (vValue !== null && vValue !== true) {
49668             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
49669           }
49670           oParentEl.appendChild(oChild);
49671        }
49672      }
49673     }
49674
49675     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
49676       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
49677       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
49678     };
49679
49680     this.unbuild = function (oObjTree) {    
49681       var oNewDoc = document.implementation.createDocument('', '', null);
49682       loadObjTree(oNewDoc, oNewDoc, oObjTree);
49683       return oNewDoc;
49684     };
49685
49686     this.stringify = function (oObjTree) {
49687       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
49688     };
49689   })();
49690
49691   // var myObject = JXON.build(doc);
49692   // we got our javascript object! try: alert(JSON.stringify(myObject));
49693
49694   // var newDoc = JXON.unbuild(myObject);
49695   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
49696
49697   var tiler$4 = utilTiler();
49698   var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
49699   var urlroot = 'https://www.openstreetmap.org';
49700   var oauth = osmAuth({
49701       url: urlroot,
49702       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
49703       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
49704       loading: authLoading,
49705       done: authDone
49706   });
49707
49708   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
49709   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
49710   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
49711   var _userCache = { toLoad: {}, user: {} };
49712   var _changeset = {};
49713
49714   var _connectionID = 1;
49715   var _tileZoom = 16;
49716   var _noteZoom = 12;
49717   var _rateLimitError;
49718   var _userChangesets;
49719   var _userDetails;
49720   var _off;
49721
49722
49723   function authLoading() {
49724       dispatch$5.call('authLoading');
49725   }
49726
49727
49728   function authDone() {
49729       dispatch$5.call('authDone');
49730   }
49731
49732
49733   function abortRequest$4(i) {
49734       if (i) {
49735           i.abort();
49736       }
49737   }
49738
49739
49740   function abortUnwantedRequests$2(cache, tiles) {
49741       forEach(cache.inflight, function(v, k) {
49742           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
49743           if (!wanted) {
49744               abortRequest$4(v);
49745               delete cache.inflight[k];
49746           }
49747       });
49748   }
49749
49750
49751   function getLoc(attrs) {
49752       var lon = attrs.lon && attrs.lon.value;
49753       var lat = attrs.lat && attrs.lat.value;
49754       return [parseFloat(lon), parseFloat(lat)];
49755   }
49756
49757
49758   function getNodes(obj) {
49759       var elems = obj.getElementsByTagName('nd');
49760       var nodes = new Array(elems.length);
49761       for (var i = 0, l = elems.length; i < l; i++) {
49762           nodes[i] = 'n' + elems[i].attributes.ref.value;
49763       }
49764       return nodes;
49765   }
49766
49767
49768   function getTags(obj) {
49769       var elems = obj.getElementsByTagName('tag');
49770       var tags = {};
49771       for (var i = 0, l = elems.length; i < l; i++) {
49772           var attrs = elems[i].attributes;
49773           tags[attrs.k.value] = attrs.v.value;
49774       }
49775
49776       return tags;
49777   }
49778
49779
49780   function getMembers(obj) {
49781       var elems = obj.getElementsByTagName('member');
49782       var members = new Array(elems.length);
49783       for (var i = 0, l = elems.length; i < l; i++) {
49784           var attrs = elems[i].attributes;
49785           members[i] = {
49786               id: attrs.type.value[0] + attrs.ref.value,
49787               type: attrs.type.value,
49788               role: attrs.role.value
49789           };
49790       }
49791       return members;
49792   }
49793
49794
49795   function getVisible(attrs) {
49796       return (!attrs.visible || attrs.visible.value !== 'false');
49797   }
49798
49799
49800   function parseComments(comments) {
49801       var parsedComments = [];
49802
49803       // for each comment
49804       for (var i = 0; i < comments.length; i++) {
49805           var comment = comments[i];
49806           if (comment.nodeName === 'comment') {
49807               var childNodes = comment.childNodes;
49808               var parsedComment = {};
49809
49810               for (var j = 0; j < childNodes.length; j++) {
49811                   var node = childNodes[j];
49812                   var nodeName = node.nodeName;
49813                   if (nodeName === '#text') continue;
49814                   parsedComment[nodeName] = node.textContent;
49815
49816                   if (nodeName === 'uid') {
49817                       var uid = node.textContent;
49818                       if (uid && !_userCache.user[uid]) {
49819                           _userCache.toLoad[uid] = true;
49820                       }
49821                   }
49822               }
49823
49824               if (parsedComment) {
49825                   parsedComments.push(parsedComment);
49826               }
49827           }
49828       }
49829       return parsedComments;
49830   }
49831
49832
49833   function encodeNoteRtree(note) {
49834       return {
49835           minX: note.loc[0],
49836           minY: note.loc[1],
49837           maxX: note.loc[0],
49838           maxY: note.loc[1],
49839           data: note
49840       };
49841   }
49842
49843
49844   var parsers = {
49845       node: function nodeData(obj, uid) {
49846           var attrs = obj.attributes;
49847           return new osmNode({
49848               id: uid,
49849               visible: getVisible(attrs),
49850               version: attrs.version.value,
49851               changeset: attrs.changeset && attrs.changeset.value,
49852               timestamp: attrs.timestamp && attrs.timestamp.value,
49853               user: attrs.user && attrs.user.value,
49854               uid: attrs.uid && attrs.uid.value,
49855               loc: getLoc(attrs),
49856               tags: getTags(obj)
49857           });
49858       },
49859
49860       way: function wayData(obj, uid) {
49861           var attrs = obj.attributes;
49862           return new osmWay({
49863               id: uid,
49864               visible: getVisible(attrs),
49865               version: attrs.version.value,
49866               changeset: attrs.changeset && attrs.changeset.value,
49867               timestamp: attrs.timestamp && attrs.timestamp.value,
49868               user: attrs.user && attrs.user.value,
49869               uid: attrs.uid && attrs.uid.value,
49870               tags: getTags(obj),
49871               nodes: getNodes(obj),
49872           });
49873       },
49874
49875       relation: function relationData(obj, uid) {
49876           var attrs = obj.attributes;
49877           return new osmRelation({
49878               id: uid,
49879               visible: getVisible(attrs),
49880               version: attrs.version.value,
49881               changeset: attrs.changeset && attrs.changeset.value,
49882               timestamp: attrs.timestamp && attrs.timestamp.value,
49883               user: attrs.user && attrs.user.value,
49884               uid: attrs.uid && attrs.uid.value,
49885               tags: getTags(obj),
49886               members: getMembers(obj)
49887           });
49888       },
49889
49890       note: function parseNote(obj, uid) {
49891           var attrs = obj.attributes;
49892           var childNodes = obj.childNodes;
49893           var props = {};
49894
49895           props.id = uid;
49896           props.loc = getLoc(attrs);
49897
49898           // if notes are coincident, move them apart slightly
49899           var coincident = false;
49900           var epsilon = 0.00001;
49901           do {
49902               if (coincident) {
49903                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
49904               }
49905               var bbox = geoExtent(props.loc).bbox();
49906               coincident = _noteCache.rtree.search(bbox).length;
49907           } while (coincident);
49908
49909           // parse note contents
49910           for (var i = 0; i < childNodes.length; i++) {
49911               var node = childNodes[i];
49912               var nodeName = node.nodeName;
49913               if (nodeName === '#text') continue;
49914
49915               // if the element is comments, parse the comments
49916               if (nodeName === 'comments') {
49917                   props[nodeName] = parseComments(node.childNodes);
49918               } else {
49919                   props[nodeName] = node.textContent;
49920               }
49921           }
49922
49923           var note = new osmNote(props);
49924           var item = encodeNoteRtree(note);
49925           _noteCache.note[note.id] = note;
49926           _noteCache.rtree.insert(item);
49927
49928           return note;
49929       },
49930
49931       user: function parseUser(obj, uid) {
49932           var attrs = obj.attributes;
49933           var user = {
49934               id: uid,
49935               display_name: attrs.display_name && attrs.display_name.value,
49936               account_created: attrs.account_created && attrs.account_created.value,
49937               changesets_count: 0
49938           };
49939
49940           var img = obj.getElementsByTagName('img');
49941           if (img && img[0] && img[0].getAttribute('href')) {
49942               user.image_url = img[0].getAttribute('href');
49943           }
49944
49945           var changesets = obj.getElementsByTagName('changesets');
49946           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
49947               user.changesets_count = changesets[0].getAttribute('count');
49948           }
49949
49950           _userCache.user[uid] = user;
49951           delete _userCache.toLoad[uid];
49952           return user;
49953       }
49954   };
49955
49956
49957   function parseXML(xml, callback, options) {
49958       options = assignIn({ skipSeen: true }, options);
49959       if (!xml || !xml.childNodes) {
49960           return callback({ message: 'No XML', status: -1 });
49961       }
49962
49963       var root = xml.childNodes[0];
49964       var children = root.childNodes;
49965       utilIdleWorker(children, parseChild, done);
49966
49967
49968       function done(results) {
49969           callback(null, results);
49970       }
49971
49972       function parseChild(child) {
49973           var parser = parsers[child.nodeName];
49974           if (!parser) return null;
49975
49976           var uid;
49977           if (child.nodeName === 'user') {
49978               uid = child.attributes.id.value;
49979               if (options.skipSeen && _userCache.user[uid]) {
49980                   delete _userCache.toLoad[uid];
49981                   return null;
49982               }
49983
49984           } else if (child.nodeName === 'note') {
49985               uid = child.getElementsByTagName('id')[0].textContent;
49986
49987           } else {
49988               uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
49989               if (options.skipSeen) {
49990                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
49991                   _tileCache.seen[uid] = true;
49992               }
49993           }
49994
49995           return parser(child, uid);
49996       }
49997   }
49998
49999
50000   // replace or remove note from rtree
50001   function updateRtree$2(item, replace) {
50002       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
50003
50004       if (replace) {
50005           _noteCache.rtree.insert(item);
50006       }
50007   }
50008
50009
50010   function wrapcb(thisArg, callback, cid) {
50011       return function(err, result) {
50012           if (err) {
50013               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
50014               if (err.status === 400 || err.status === 401 || err.status === 403) {
50015                   thisArg.logout();
50016               }
50017               return callback.call(thisArg, err);
50018
50019           } else if (thisArg.getConnectionId() !== cid) {
50020               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
50021
50022           } else {
50023               return callback.call(thisArg, err, result);
50024           }
50025       };
50026   }
50027
50028
50029   var serviceOsm = {
50030
50031       init: function() {
50032           utilRebind(this, dispatch$5, 'on');
50033       },
50034
50035
50036       reset: function() {
50037           _connectionID++;
50038           _userChangesets = undefined;
50039           _userDetails = undefined;
50040           _rateLimitError = undefined;
50041
50042           forEach(_tileCache.inflight, abortRequest$4);
50043           forEach(_noteCache.inflight, abortRequest$4);
50044           forEach(_noteCache.inflightPost, abortRequest$4);
50045           if (_changeset.inflight) abortRequest$4(_changeset.inflight);
50046
50047           _tileCache = { loaded: {}, inflight: {}, seen: {} };
50048           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
50049           _userCache = { toLoad: {}, user: {} };
50050           _changeset = {};
50051
50052           return this;
50053       },
50054
50055
50056       getConnectionId: function() {
50057           return _connectionID;
50058       },
50059
50060
50061       changesetURL: function(changesetID) {
50062           return urlroot + '/changeset/' + changesetID;
50063       },
50064
50065
50066       changesetsURL: function(center, zoom) {
50067           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
50068           return urlroot + '/history#map=' +
50069               Math.floor(zoom) + '/' +
50070               center[1].toFixed(precision) + '/' +
50071               center[0].toFixed(precision);
50072       },
50073
50074
50075       entityURL: function(entity) {
50076           return urlroot + '/' + entity.type + '/' + entity.osmId();
50077       },
50078
50079
50080       historyURL: function(entity) {
50081           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
50082       },
50083
50084
50085       userURL: function(username) {
50086           return urlroot + '/user/' + username;
50087       },
50088
50089
50090       noteURL: function(note) {
50091           return urlroot + '/note/' + note.id;
50092       },
50093
50094
50095       noteReportURL: function(note) {
50096           return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
50097       },
50098
50099
50100       // Generic method to load data from the OSM API
50101       // Can handle either auth or unauth calls.
50102       loadFromAPI: function(path, callback, options) {
50103           options = assignIn({ skipSeen: true }, options);
50104           var that = this;
50105           var cid = _connectionID;
50106
50107           function done(err, xml) {
50108               if (that.getConnectionId() !== cid) {
50109                   if (callback) callback({ message: 'Connection Switched', status: -1 });
50110                   return;
50111               }
50112
50113               var isAuthenticated = that.authenticated();
50114
50115               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
50116               // Logout and retry the request..
50117               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
50118                   that.logout();
50119                   that.loadFromAPI(path, callback, options);
50120
50121               // else, no retry..
50122               } else {
50123                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
50124                   // Set the rateLimitError flag and trigger a warning..
50125                   if (!isAuthenticated && !_rateLimitError && err &&
50126                           (err.status === 509 || err.status === 429)) {
50127                       _rateLimitError = err;
50128                       dispatch$5.call('change');
50129                   }
50130
50131                   if (callback) {
50132                       if (err) {
50133                           return callback(err);
50134                       } else {
50135                           return parseXML(xml, callback, options);
50136                       }
50137                   }
50138               }
50139           }
50140
50141           if (this.authenticated()) {
50142               return oauth.xhr({ method: 'GET', path: path }, done);
50143           } else {
50144               var url = urlroot + path;
50145               return d3_xml(url).get(done);
50146           }
50147       },
50148
50149
50150       // Load a single entity by id (ways and relations use the `/full` call)
50151       // GET /api/0.6/node/#id
50152       // GET /api/0.6/[way|relation]/#id/full
50153       loadEntity: function(id, callback) {
50154           var type = osmEntity.id.type(id);
50155           var osmID = osmEntity.id.toOSM(id);
50156           var options = { skipSeen: false };
50157
50158           this.loadFromAPI(
50159               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
50160               function(err, entities) {
50161                   if (callback) callback(err, { data: entities });
50162               },
50163               options
50164           );
50165       },
50166
50167
50168       // Load a single entity with a specific version
50169       // GET /api/0.6/[node|way|relation]/#id/#version
50170       loadEntityVersion: function(id, version, callback) {
50171           var type = osmEntity.id.type(id);
50172           var osmID = osmEntity.id.toOSM(id);
50173           var options = { skipSeen: false };
50174
50175           this.loadFromAPI(
50176               '/api/0.6/' + type + '/' + osmID + '/' + version,
50177               function(err, entities) {
50178                   if (callback) callback(err, { data: entities });
50179               },
50180               options
50181           );
50182       },
50183
50184
50185       // Load multiple entities in chunks
50186       // (note: callback may be called multiple times)
50187       // GET /api/0.6/[nodes|ways|relations]?#parameters
50188       loadMultiple: function(ids, callback) {
50189           var that = this;
50190
50191           forEach(groupBy(uniq(ids), osmEntity.id.type), function(v, k) {
50192               var type = k + 's';
50193               var osmIDs = map$3(v, osmEntity.id.toOSM);
50194               var options = { skipSeen: false };
50195
50196               forEach(chunk(osmIDs, 150), function(arr) {
50197                   that.loadFromAPI(
50198                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
50199                       function(err, entities) {
50200                           if (callback) callback(err, { data: entities });
50201                       },
50202                       options
50203                   );
50204               });
50205           });
50206       },
50207
50208
50209       // Create, upload, and close a changeset
50210       // PUT /api/0.6/changeset/create
50211       // POST /api/0.6/changeset/#id/upload
50212       // PUT /api/0.6/changeset/#id/close
50213       putChangeset: function(changeset, changes, callback) {
50214           var cid = _connectionID;
50215
50216           if (_changeset.inflight) {
50217               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
50218
50219           } else if (_changeset.open) {   // reuse existing open changeset..
50220               return createdChangeset.call(this, null, _changeset.open);
50221
50222           } else {   // Open a new changeset..
50223               var options = {
50224                   method: 'PUT',
50225                   path: '/api/0.6/changeset/create',
50226                   options: { header: { 'Content-Type': 'text/xml' } },
50227                   content: JXON.stringify(changeset.asJXON())
50228               };
50229               _changeset.inflight = oauth.xhr(
50230                   options,
50231                   wrapcb(this, createdChangeset, cid)
50232               );
50233           }
50234
50235
50236           function createdChangeset(err, changesetID) {
50237               _changeset.inflight = null;
50238               if (err) { return callback(err, changeset); }
50239
50240               _changeset.open = changesetID;
50241               changeset = changeset.update({ id: changesetID });
50242
50243               // Upload the changeset..
50244               var options = {
50245                   method: 'POST',
50246                   path: '/api/0.6/changeset/' + changesetID + '/upload',
50247                   options: { header: { 'Content-Type': 'text/xml' } },
50248                   content: JXON.stringify(changeset.osmChangeJXON(changes))
50249               };
50250               _changeset.inflight = oauth.xhr(
50251                   options,
50252                   wrapcb(this, uploadedChangeset, cid)
50253               );
50254           }
50255
50256
50257           function uploadedChangeset(err) {
50258               _changeset.inflight = null;
50259               if (err) return callback(err, changeset);
50260
50261               // Upload was successful, safe to call the callback.
50262               // Add delay to allow for postgres replication #1646 #2678
50263               window.setTimeout(function() { callback(null, changeset); }, 2500);
50264               _changeset.open = null;
50265
50266               // At this point, we don't really care if the connection was switched..
50267               // Only try to close the changeset if we're still talking to the same server.
50268               if (this.getConnectionId() === cid) {
50269                   // Still attempt to close changeset, but ignore response because #2667
50270                   oauth.xhr({
50271                       method: 'PUT',
50272                       path: '/api/0.6/changeset/' + changeset.id + '/close',
50273                       options: { header: { 'Content-Type': 'text/xml' } }
50274                   }, function() { return true; });
50275               }
50276           }
50277       },
50278
50279
50280       // Load multiple users in chunks
50281       // (note: callback may be called multiple times)
50282       // GET /api/0.6/users?users=#id1,#id2,...,#idn
50283       loadUsers: function(uids, callback) {
50284           var toLoad = [];
50285           var cached = [];
50286
50287           uniq(uids).forEach(function(uid) {
50288               if (_userCache.user[uid]) {
50289                   delete _userCache.toLoad[uid];
50290                   cached.push(_userCache.user[uid]);
50291               } else {
50292                   toLoad.push(uid);
50293               }
50294           });
50295
50296           if (cached.length || !this.authenticated()) {
50297               callback(undefined, cached);
50298               if (!this.authenticated()) return;  // require auth
50299           }
50300
50301           chunk(toLoad, 150).forEach(function(arr) {
50302               oauth.xhr(
50303                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
50304                   wrapcb(this, done, _connectionID)
50305               );
50306           }.bind(this));
50307
50308           function done(err, xml) {
50309               if (err) { return callback(err); }
50310
50311               var options = { skipSeen: true };
50312               return parseXML(xml, function(err, results) {
50313                   if (err) {
50314                       return callback(err);
50315                   } else {
50316                       return callback(undefined, results);
50317                   }
50318               }, options);
50319           }
50320       },
50321
50322
50323       // Load a given user by id
50324       // GET /api/0.6/user/#id
50325       loadUser: function(uid, callback) {
50326           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
50327               delete _userCache.toLoad[uid];
50328               return callback(undefined, _userCache.user[uid]);
50329           }
50330
50331           oauth.xhr(
50332               { method: 'GET', path: '/api/0.6/user/' + uid },
50333               wrapcb(this, done, _connectionID)
50334           );
50335
50336           function done(err, xml) {
50337               if (err) { return callback(err); }
50338
50339               var options = { skipSeen: true };
50340               return parseXML(xml, function(err, results) {
50341                   if (err) {
50342                       return callback(err);
50343                   } else {
50344                       return callback(undefined, results[0]);
50345                   }
50346               }, options);
50347           }
50348       },
50349
50350
50351       // Load the details of the logged-in user
50352       // GET /api/0.6/user/details
50353       userDetails: function(callback) {
50354           if (_userDetails) {    // retrieve cached
50355               return callback(undefined, _userDetails);
50356           }
50357
50358           oauth.xhr(
50359               { method: 'GET', path: '/api/0.6/user/details' },
50360               wrapcb(this, done, _connectionID)
50361           );
50362
50363           function done(err, xml) {
50364               if (err) { return callback(err); }
50365
50366               var options = { skipSeen: false };
50367               return parseXML(xml, function(err, results) {
50368                   if (err) {
50369                       return callback(err);
50370                   } else {
50371                       _userDetails = results[0];
50372                       return callback(undefined, _userDetails);
50373                   }
50374               }, options);
50375           }
50376       },
50377
50378
50379       // Load previous changesets for the logged in user
50380       // GET /api/0.6/changesets?user=#id
50381       userChangesets: function(callback) {
50382           if (_userChangesets) {    // retrieve cached
50383               return callback(undefined, _userChangesets);
50384           }
50385
50386           this.userDetails(
50387               wrapcb(this, gotDetails, _connectionID)
50388           );
50389
50390
50391           function gotDetails(err, user) {
50392               if (err) { return callback(err); }
50393
50394               oauth.xhr(
50395                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
50396                   wrapcb(this, done, _connectionID)
50397               );
50398           }
50399
50400           function done(err, xml) {
50401               if (err) { return callback(err); }
50402
50403               _userChangesets = Array.prototype.map.call(
50404                   xml.getElementsByTagName('changeset'),
50405                   function (changeset) { return { tags: getTags(changeset) }; }
50406               ).filter(function (changeset) {
50407                   var comment = changeset.tags.comment;
50408                   return comment && comment !== '';
50409               });
50410
50411               return callback(undefined, _userChangesets);
50412           }
50413       },
50414
50415
50416       // Fetch the status of the OSM API
50417       // GET /api/capabilities
50418       status: function(callback) {
50419           d3_xml(urlroot + '/api/capabilities').get(
50420               wrapcb(this, done, _connectionID)
50421           );
50422
50423           function done(err, xml) {
50424               if (err) { return callback(err); }
50425
50426               // update blacklists
50427               var elements = xml.getElementsByTagName('blacklist');
50428               var regexes = [];
50429               for (var i = 0; i < elements.length; i++) {
50430                   var regex = elements[i].getAttribute('regex');  // needs unencode?
50431                   if (regex) {
50432                       regexes.push(regex);
50433                   }
50434               }
50435               if (regexes.length) {
50436                   _blacklists = regexes;
50437               }
50438
50439               if (_rateLimitError) {
50440                   return callback(_rateLimitError, 'rateLimited');
50441               } else {
50442                   var apiStatus = xml.getElementsByTagName('status');
50443                   var val = apiStatus[0].getAttribute('api');
50444                   return callback(undefined, val);
50445               }
50446           }
50447       },
50448
50449
50450       // Load data (entities) from the API in tiles
50451       // GET /api/0.6/map?bbox=
50452       loadTiles: function(projection, callback) {
50453           if (_off) return;
50454
50455           var that = this;
50456           var path = '/api/0.6/map?bbox=';
50457
50458           // determine the needed tiles to cover the view
50459           var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
50460
50461           // abort inflight requests that are no longer needed
50462           var hadRequests = !isEmpty(_tileCache.inflight);
50463           abortUnwantedRequests$2(_tileCache, tiles);
50464           if (hadRequests && isEmpty(_tileCache.inflight)) {
50465               dispatch$5.call('loaded');    // stop the spinner
50466           }
50467
50468           // issue new requests..
50469           tiles.forEach(function(tile) {
50470               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
50471               if (isEmpty(_tileCache.inflight)) {
50472                   dispatch$5.call('loading');   // start the spinner
50473               }
50474
50475               var options = { skipSeen: true };
50476               _tileCache.inflight[tile.id] = that.loadFromAPI(
50477                   path + tile.extent.toParam(),
50478                   function(err, parsed) {
50479                       delete _tileCache.inflight[tile.id];
50480                       if (!err) {
50481                           _tileCache.loaded[tile.id] = true;
50482                       }
50483                       if (callback) {
50484                           callback(err, assignIn({ data: parsed }, tile));
50485                       }
50486                       if (isEmpty(_tileCache.inflight)) {
50487                           dispatch$5.call('loaded');     // stop the spinner
50488                       }
50489                   },
50490                   options
50491               );
50492           });
50493       },
50494
50495
50496       // Load notes from the API in tiles
50497       // GET /api/0.6/notes?bbox=
50498       loadNotes: function(projection, noteOptions) {
50499           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
50500           if (_off) return;
50501
50502           var that = this;
50503           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
50504           var throttleLoadUsers = throttle(function() {
50505               var uids = Object.keys(_userCache.toLoad);
50506               if (!uids.length) return;
50507               that.loadUsers(uids, function() {});  // eagerly load user details
50508           }, 750);
50509
50510           // determine the needed tiles to cover the view
50511           var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
50512
50513           // abort inflight requests that are no longer needed
50514           abortUnwantedRequests$2(_noteCache, tiles);
50515
50516           // issue new requests..
50517           tiles.forEach(function(tile) {
50518               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
50519
50520               var options = { skipSeen: false };
50521               _noteCache.inflight[tile.id] = that.loadFromAPI(
50522                   path + tile.extent.toParam(),
50523                   function(err) {
50524                       delete _noteCache.inflight[tile.id];
50525                       if (!err) {
50526                           _noteCache.loaded[tile.id] = true;
50527                       }
50528                       throttleLoadUsers();
50529                       dispatch$5.call('loadedNotes');
50530                   },
50531                   options
50532               );
50533           });
50534       },
50535
50536
50537       // Create a note
50538       // POST /api/0.6/notes?params
50539       postNoteCreate: function(note, callback) {
50540           if (!this.authenticated()) {
50541               return callback({ message: 'Not Authenticated', status: -3 }, note);
50542           }
50543           if (_noteCache.inflightPost[note.id]) {
50544               return callback({ message: 'Note update already inflight', status: -2 }, note);
50545           }
50546
50547           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
50548
50549           var comment = note.newComment;
50550           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
50551
50552           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
50553
50554           _noteCache.inflightPost[note.id] = oauth.xhr(
50555               { method: 'POST', path: path },
50556               wrapcb(this, done, _connectionID)
50557           );
50558
50559
50560           function done(err, xml) {
50561               delete _noteCache.inflightPost[note.id];
50562               if (err) { return callback(err); }
50563
50564               // we get the updated note back, remove from caches and reparse..
50565               this.removeNote(note);
50566
50567               var options = { skipSeen: false };
50568               return parseXML(xml, function(err, results) {
50569                   if (err) {
50570                       return callback(err);
50571                   } else {
50572                       return callback(undefined, results[0]);
50573                   }
50574               }, options);
50575           }
50576       },
50577
50578
50579       // Update a note
50580       // POST /api/0.6/notes/#id/comment?text=comment
50581       // POST /api/0.6/notes/#id/close?text=comment
50582       // POST /api/0.6/notes/#id/reopen?text=comment
50583       postNoteUpdate: function(note, newStatus, callback) {
50584           if (!this.authenticated()) {
50585               return callback({ message: 'Not Authenticated', status: -3 }, note);
50586           }
50587           if (_noteCache.inflightPost[note.id]) {
50588               return callback({ message: 'Note update already inflight', status: -2 }, note);
50589           }
50590
50591           var action;
50592           if (note.status !== 'closed' && newStatus === 'closed') {
50593               action = 'close';
50594           } else if (note.status !== 'open' && newStatus === 'open') {
50595               action = 'reopen';
50596           } else {
50597               action = 'comment';
50598               if (!note.newComment) return; // when commenting, comment required
50599           }
50600
50601           var path = '/api/0.6/notes/' + note.id + '/' + action;
50602           if (note.newComment) {
50603               path += '?' + utilQsString({ text: note.newComment });
50604           }
50605
50606           _noteCache.inflightPost[note.id] = oauth.xhr(
50607               { method: 'POST', path: path },
50608               wrapcb(this, done, _connectionID)
50609           );
50610
50611
50612           function done(err, xml) {
50613               delete _noteCache.inflightPost[note.id];
50614               if (err) { return callback(err); }
50615
50616               // we get the updated note back, remove from caches and reparse..
50617               this.removeNote(note);
50618
50619               // update closed note cache - used to populate `closed:note` changeset tag
50620               if (action === 'close') {
50621                   _noteCache.closed[note.id] = true;
50622               } else if (action === 'reopen') {
50623                   delete _noteCache.closed[note.id];
50624               }
50625
50626               var options = { skipSeen: false };
50627               return parseXML(xml, function(err, results) {
50628                   if (err) {
50629                       return callback(err);
50630                   } else {
50631                       return callback(undefined, results[0]);
50632                   }
50633               }, options);
50634           }
50635       },
50636
50637
50638       switch: function(options) {
50639           urlroot = options.urlroot;
50640
50641           oauth.options(assignIn({
50642               url: urlroot,
50643               loading: authLoading,
50644               done: authDone
50645           }, options));
50646
50647           this.reset();
50648           this.userChangesets(function() {});  // eagerly load user details/changesets
50649           dispatch$5.call('change');
50650           return this;
50651       },
50652
50653
50654       toggle: function(_) {
50655           _off = !_;
50656           return this;
50657       },
50658
50659
50660       isChangesetInflight: function() {
50661           return !!_changeset.inflight;
50662       },
50663
50664
50665       // get/set cached data
50666       // This is used to save/restore the state when entering/exiting the walkthrough
50667       // Also used for testing purposes.
50668       caches: function(obj) {
50669           if (!arguments.length) {
50670               return {
50671                   tile: cloneDeep(_tileCache),
50672                   note: cloneDeep(_noteCache),
50673                   user: cloneDeep(_userCache)
50674               };
50675           }
50676
50677           // access caches directly for testing (e.g., loading notes rtree)
50678           if (obj === 'get') {
50679               return {
50680                   tile: _tileCache,
50681                   note: _noteCache,
50682                   user: _userCache
50683               };
50684           }
50685
50686           if (obj.tile) {
50687               _tileCache = obj.tile;
50688               _tileCache.inflight = {};
50689           }
50690           if (obj.note) {
50691               _noteCache = obj.note;
50692               _noteCache.inflight = {};
50693               _noteCache.inflightPost = {};
50694           }
50695           if (obj.user) {
50696               _userCache = obj.user;
50697           }
50698
50699           return this;
50700       },
50701
50702
50703       logout: function() {
50704           _userChangesets = undefined;
50705           _userDetails = undefined;
50706           oauth.logout();
50707           dispatch$5.call('change');
50708           return this;
50709       },
50710
50711
50712       authenticated: function() {
50713           return oauth.authenticated();
50714       },
50715
50716
50717       authenticate: function(callback) {
50718           var that = this;
50719           var cid = _connectionID;
50720           _userChangesets = undefined;
50721           _userDetails = undefined;
50722
50723           function done(err, res) {
50724               if (err) {
50725                   if (callback) callback(err);
50726                   return;
50727               }
50728               if (that.getConnectionId() !== cid) {
50729                   if (callback) callback({ message: 'Connection Switched', status: -1 });
50730                   return;
50731               }
50732               _rateLimitError = undefined;
50733               dispatch$5.call('change');
50734               if (callback) callback(err, res);
50735               that.userChangesets(function() {});  // eagerly load user details/changesets
50736           }
50737
50738           return oauth.authenticate(done);
50739       },
50740
50741
50742       imageryBlacklists: function() {
50743           return _blacklists;
50744       },
50745
50746
50747       tileZoom: function(_) {
50748           if (!arguments.length) return _tileZoom;
50749           _tileZoom = _;
50750           return this;
50751       },
50752
50753
50754       // get all cached notes covering the viewport
50755       notes: function(projection) {
50756           var viewport = projection.clipExtent();
50757           var min = [viewport[0][0], viewport[1][1]];
50758           var max = [viewport[1][0], viewport[0][1]];
50759           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50760
50761           return _noteCache.rtree.search(bbox)
50762               .map(function(d) { return d.data; });
50763       },
50764
50765
50766       // get a single note from the cache
50767       getNote: function(id) {
50768           return _noteCache.note[id];
50769       },
50770
50771
50772       // remove a single note from the cache
50773       removeNote: function(note) {
50774           if (!(note instanceof osmNote) || !note.id) return;
50775
50776           delete _noteCache.note[note.id];
50777           updateRtree$2(encodeNoteRtree(note), false);  // false = remove
50778       },
50779
50780
50781       // replace a single note in the cache
50782       replaceNote: function(note) {
50783           if (!(note instanceof osmNote) || !note.id) return;
50784
50785           _noteCache.note[note.id] = note;
50786           updateRtree$2(encodeNoteRtree(note), true);  // true = replace
50787           return note;
50788       },
50789
50790
50791       // Get an array of note IDs closed during this session.
50792       // Used to populate `closed:note` changeset tag
50793       getClosedIDs: function() {
50794           return Object.keys(_noteCache.closed).sort();
50795       }
50796
50797   };
50798
50799   var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
50800   var _inflight = {};
50801   var _wikibaseCache = {};
50802   var _localeIDs = { en: false };
50803
50804
50805   var debouncedRequest = debounce(request$1, 500, { leading: false });
50806
50807   function request$1(url, callback) {
50808       if (_inflight[url]) return;
50809
50810       _inflight[url] = d3_json(url, function (err, data) {
50811           delete _inflight[url];
50812           callback(err, data);
50813       });
50814   }
50815
50816
50817   /**
50818    * Get the best string value from the descriptions/labels result
50819    * Note that if mediawiki doesn't recognize language code, it will return all values.
50820    * In that case, fallback to use English.
50821    * @param values object - either descriptions or labels
50822    * @param langCode String
50823    * @returns localized string
50824    */
50825   function localizedToString(values, langCode) {
50826       if (values) {
50827           values = values[langCode] || values.en;
50828       }
50829       return values ? values.value : '';
50830   }
50831
50832
50833   var serviceOsmWikibase = {
50834
50835       init: function() {
50836           _inflight = {};
50837           _wikibaseCache = {};
50838           _localeIDs = {};
50839       },
50840
50841
50842       reset: function() {
50843           forEach(_inflight, function(req) { req.abort(); });
50844           _inflight = {};
50845       },
50846
50847
50848       /**
50849        * Get the best value for the property, or undefined if not found
50850        * @param entity object from wikibase
50851        * @param property string e.g. 'P4' for image
50852        * @param langCode string e.g. 'fr' for French
50853        */
50854       claimToValue: function(entity, property, langCode) {
50855           if (!entity.claims[property]) return undefined;
50856           var locale = _localeIDs[langCode];
50857           var preferredPick, localePick;
50858
50859           forEach(entity.claims[property], function(stmt) {
50860               // If exists, use value limited to the needed language (has a qualifier P26 = locale)
50861               // Or if not found, use the first value with the "preferred" rank
50862               if (!preferredPick && stmt.rank === 'preferred') {
50863                   preferredPick = stmt;
50864               }
50865               if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
50866                   stmt.qualifiers.P26[0].datavalue.value.id === locale
50867               ) {
50868                   localePick = stmt;
50869               }
50870           });
50871
50872           var result = localePick || preferredPick;
50873           if (result) {
50874               var datavalue = result.mainsnak.datavalue;
50875               return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
50876           } else {
50877               return undefined;
50878           }
50879       },
50880
50881
50882       /**
50883        * Convert monolingual property into a key-value object (language -> value)
50884        * @param entity object from wikibase
50885        * @param property string e.g. 'P31' for monolingual wiki page title
50886        */
50887       monolingualClaimToValueObj: function(entity, property) {
50888           if (!entity || !entity.claims[property]) return undefined;
50889
50890           return entity.claims[property].reduce(function(acc, obj) {
50891               var value = obj.mainsnak.datavalue.value;
50892               acc[value.language] = value.text;
50893               return acc;
50894           }, {});
50895       },
50896
50897
50898       toSitelink: function(key, value) {
50899           var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
50900           return result.replace(/_/g, ' ').trim();
50901       },
50902
50903
50904       //
50905       // Pass params object of the form:
50906       // {
50907       //   key: 'string',
50908       //   value: 'string',
50909       //   rtype: 'string',
50910       //   langCode: 'string'
50911       // }
50912       //
50913       getEntity: function(params, callback) {
50914           var doRequest = params.debounce ? debouncedRequest : request$1;
50915           var that = this;
50916           var titles = [];
50917           var result = {};
50918           var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
50919           var keySitelink = params.key ? this.toSitelink(params.key) : false;
50920           var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
50921           var localeSitelink;
50922
50923           if (params.langCode && _localeIDs[params.langCode] === undefined) {
50924               // If this is the first time we are asking about this locale,
50925               // fetch corresponding entity (if it exists), and cache it.
50926               // If there is no such entry, cache `false` value to avoid re-requesting it.
50927               localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
50928               titles.push(localeSitelink);
50929           }
50930
50931           if (rtypeSitelink) {
50932               if (_wikibaseCache[rtypeSitelink]) {
50933                   result.rtype = _wikibaseCache[rtypeSitelink];
50934               } else {
50935                   titles.push(rtypeSitelink);
50936               }
50937           }
50938
50939           if (keySitelink) {
50940               if (_wikibaseCache[keySitelink]) {
50941                   result.key = _wikibaseCache[keySitelink];
50942               } else {
50943                   titles.push(keySitelink);
50944               }
50945           }
50946
50947           if (tagSitelink) {
50948               if (_wikibaseCache[tagSitelink]) {
50949                   result.tag = _wikibaseCache[tagSitelink];
50950               } else {
50951                   titles.push(tagSitelink);
50952               }
50953           }
50954
50955           if (!titles.length) {
50956               // Nothing to do, we already had everything in the cache
50957               return callback(null, result);
50958           }
50959
50960           // Requesting just the user language code
50961           // If backend recognizes the code, it will perform proper fallbacks,
50962           // and the result will contain the requested code. If not, all values are returned:
50963           // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
50964           // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
50965           var obj = {
50966               action: 'wbgetentities',
50967               sites: 'wiki',
50968               titles: titles.join('|'),
50969               languages: params.langCode,
50970               languagefallback: 1,
50971               origin: '*',
50972               format: 'json',
50973               // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
50974               // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
50975               // formatversion: 2,
50976           };
50977
50978           var url = apibase$3 + '?' + utilQsString(obj);
50979           doRequest(url, function(err, d) {
50980               if (err) {
50981                   callback(err);
50982               } else if (!d.success || d.error) {
50983                   callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
50984               } else {
50985                   var localeID = false;
50986                   forEach(d.entities, function(res) {
50987                       if (res.missing !== '') {
50988                           // Simplify access to the localized values
50989                           res.description = localizedToString(res.descriptions, params.langCode);
50990                           res.label = localizedToString(res.labels, params.langCode);
50991
50992                           var title = res.sitelinks.wiki.title;
50993                           if (title === rtypeSitelink) {
50994                               _wikibaseCache[rtypeSitelink] = res;
50995                               result.rtype = res;
50996                           } else if (title === keySitelink) {
50997                               _wikibaseCache[keySitelink] = res;
50998                               result.key = res;
50999                           } else if (title === tagSitelink) {
51000                               _wikibaseCache[tagSitelink] = res;
51001                               result.tag = res;
51002                           } else if (title === localeSitelink) {
51003                               localeID = res.id;
51004                           } else {
51005                               console.log('Unexpected title ' + title);  // eslint-disable-line no-console
51006                           }
51007                       }
51008                   });
51009
51010                   if (localeSitelink) {
51011                       // If locale ID is not found, store false to prevent repeated queries
51012                       that.addLocale(params.langCode, localeID);
51013                   }
51014
51015                   callback(null, result);
51016               }
51017           });
51018       },
51019
51020
51021       //
51022       // Pass params object of the form:
51023       // {
51024       //   key: 'string',     // required
51025       //   value: 'string'    // optional
51026       // }
51027       //   -or-
51028       // {
51029       //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
51030       // }
51031       //
51032       // Get an result object used to display tag documentation
51033       // {
51034       //   title:        'string',
51035       //   description:  'string',
51036       //   editURL:      'string',
51037       //   imageURL:     'string',
51038       //   wiki:         { title: 'string', text: 'string', url: 'string' }
51039       // }
51040       //
51041       getDocs: function(params, callback) {
51042           var that = this;
51043           var langCode = utilDetect().locale.toLowerCase();
51044           params.langCode = langCode;
51045
51046           this.getEntity(params, function(err, data) {
51047               if (err) {
51048                   callback(err);
51049                   return;
51050               }
51051
51052               var entity = data.rtype || data.tag || data.key;
51053               if (!entity) {
51054                   callback('No entity');
51055                   return;
51056               }
51057
51058               // prepare result
51059               var result = {
51060                   title: entity.title,
51061                   description: entity.description,
51062                   editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
51063               };
51064
51065               // add image
51066               if (entity.claims) {
51067                   var imageroot;
51068                   var image = that.claimToValue(entity, 'P4', langCode);
51069                   if (image) {
51070                       imageroot = 'https://commons.wikimedia.org/w/index.php';
51071                   } else {
51072                       image = that.claimToValue(entity, 'P28', langCode);
51073                       if (image) {
51074                           imageroot = 'https://wiki.openstreetmap.org/w/index.php';
51075                       }
51076                   }
51077                   if (imageroot && image) {
51078                       result.imageURL = imageroot + '?' + utilQsString({
51079                           title: 'Special:Redirect/file/' + image,
51080                           width: 400
51081                       });
51082                   }
51083               }
51084
51085               // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
51086               // If neither tag nor key data item contain a wiki page in the needed language nor English,
51087               // get the first found wiki page from either the tag or the key item.
51088               var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
51089               var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
51090               var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
51091
51092               // If exact language code does not exist, try to find the first part before the '-'
51093               // BUG: in some cases, a more elaborate fallback logic might be needed
51094               var langPrefix = langCode.split('-', 2)[0];
51095
51096               // use the first acceptable wiki page
51097               result.wiki =
51098                   getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
51099                   getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
51100                   getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
51101                   getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
51102                   getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
51103                   getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
51104                   getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
51105                   getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
51106                   getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
51107
51108               callback(null, result);
51109
51110
51111               // Helper method to get wiki info if a given language exists
51112               function getWikiInfo(wiki, langCode, tKey) {
51113                   if (wiki && wiki[langCode]) {
51114                       return {
51115                           title: wiki[langCode],
51116                           text: tKey,
51117                           url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
51118                       };
51119                   }
51120               }
51121           });
51122       },
51123
51124
51125       addLocale: function(langCode, qid) {
51126           // Makes it easier to unit test
51127           _localeIDs[langCode] = qid;
51128       },
51129
51130
51131       apibase: function(val) {
51132           if (!arguments.length) return apibase$3;
51133           apibase$3 = val;
51134           return this;
51135       }
51136
51137   };
51138
51139   var jsonpCache = {};
51140   window.jsonpCache = jsonpCache;
51141
51142   function jsonpRequest(url, callback) {
51143       var request = {
51144           abort: function() {}
51145       };
51146
51147       if (window.JSONP_FIX) {
51148           if (window.JSONP_DELAY === 0) {
51149               callback(window.JSONP_FIX);
51150           } else {
51151               var t = window.setTimeout(function() {
51152                   callback(window.JSONP_FIX);
51153               }, window.JSONP_DELAY || 0);
51154
51155               request.abort = function() { window.clearTimeout(t); };
51156           }
51157
51158           return request;
51159       }
51160
51161       function rand() {
51162           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
51163           var c = '';
51164           var i = -1;
51165           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
51166           return c;
51167       }
51168
51169       function create(url) {
51170           var e = url.match(/callback=(\w+)/);
51171           var c = e ? e[1] : rand();
51172
51173           jsonpCache[c] = function(data) {
51174               if (jsonpCache[c]) {
51175                   callback(data);
51176               }
51177               finalize();
51178           };
51179
51180           function finalize() {
51181               delete jsonpCache[c];
51182               script.remove();
51183           }
51184
51185           request.abort = finalize;
51186           return 'jsonpCache.' + c;
51187       }
51188
51189       var cb = create(url);
51190
51191       var script = select('head')
51192           .append('script')
51193           .attr('type', 'text/javascript')
51194           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
51195
51196       return request;
51197   }
51198
51199   var q = createCommonjsModule(function (module, exports) {
51200   // vim:ts=4:sts=4:sw=4:
51201   /*!
51202    *
51203    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
51204    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
51205    *
51206    * With parts by Tyler Close
51207    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
51208    * at http://www.opensource.org/licenses/mit-license.html
51209    * Forked at ref_send.js version: 2009-05-11
51210    *
51211    * With parts by Mark Miller
51212    * Copyright (C) 2011 Google Inc.
51213    *
51214    * Licensed under the Apache License, Version 2.0 (the "License");
51215    * you may not use this file except in compliance with the License.
51216    * You may obtain a copy of the License at
51217    *
51218    * http://www.apache.org/licenses/LICENSE-2.0
51219    *
51220    * Unless required by applicable law or agreed to in writing, software
51221    * distributed under the License is distributed on an "AS IS" BASIS,
51222    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
51223    * See the License for the specific language governing permissions and
51224    * limitations under the License.
51225    *
51226    */
51227
51228   (function (definition) {
51229
51230       // This file will function properly as a <script> tag, or a module
51231       // using CommonJS and NodeJS or RequireJS module formats.  In
51232       // Common/Node/RequireJS, the module exports the Q API and when
51233       // executed as a simple <script>, it creates a Q global instead.
51234
51235       // Montage Require
51236       if (typeof bootstrap === "function") {
51237           bootstrap("promise", definition);
51238
51239       // CommonJS
51240       } else {
51241           module.exports = definition();
51242
51243       // RequireJS
51244       }
51245
51246   })(function () {
51247
51248   var hasStacks = false;
51249   try {
51250       throw new Error();
51251   } catch (e) {
51252       hasStacks = !!e.stack;
51253   }
51254
51255   // All code after this point will be filtered from stack traces reported
51256   // by Q.
51257   var qStartingLine = captureLine();
51258   var qFileName;
51259
51260   // shims
51261
51262   // used for fallback in "allResolved"
51263   var noop = function () {};
51264
51265   // Use the fastest possible means to execute a task in a future turn
51266   // of the event loop.
51267   var nextTick =(function () {
51268       // linked list of tasks (single, with head node)
51269       var head = {task: void 0, next: null};
51270       var tail = head;
51271       var flushing = false;
51272       var requestTick = void 0;
51273       var isNodeJS = false;
51274       // queue for late tasks, used by unhandled rejection tracking
51275       var laterQueue = [];
51276
51277       function flush() {
51278           /* jshint loopfunc: true */
51279           var task, domain;
51280
51281           while (head.next) {
51282               head = head.next;
51283               task = head.task;
51284               head.task = void 0;
51285               domain = head.domain;
51286
51287               if (domain) {
51288                   head.domain = void 0;
51289                   domain.enter();
51290               }
51291               runSingle(task, domain);
51292
51293           }
51294           while (laterQueue.length) {
51295               task = laterQueue.pop();
51296               runSingle(task);
51297           }
51298           flushing = false;
51299       }
51300       // runs a single function in the async queue
51301       function runSingle(task, domain) {
51302           try {
51303               task();
51304
51305           } catch (e) {
51306               if (isNodeJS) {
51307                   // In node, uncaught exceptions are considered fatal errors.
51308                   // Re-throw them synchronously to interrupt flushing!
51309
51310                   // Ensure continuation if the uncaught exception is suppressed
51311                   // listening "uncaughtException" events (as domains does).
51312                   // Continue in next event to avoid tick recursion.
51313                   if (domain) {
51314                       domain.exit();
51315                   }
51316                   setTimeout(flush, 0);
51317                   if (domain) {
51318                       domain.enter();
51319                   }
51320
51321                   throw e;
51322
51323               } else {
51324                   // In browsers, uncaught exceptions are not fatal.
51325                   // Re-throw them asynchronously to avoid slow-downs.
51326                   setTimeout(function () {
51327                       throw e;
51328                   }, 0);
51329               }
51330           }
51331
51332           if (domain) {
51333               domain.exit();
51334           }
51335       }
51336
51337       nextTick = function (task) {
51338           tail = tail.next = {
51339               task: task,
51340               domain: isNodeJS && process.domain,
51341               next: null
51342           };
51343
51344           if (!flushing) {
51345               flushing = true;
51346               requestTick();
51347           }
51348       };
51349
51350       if (typeof process === "object" &&
51351           process.toString() === "[object process]" && process.nextTick) {
51352           // Ensure Q is in a real Node environment, with a `process.nextTick`.
51353           // To see through fake Node environments:
51354           // * Mocha test runner - exposes a `process` global without a `nextTick`
51355           // * Browserify - exposes a `process.nexTick` function that uses
51356           //   `setTimeout`. In this case `setImmediate` is preferred because
51357           //    it is faster. Browserify's `process.toString()` yields
51358           //   "[object Object]", while in a real Node environment
51359           //   `process.toString()` yields "[object process]".
51360           isNodeJS = true;
51361
51362           requestTick = function () {
51363               process.nextTick(flush);
51364           };
51365
51366       } else if (typeof setImmediate === "function") {
51367           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
51368           if (typeof window !== "undefined") {
51369               requestTick = setImmediate.bind(window, flush);
51370           } else {
51371               requestTick = function () {
51372                   setImmediate(flush);
51373               };
51374           }
51375
51376       } else if (typeof MessageChannel !== "undefined") {
51377           // modern browsers
51378           // http://www.nonblocking.io/2011/06/windownexttick.html
51379           var channel = new MessageChannel();
51380           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
51381           // working message ports the first time a page loads.
51382           channel.port1.onmessage = function () {
51383               requestTick = requestPortTick;
51384               channel.port1.onmessage = flush;
51385               flush();
51386           };
51387           var requestPortTick = function () {
51388               // Opera requires us to provide a message payload, regardless of
51389               // whether we use it.
51390               channel.port2.postMessage(0);
51391           };
51392           requestTick = function () {
51393               setTimeout(flush, 0);
51394               requestPortTick();
51395           };
51396
51397       } else {
51398           // old browsers
51399           requestTick = function () {
51400               setTimeout(flush, 0);
51401           };
51402       }
51403       // runs a task after all other tasks have been run
51404       // this is useful for unhandled rejection tracking that needs to happen
51405       // after all `then`d tasks have been run.
51406       nextTick.runAfter = function (task) {
51407           laterQueue.push(task);
51408           if (!flushing) {
51409               flushing = true;
51410               requestTick();
51411           }
51412       };
51413       return nextTick;
51414   })();
51415
51416   // Attempt to make generics safe in the face of downstream
51417   // modifications.
51418   // There is no situation where this is necessary.
51419   // If you need a security guarantee, these primordials need to be
51420   // deeply frozen anyway, and if you don’t need a security guarantee,
51421   // this is just plain paranoid.
51422   // However, this **might** have the nice side-effect of reducing the size of
51423   // the minified code by reducing x.call() to merely x()
51424   // See Mark Miller’s explanation of what this does.
51425   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
51426   var call = Function.call;
51427   function uncurryThis(f) {
51428       return function () {
51429           return call.apply(f, arguments);
51430       };
51431   }
51432   // This is equivalent, but slower:
51433   // uncurryThis = Function_bind.bind(Function_bind.call);
51434   // http://jsperf.com/uncurrythis
51435
51436   var array_slice = uncurryThis(Array.prototype.slice);
51437
51438   var array_reduce = uncurryThis(
51439       Array.prototype.reduce || function (callback, basis) {
51440           var index = 0,
51441               length = this.length;
51442           // concerning the initial value, if one is not provided
51443           if (arguments.length === 1) {
51444               // seek to the first value in the array, accounting
51445               // for the possibility that is is a sparse array
51446               do {
51447                   if (index in this) {
51448                       basis = this[index++];
51449                       break;
51450                   }
51451                   if (++index >= length) {
51452                       throw new TypeError();
51453                   }
51454               } while (1);
51455           }
51456           // reduce
51457           for (; index < length; index++) {
51458               // account for the possibility that the array is sparse
51459               if (index in this) {
51460                   basis = callback(basis, this[index], index);
51461               }
51462           }
51463           return basis;
51464       }
51465   );
51466
51467   var array_indexOf = uncurryThis(
51468       Array.prototype.indexOf || function (value) {
51469           // not a very good shim, but good enough for our one use of it
51470           for (var i = 0; i < this.length; i++) {
51471               if (this[i] === value) {
51472                   return i;
51473               }
51474           }
51475           return -1;
51476       }
51477   );
51478
51479   var array_map = uncurryThis(
51480       Array.prototype.map || function (callback, thisp) {
51481           var self = this;
51482           var collect = [];
51483           array_reduce(self, function (undefined$1, value, index) {
51484               collect.push(callback.call(thisp, value, index, self));
51485           }, void 0);
51486           return collect;
51487       }
51488   );
51489
51490   var object_create = Object.create || function (prototype) {
51491       function Type() { }
51492       Type.prototype = prototype;
51493       return new Type();
51494   };
51495
51496   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
51497       obj[prop] = descriptor.value;
51498       return obj;
51499   };
51500
51501   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
51502
51503   var object_keys = Object.keys || function (object) {
51504       var keys = [];
51505       for (var key in object) {
51506           if (object_hasOwnProperty(object, key)) {
51507               keys.push(key);
51508           }
51509       }
51510       return keys;
51511   };
51512
51513   var object_toString = uncurryThis(Object.prototype.toString);
51514
51515   function isObject(value) {
51516       return value === Object(value);
51517   }
51518
51519   // generator related shims
51520
51521   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
51522   function isStopIteration(exception) {
51523       return (
51524           object_toString(exception) === "[object StopIteration]" ||
51525           exception instanceof QReturnValue
51526       );
51527   }
51528
51529   // FIXME: Remove this helper and Q.return once ES6 generators are in
51530   // SpiderMonkey.
51531   var QReturnValue;
51532   if (typeof ReturnValue !== "undefined") {
51533       QReturnValue = ReturnValue;
51534   } else {
51535       QReturnValue = function (value) {
51536           this.value = value;
51537       };
51538   }
51539
51540   // long stack traces
51541
51542   var STACK_JUMP_SEPARATOR = "From previous event:";
51543
51544   function makeStackTraceLong(error, promise) {
51545       // If possible, transform the error stack trace by removing Node and Q
51546       // cruft, then concatenating with the stack trace of `promise`. See #57.
51547       if (hasStacks &&
51548           promise.stack &&
51549           typeof error === "object" &&
51550           error !== null &&
51551           error.stack
51552       ) {
51553           var stacks = [];
51554           for (var p = promise; !!p; p = p.source) {
51555               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
51556                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
51557                   stacks.unshift(p.stack);
51558               }
51559           }
51560           stacks.unshift(error.stack);
51561
51562           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
51563           var stack = filterStackString(concatedStacks);
51564           object_defineProperty(error, "stack", {value: stack, configurable: true});
51565       }
51566   }
51567
51568   function filterStackString(stackString) {
51569       var lines = stackString.split("\n");
51570       var desiredLines = [];
51571       for (var i = 0; i < lines.length; ++i) {
51572           var line = lines[i];
51573
51574           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
51575               desiredLines.push(line);
51576           }
51577       }
51578       return desiredLines.join("\n");
51579   }
51580
51581   function isNodeFrame(stackLine) {
51582       return stackLine.indexOf("(module.js:") !== -1 ||
51583              stackLine.indexOf("(node.js:") !== -1;
51584   }
51585
51586   function getFileNameAndLineNumber(stackLine) {
51587       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
51588       // In IE10 function name can have spaces ("Anonymous function") O_o
51589       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
51590       if (attempt1) {
51591           return [attempt1[1], Number(attempt1[2])];
51592       }
51593
51594       // Anonymous functions: "at filename:lineNumber:columnNumber"
51595       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
51596       if (attempt2) {
51597           return [attempt2[1], Number(attempt2[2])];
51598       }
51599
51600       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
51601       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
51602       if (attempt3) {
51603           return [attempt3[1], Number(attempt3[2])];
51604       }
51605   }
51606
51607   function isInternalFrame(stackLine) {
51608       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
51609
51610       if (!fileNameAndLineNumber) {
51611           return false;
51612       }
51613
51614       var fileName = fileNameAndLineNumber[0];
51615       var lineNumber = fileNameAndLineNumber[1];
51616
51617       return fileName === qFileName &&
51618           lineNumber >= qStartingLine &&
51619           lineNumber <= qEndingLine;
51620   }
51621
51622   // discover own file name and line number range for filtering stack
51623   // traces
51624   function captureLine() {
51625       if (!hasStacks) {
51626           return;
51627       }
51628
51629       try {
51630           throw new Error();
51631       } catch (e) {
51632           var lines = e.stack.split("\n");
51633           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
51634           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
51635           if (!fileNameAndLineNumber) {
51636               return;
51637           }
51638
51639           qFileName = fileNameAndLineNumber[0];
51640           return fileNameAndLineNumber[1];
51641       }
51642   }
51643
51644   function deprecate(callback, name, alternative) {
51645       return function () {
51646           if (typeof console !== "undefined" &&
51647               typeof console.warn === "function") {
51648               console.warn(name + " is deprecated, use " + alternative +
51649                            " instead.", new Error("").stack);
51650           }
51651           return callback.apply(callback, arguments);
51652       };
51653   }
51654
51655   // end of shims
51656   // beginning of real work
51657
51658   /**
51659    * Constructs a promise for an immediate reference, passes promises through, or
51660    * coerces promises from different systems.
51661    * @param value immediate reference or promise
51662    */
51663   function Q(value) {
51664       // If the object is already a Promise, return it directly.  This enables
51665       // the resolve function to both be used to created references from objects,
51666       // but to tolerably coerce non-promises to promises.
51667       if (value instanceof Promise) {
51668           return value;
51669       }
51670
51671       // assimilate thenables
51672       if (isPromiseAlike(value)) {
51673           return coerce(value);
51674       } else {
51675           return fulfill(value);
51676       }
51677   }
51678   Q.resolve = Q;
51679
51680   /**
51681    * Performs a task in a future turn of the event loop.
51682    * @param {Function} task
51683    */
51684   Q.nextTick = nextTick;
51685
51686   /**
51687    * Controls whether or not long stack traces will be on
51688    */
51689   Q.longStackSupport = false;
51690
51691   /**
51692    * The counter is used to determine the stopping point for building
51693    * long stack traces. In makeStackTraceLong we walk backwards through
51694    * the linked list of promises, only stacks which were created before
51695    * the rejection are concatenated.
51696    */
51697   var longStackCounter = 1;
51698
51699   // enable long stacks if Q_DEBUG is set
51700   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
51701       Q.longStackSupport = true;
51702   }
51703
51704   /**
51705    * Constructs a {promise, resolve, reject} object.
51706    *
51707    * `resolve` is a callback to invoke with a more resolved value for the
51708    * promise. To fulfill the promise, invoke `resolve` with any value that is
51709    * not a thenable. To reject the promise, invoke `resolve` with a rejected
51710    * thenable, or invoke `reject` with the reason directly. To resolve the
51711    * promise to another thenable, thus putting it in the same state, invoke
51712    * `resolve` with that other thenable.
51713    */
51714   Q.defer = defer;
51715   function defer() {
51716       // if "messages" is an "Array", that indicates that the promise has not yet
51717       // been resolved.  If it is "undefined", it has been resolved.  Each
51718       // element of the messages array is itself an array of complete arguments to
51719       // forward to the resolved promise.  We coerce the resolution value to a
51720       // promise using the `resolve` function because it handles both fully
51721       // non-thenable values and other thenables gracefully.
51722       var messages = [], progressListeners = [], resolvedPromise;
51723
51724       var deferred = object_create(defer.prototype);
51725       var promise = object_create(Promise.prototype);
51726
51727       promise.promiseDispatch = function (resolve, op, operands) {
51728           var args = array_slice(arguments);
51729           if (messages) {
51730               messages.push(args);
51731               if (op === "when" && operands[1]) { // progress operand
51732                   progressListeners.push(operands[1]);
51733               }
51734           } else {
51735               Q.nextTick(function () {
51736                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
51737               });
51738           }
51739       };
51740
51741       // XXX deprecated
51742       promise.valueOf = function () {
51743           if (messages) {
51744               return promise;
51745           }
51746           var nearerValue = nearer(resolvedPromise);
51747           if (isPromise(nearerValue)) {
51748               resolvedPromise = nearerValue; // shorten chain
51749           }
51750           return nearerValue;
51751       };
51752
51753       promise.inspect = function () {
51754           if (!resolvedPromise) {
51755               return { state: "pending" };
51756           }
51757           return resolvedPromise.inspect();
51758       };
51759
51760       if (Q.longStackSupport && hasStacks) {
51761           try {
51762               throw new Error();
51763           } catch (e) {
51764               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
51765               // accessor around; that causes memory leaks as per GH-111. Just
51766               // reify the stack trace as a string ASAP.
51767               //
51768               // At the same time, cut off the first line; it's always just
51769               // "[object Promise]\n", as per the `toString`.
51770               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
51771               promise.stackCounter = longStackCounter++;
51772           }
51773       }
51774
51775       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
51776       // consolidating them into `become`, since otherwise we'd create new
51777       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
51778
51779       function become(newPromise) {
51780           resolvedPromise = newPromise;
51781
51782           if (Q.longStackSupport && hasStacks) {
51783               // Only hold a reference to the new promise if long stacks
51784               // are enabled to reduce memory usage
51785               promise.source = newPromise;
51786           }
51787
51788           array_reduce(messages, function (undefined$1, message) {
51789               Q.nextTick(function () {
51790                   newPromise.promiseDispatch.apply(newPromise, message);
51791               });
51792           }, void 0);
51793
51794           messages = void 0;
51795           progressListeners = void 0;
51796       }
51797
51798       deferred.promise = promise;
51799       deferred.resolve = function (value) {
51800           if (resolvedPromise) {
51801               return;
51802           }
51803
51804           become(Q(value));
51805       };
51806
51807       deferred.fulfill = function (value) {
51808           if (resolvedPromise) {
51809               return;
51810           }
51811
51812           become(fulfill(value));
51813       };
51814       deferred.reject = function (reason) {
51815           if (resolvedPromise) {
51816               return;
51817           }
51818
51819           become(reject(reason));
51820       };
51821       deferred.notify = function (progress) {
51822           if (resolvedPromise) {
51823               return;
51824           }
51825
51826           array_reduce(progressListeners, function (undefined$1, progressListener) {
51827               Q.nextTick(function () {
51828                   progressListener(progress);
51829               });
51830           }, void 0);
51831       };
51832
51833       return deferred;
51834   }
51835
51836   /**
51837    * Creates a Node-style callback that will resolve or reject the deferred
51838    * promise.
51839    * @returns a nodeback
51840    */
51841   defer.prototype.makeNodeResolver = function () {
51842       var self = this;
51843       return function (error, value) {
51844           if (error) {
51845               self.reject(error);
51846           } else if (arguments.length > 2) {
51847               self.resolve(array_slice(arguments, 1));
51848           } else {
51849               self.resolve(value);
51850           }
51851       };
51852   };
51853
51854   /**
51855    * @param resolver {Function} a function that returns nothing and accepts
51856    * the resolve, reject, and notify functions for a deferred.
51857    * @returns a promise that may be resolved with the given resolve and reject
51858    * functions, or rejected by a thrown exception in resolver
51859    */
51860   Q.Promise = promise; // ES6
51861   Q.promise = promise;
51862   function promise(resolver) {
51863       if (typeof resolver !== "function") {
51864           throw new TypeError("resolver must be a function.");
51865       }
51866       var deferred = defer();
51867       try {
51868           resolver(deferred.resolve, deferred.reject, deferred.notify);
51869       } catch (reason) {
51870           deferred.reject(reason);
51871       }
51872       return deferred.promise;
51873   }
51874
51875   promise.race = race; // ES6
51876   promise.all = all; // ES6
51877   promise.reject = reject; // ES6
51878   promise.resolve = Q; // ES6
51879
51880   // XXX experimental.  This method is a way to denote that a local value is
51881   // serializable and should be immediately dispatched to a remote upon request,
51882   // instead of passing a reference.
51883   Q.passByCopy = function (object) {
51884       //freeze(object);
51885       //passByCopies.set(object, true);
51886       return object;
51887   };
51888
51889   Promise.prototype.passByCopy = function () {
51890       //freeze(object);
51891       //passByCopies.set(object, true);
51892       return this;
51893   };
51894
51895   /**
51896    * If two promises eventually fulfill to the same value, promises that value,
51897    * but otherwise rejects.
51898    * @param x {Any*}
51899    * @param y {Any*}
51900    * @returns {Any*} a promise for x and y if they are the same, but a rejection
51901    * otherwise.
51902    *
51903    */
51904   Q.join = function (x, y) {
51905       return Q(x).join(y);
51906   };
51907
51908   Promise.prototype.join = function (that) {
51909       return Q([this, that]).spread(function (x, y) {
51910           if (x === y) {
51911               // TODO: "===" should be Object.is or equiv
51912               return x;
51913           } else {
51914               throw new Error("Q can't join: not the same: " + x + " " + y);
51915           }
51916       });
51917   };
51918
51919   /**
51920    * Returns a promise for the first of an array of promises to become settled.
51921    * @param answers {Array[Any*]} promises to race
51922    * @returns {Any*} the first promise to be settled
51923    */
51924   Q.race = race;
51925   function race(answerPs) {
51926       return promise(function (resolve, reject) {
51927           // Switch to this once we can assume at least ES5
51928           // answerPs.forEach(function (answerP) {
51929           //     Q(answerP).then(resolve, reject);
51930           // });
51931           // Use this in the meantime
51932           for (var i = 0, len = answerPs.length; i < len; i++) {
51933               Q(answerPs[i]).then(resolve, reject);
51934           }
51935       });
51936   }
51937
51938   Promise.prototype.race = function () {
51939       return this.then(Q.race);
51940   };
51941
51942   /**
51943    * Constructs a Promise with a promise descriptor object and optional fallback
51944    * function.  The descriptor contains methods like when(rejected), get(name),
51945    * set(name, value), post(name, args), and delete(name), which all
51946    * return either a value, a promise for a value, or a rejection.  The fallback
51947    * accepts the operation name, a resolver, and any further arguments that would
51948    * have been forwarded to the appropriate method above had a method been
51949    * provided with the proper name.  The API makes no guarantees about the nature
51950    * of the returned object, apart from that it is usable whereever promises are
51951    * bought and sold.
51952    */
51953   Q.makePromise = Promise;
51954   function Promise(descriptor, fallback, inspect) {
51955       if (fallback === void 0) {
51956           fallback = function (op) {
51957               return reject(new Error(
51958                   "Promise does not support operation: " + op
51959               ));
51960           };
51961       }
51962       if (inspect === void 0) {
51963           inspect = function () {
51964               return {state: "unknown"};
51965           };
51966       }
51967
51968       var promise = object_create(Promise.prototype);
51969
51970       promise.promiseDispatch = function (resolve, op, args) {
51971           var result;
51972           try {
51973               if (descriptor[op]) {
51974                   result = descriptor[op].apply(promise, args);
51975               } else {
51976                   result = fallback.call(promise, op, args);
51977               }
51978           } catch (exception) {
51979               result = reject(exception);
51980           }
51981           if (resolve) {
51982               resolve(result);
51983           }
51984       };
51985
51986       promise.inspect = inspect;
51987
51988       // XXX deprecated `valueOf` and `exception` support
51989       if (inspect) {
51990           var inspected = inspect();
51991           if (inspected.state === "rejected") {
51992               promise.exception = inspected.reason;
51993           }
51994
51995           promise.valueOf = function () {
51996               var inspected = inspect();
51997               if (inspected.state === "pending" ||
51998                   inspected.state === "rejected") {
51999                   return promise;
52000               }
52001               return inspected.value;
52002           };
52003       }
52004
52005       return promise;
52006   }
52007
52008   Promise.prototype.toString = function () {
52009       return "[object Promise]";
52010   };
52011
52012   Promise.prototype.then = function (fulfilled, rejected, progressed) {
52013       var self = this;
52014       var deferred = defer();
52015       var done = false;   // ensure the untrusted promise makes at most a
52016                           // single call to one of the callbacks
52017
52018       function _fulfilled(value) {
52019           try {
52020               return typeof fulfilled === "function" ? fulfilled(value) : value;
52021           } catch (exception) {
52022               return reject(exception);
52023           }
52024       }
52025
52026       function _rejected(exception) {
52027           if (typeof rejected === "function") {
52028               makeStackTraceLong(exception, self);
52029               try {
52030                   return rejected(exception);
52031               } catch (newException) {
52032                   return reject(newException);
52033               }
52034           }
52035           return reject(exception);
52036       }
52037
52038       function _progressed(value) {
52039           return typeof progressed === "function" ? progressed(value) : value;
52040       }
52041
52042       Q.nextTick(function () {
52043           self.promiseDispatch(function (value) {
52044               if (done) {
52045                   return;
52046               }
52047               done = true;
52048
52049               deferred.resolve(_fulfilled(value));
52050           }, "when", [function (exception) {
52051               if (done) {
52052                   return;
52053               }
52054               done = true;
52055
52056               deferred.resolve(_rejected(exception));
52057           }]);
52058       });
52059
52060       // Progress propagator need to be attached in the current tick.
52061       self.promiseDispatch(void 0, "when", [void 0, function (value) {
52062           var newValue;
52063           var threw = false;
52064           try {
52065               newValue = _progressed(value);
52066           } catch (e) {
52067               threw = true;
52068               if (Q.onerror) {
52069                   Q.onerror(e);
52070               } else {
52071                   throw e;
52072               }
52073           }
52074
52075           if (!threw) {
52076               deferred.notify(newValue);
52077           }
52078       }]);
52079
52080       return deferred.promise;
52081   };
52082
52083   Q.tap = function (promise, callback) {
52084       return Q(promise).tap(callback);
52085   };
52086
52087   /**
52088    * Works almost like "finally", but not called for rejections.
52089    * Original resolution value is passed through callback unaffected.
52090    * Callback may return a promise that will be awaited for.
52091    * @param {Function} callback
52092    * @returns {Q.Promise}
52093    * @example
52094    * doSomething()
52095    *   .then(...)
52096    *   .tap(console.log)
52097    *   .then(...);
52098    */
52099   Promise.prototype.tap = function (callback) {
52100       callback = Q(callback);
52101
52102       return this.then(function (value) {
52103           return callback.fcall(value).thenResolve(value);
52104       });
52105   };
52106
52107   /**
52108    * Registers an observer on a promise.
52109    *
52110    * Guarantees:
52111    *
52112    * 1. that fulfilled and rejected will be called only once.
52113    * 2. that either the fulfilled callback or the rejected callback will be
52114    *    called, but not both.
52115    * 3. that fulfilled and rejected will not be called in this turn.
52116    *
52117    * @param value      promise or immediate reference to observe
52118    * @param fulfilled  function to be called with the fulfilled value
52119    * @param rejected   function to be called with the rejection exception
52120    * @param progressed function to be called on any progress notifications
52121    * @return promise for the return value from the invoked callback
52122    */
52123   Q.when = when;
52124   function when(value, fulfilled, rejected, progressed) {
52125       return Q(value).then(fulfilled, rejected, progressed);
52126   }
52127
52128   Promise.prototype.thenResolve = function (value) {
52129       return this.then(function () { return value; });
52130   };
52131
52132   Q.thenResolve = function (promise, value) {
52133       return Q(promise).thenResolve(value);
52134   };
52135
52136   Promise.prototype.thenReject = function (reason) {
52137       return this.then(function () { throw reason; });
52138   };
52139
52140   Q.thenReject = function (promise, reason) {
52141       return Q(promise).thenReject(reason);
52142   };
52143
52144   /**
52145    * If an object is not a promise, it is as "near" as possible.
52146    * If a promise is rejected, it is as "near" as possible too.
52147    * If it’s a fulfilled promise, the fulfillment value is nearer.
52148    * If it’s a deferred promise and the deferred has been resolved, the
52149    * resolution is "nearer".
52150    * @param object
52151    * @returns most resolved (nearest) form of the object
52152    */
52153
52154   // XXX should we re-do this?
52155   Q.nearer = nearer;
52156   function nearer(value) {
52157       if (isPromise(value)) {
52158           var inspected = value.inspect();
52159           if (inspected.state === "fulfilled") {
52160               return inspected.value;
52161           }
52162       }
52163       return value;
52164   }
52165
52166   /**
52167    * @returns whether the given object is a promise.
52168    * Otherwise it is a fulfilled value.
52169    */
52170   Q.isPromise = isPromise;
52171   function isPromise(object) {
52172       return object instanceof Promise;
52173   }
52174
52175   Q.isPromiseAlike = isPromiseAlike;
52176   function isPromiseAlike(object) {
52177       return isObject(object) && typeof object.then === "function";
52178   }
52179
52180   /**
52181    * @returns whether the given object is a pending promise, meaning not
52182    * fulfilled or rejected.
52183    */
52184   Q.isPending = isPending;
52185   function isPending(object) {
52186       return isPromise(object) && object.inspect().state === "pending";
52187   }
52188
52189   Promise.prototype.isPending = function () {
52190       return this.inspect().state === "pending";
52191   };
52192
52193   /**
52194    * @returns whether the given object is a value or fulfilled
52195    * promise.
52196    */
52197   Q.isFulfilled = isFulfilled;
52198   function isFulfilled(object) {
52199       return !isPromise(object) || object.inspect().state === "fulfilled";
52200   }
52201
52202   Promise.prototype.isFulfilled = function () {
52203       return this.inspect().state === "fulfilled";
52204   };
52205
52206   /**
52207    * @returns whether the given object is a rejected promise.
52208    */
52209   Q.isRejected = isRejected;
52210   function isRejected(object) {
52211       return isPromise(object) && object.inspect().state === "rejected";
52212   }
52213
52214   Promise.prototype.isRejected = function () {
52215       return this.inspect().state === "rejected";
52216   };
52217
52218   //// BEGIN UNHANDLED REJECTION TRACKING
52219
52220   // This promise library consumes exceptions thrown in handlers so they can be
52221   // handled by a subsequent promise.  The exceptions get added to this array when
52222   // they are created, and removed when they are handled.  Note that in ES6 or
52223   // shimmed environments, this would naturally be a `Set`.
52224   var unhandledReasons = [];
52225   var unhandledRejections = [];
52226   var reportedUnhandledRejections = [];
52227   var trackUnhandledRejections = true;
52228
52229   function resetUnhandledRejections() {
52230       unhandledReasons.length = 0;
52231       unhandledRejections.length = 0;
52232
52233       if (!trackUnhandledRejections) {
52234           trackUnhandledRejections = true;
52235       }
52236   }
52237
52238   function trackRejection(promise, reason) {
52239       if (!trackUnhandledRejections) {
52240           return;
52241       }
52242       if (typeof process === "object" && typeof process.emit === "function") {
52243           Q.nextTick.runAfter(function () {
52244               if (array_indexOf(unhandledRejections, promise) !== -1) {
52245                   process.emit("unhandledRejection", reason, promise);
52246                   reportedUnhandledRejections.push(promise);
52247               }
52248           });
52249       }
52250
52251       unhandledRejections.push(promise);
52252       if (reason && typeof reason.stack !== "undefined") {
52253           unhandledReasons.push(reason.stack);
52254       } else {
52255           unhandledReasons.push("(no stack) " + reason);
52256       }
52257   }
52258
52259   function untrackRejection(promise) {
52260       if (!trackUnhandledRejections) {
52261           return;
52262       }
52263
52264       var at = array_indexOf(unhandledRejections, promise);
52265       if (at !== -1) {
52266           if (typeof process === "object" && typeof process.emit === "function") {
52267               Q.nextTick.runAfter(function () {
52268                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
52269                   if (atReport !== -1) {
52270                       process.emit("rejectionHandled", unhandledReasons[at], promise);
52271                       reportedUnhandledRejections.splice(atReport, 1);
52272                   }
52273               });
52274           }
52275           unhandledRejections.splice(at, 1);
52276           unhandledReasons.splice(at, 1);
52277       }
52278   }
52279
52280   Q.resetUnhandledRejections = resetUnhandledRejections;
52281
52282   Q.getUnhandledReasons = function () {
52283       // Make a copy so that consumers can't interfere with our internal state.
52284       return unhandledReasons.slice();
52285   };
52286
52287   Q.stopUnhandledRejectionTracking = function () {
52288       resetUnhandledRejections();
52289       trackUnhandledRejections = false;
52290   };
52291
52292   resetUnhandledRejections();
52293
52294   //// END UNHANDLED REJECTION TRACKING
52295
52296   /**
52297    * Constructs a rejected promise.
52298    * @param reason value describing the failure
52299    */
52300   Q.reject = reject;
52301   function reject(reason) {
52302       var rejection = Promise({
52303           "when": function (rejected) {
52304               // note that the error has been handled
52305               if (rejected) {
52306                   untrackRejection(this);
52307               }
52308               return rejected ? rejected(reason) : this;
52309           }
52310       }, function fallback() {
52311           return this;
52312       }, function inspect() {
52313           return { state: "rejected", reason: reason };
52314       });
52315
52316       // Note that the reason has not been handled.
52317       trackRejection(rejection, reason);
52318
52319       return rejection;
52320   }
52321
52322   /**
52323    * Constructs a fulfilled promise for an immediate reference.
52324    * @param value immediate reference
52325    */
52326   Q.fulfill = fulfill;
52327   function fulfill(value) {
52328       return Promise({
52329           "when": function () {
52330               return value;
52331           },
52332           "get": function (name) {
52333               return value[name];
52334           },
52335           "set": function (name, rhs) {
52336               value[name] = rhs;
52337           },
52338           "delete": function (name) {
52339               delete value[name];
52340           },
52341           "post": function (name, args) {
52342               // Mark Miller proposes that post with no name should apply a
52343               // promised function.
52344               if (name === null || name === void 0) {
52345                   return value.apply(void 0, args);
52346               } else {
52347                   return value[name].apply(value, args);
52348               }
52349           },
52350           "apply": function (thisp, args) {
52351               return value.apply(thisp, args);
52352           },
52353           "keys": function () {
52354               return object_keys(value);
52355           }
52356       }, void 0, function inspect() {
52357           return { state: "fulfilled", value: value };
52358       });
52359   }
52360
52361   /**
52362    * Converts thenables to Q promises.
52363    * @param promise thenable promise
52364    * @returns a Q promise
52365    */
52366   function coerce(promise) {
52367       var deferred = defer();
52368       Q.nextTick(function () {
52369           try {
52370               promise.then(deferred.resolve, deferred.reject, deferred.notify);
52371           } catch (exception) {
52372               deferred.reject(exception);
52373           }
52374       });
52375       return deferred.promise;
52376   }
52377
52378   /**
52379    * Annotates an object such that it will never be
52380    * transferred away from this process over any promise
52381    * communication channel.
52382    * @param object
52383    * @returns promise a wrapping of that object that
52384    * additionally responds to the "isDef" message
52385    * without a rejection.
52386    */
52387   Q.master = master;
52388   function master(object) {
52389       return Promise({
52390           "isDef": function () {}
52391       }, function fallback(op, args) {
52392           return dispatch(object, op, args);
52393       }, function () {
52394           return Q(object).inspect();
52395       });
52396   }
52397
52398   /**
52399    * Spreads the values of a promised array of arguments into the
52400    * fulfillment callback.
52401    * @param fulfilled callback that receives variadic arguments from the
52402    * promised array
52403    * @param rejected callback that receives the exception if the promise
52404    * is rejected.
52405    * @returns a promise for the return value or thrown exception of
52406    * either callback.
52407    */
52408   Q.spread = spread;
52409   function spread(value, fulfilled, rejected) {
52410       return Q(value).spread(fulfilled, rejected);
52411   }
52412
52413   Promise.prototype.spread = function (fulfilled, rejected) {
52414       return this.all().then(function (array) {
52415           return fulfilled.apply(void 0, array);
52416       }, rejected);
52417   };
52418
52419   /**
52420    * The async function is a decorator for generator functions, turning
52421    * them into asynchronous generators.  Although generators are only part
52422    * of the newest ECMAScript 6 drafts, this code does not cause syntax
52423    * errors in older engines.  This code should continue to work and will
52424    * in fact improve over time as the language improves.
52425    *
52426    * ES6 generators are currently part of V8 version 3.19 with the
52427    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
52428    * for longer, but under an older Python-inspired form.  This function
52429    * works on both kinds of generators.
52430    *
52431    * Decorates a generator function such that:
52432    *  - it may yield promises
52433    *  - execution will continue when that promise is fulfilled
52434    *  - the value of the yield expression will be the fulfilled value
52435    *  - it returns a promise for the return value (when the generator
52436    *    stops iterating)
52437    *  - the decorated function returns a promise for the return value
52438    *    of the generator or the first rejected promise among those
52439    *    yielded.
52440    *  - if an error is thrown in the generator, it propagates through
52441    *    every following yield until it is caught, or until it escapes
52442    *    the generator function altogether, and is translated into a
52443    *    rejection for the promise returned by the decorated generator.
52444    */
52445   Q.async = async;
52446   function async(makeGenerator) {
52447       return function () {
52448           // when verb is "send", arg is a value
52449           // when verb is "throw", arg is an exception
52450           function continuer(verb, arg) {
52451               var result;
52452
52453               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
52454               // engine that has a deployed base of browsers that support generators.
52455               // However, SM's generators use the Python-inspired semantics of
52456               // outdated ES6 drafts.  We would like to support ES6, but we'd also
52457               // like to make it possible to use generators in deployed browsers, so
52458               // we also support Python-style generators.  At some point we can remove
52459               // this block.
52460
52461               if (typeof StopIteration === "undefined") {
52462                   // ES6 Generators
52463                   try {
52464                       result = generator[verb](arg);
52465                   } catch (exception) {
52466                       return reject(exception);
52467                   }
52468                   if (result.done) {
52469                       return Q(result.value);
52470                   } else {
52471                       return when(result.value, callback, errback);
52472                   }
52473               } else {
52474                   // SpiderMonkey Generators
52475                   // FIXME: Remove this case when SM does ES6 generators.
52476                   try {
52477                       result = generator[verb](arg);
52478                   } catch (exception) {
52479                       if (isStopIteration(exception)) {
52480                           return Q(exception.value);
52481                       } else {
52482                           return reject(exception);
52483                       }
52484                   }
52485                   return when(result, callback, errback);
52486               }
52487           }
52488           var generator = makeGenerator.apply(this, arguments);
52489           var callback = continuer.bind(continuer, "next");
52490           var errback = continuer.bind(continuer, "throw");
52491           return callback();
52492       };
52493   }
52494
52495   /**
52496    * The spawn function is a small wrapper around async that immediately
52497    * calls the generator and also ends the promise chain, so that any
52498    * unhandled errors are thrown instead of forwarded to the error
52499    * handler. This is useful because it's extremely common to run
52500    * generators at the top-level to work with libraries.
52501    */
52502   Q.spawn = spawn;
52503   function spawn(makeGenerator) {
52504       Q.done(Q.async(makeGenerator)());
52505   }
52506
52507   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
52508   /**
52509    * Throws a ReturnValue exception to stop an asynchronous generator.
52510    *
52511    * This interface is a stop-gap measure to support generator return
52512    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
52513    * generators like Chromium 29, just use "return" in your generator
52514    * functions.
52515    *
52516    * @param value the return value for the surrounding generator
52517    * @throws ReturnValue exception with the value.
52518    * @example
52519    * // ES6 style
52520    * Q.async(function* () {
52521    *      var foo = yield getFooPromise();
52522    *      var bar = yield getBarPromise();
52523    *      return foo + bar;
52524    * })
52525    * // Older SpiderMonkey style
52526    * Q.async(function () {
52527    *      var foo = yield getFooPromise();
52528    *      var bar = yield getBarPromise();
52529    *      Q.return(foo + bar);
52530    * })
52531    */
52532   Q["return"] = _return;
52533   function _return(value) {
52534       throw new QReturnValue(value);
52535   }
52536
52537   /**
52538    * The promised function decorator ensures that any promise arguments
52539    * are settled and passed as values (`this` is also settled and passed
52540    * as a value).  It will also ensure that the result of a function is
52541    * always a promise.
52542    *
52543    * @example
52544    * var add = Q.promised(function (a, b) {
52545    *     return a + b;
52546    * });
52547    * add(Q(a), Q(B));
52548    *
52549    * @param {function} callback The function to decorate
52550    * @returns {function} a function that has been decorated.
52551    */
52552   Q.promised = promised;
52553   function promised(callback) {
52554       return function () {
52555           return spread([this, all(arguments)], function (self, args) {
52556               return callback.apply(self, args);
52557           });
52558       };
52559   }
52560
52561   /**
52562    * sends a message to a value in a future turn
52563    * @param object* the recipient
52564    * @param op the name of the message operation, e.g., "when",
52565    * @param args further arguments to be forwarded to the operation
52566    * @returns result {Promise} a promise for the result of the operation
52567    */
52568   Q.dispatch = dispatch;
52569   function dispatch(object, op, args) {
52570       return Q(object).dispatch(op, args);
52571   }
52572
52573   Promise.prototype.dispatch = function (op, args) {
52574       var self = this;
52575       var deferred = defer();
52576       Q.nextTick(function () {
52577           self.promiseDispatch(deferred.resolve, op, args);
52578       });
52579       return deferred.promise;
52580   };
52581
52582   /**
52583    * Gets the value of a property in a future turn.
52584    * @param object    promise or immediate reference for target object
52585    * @param name      name of property to get
52586    * @return promise for the property value
52587    */
52588   Q.get = function (object, key) {
52589       return Q(object).dispatch("get", [key]);
52590   };
52591
52592   Promise.prototype.get = function (key) {
52593       return this.dispatch("get", [key]);
52594   };
52595
52596   /**
52597    * Sets the value of a property in a future turn.
52598    * @param object    promise or immediate reference for object object
52599    * @param name      name of property to set
52600    * @param value     new value of property
52601    * @return promise for the return value
52602    */
52603   Q.set = function (object, key, value) {
52604       return Q(object).dispatch("set", [key, value]);
52605   };
52606
52607   Promise.prototype.set = function (key, value) {
52608       return this.dispatch("set", [key, value]);
52609   };
52610
52611   /**
52612    * Deletes a property in a future turn.
52613    * @param object    promise or immediate reference for target object
52614    * @param name      name of property to delete
52615    * @return promise for the return value
52616    */
52617   Q.del = // XXX legacy
52618   Q["delete"] = function (object, key) {
52619       return Q(object).dispatch("delete", [key]);
52620   };
52621
52622   Promise.prototype.del = // XXX legacy
52623   Promise.prototype["delete"] = function (key) {
52624       return this.dispatch("delete", [key]);
52625   };
52626
52627   /**
52628    * Invokes a method in a future turn.
52629    * @param object    promise or immediate reference for target object
52630    * @param name      name of method to invoke
52631    * @param value     a value to post, typically an array of
52632    *                  invocation arguments for promises that
52633    *                  are ultimately backed with `resolve` values,
52634    *                  as opposed to those backed with URLs
52635    *                  wherein the posted value can be any
52636    *                  JSON serializable object.
52637    * @return promise for the return value
52638    */
52639   // bound locally because it is used by other methods
52640   Q.mapply = // XXX As proposed by "Redsandro"
52641   Q.post = function (object, name, args) {
52642       return Q(object).dispatch("post", [name, args]);
52643   };
52644
52645   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
52646   Promise.prototype.post = function (name, args) {
52647       return this.dispatch("post", [name, args]);
52648   };
52649
52650   /**
52651    * Invokes a method in a future turn.
52652    * @param object    promise or immediate reference for target object
52653    * @param name      name of method to invoke
52654    * @param ...args   array of invocation arguments
52655    * @return promise for the return value
52656    */
52657   Q.send = // XXX Mark Miller's proposed parlance
52658   Q.mcall = // XXX As proposed by "Redsandro"
52659   Q.invoke = function (object, name /*...args*/) {
52660       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
52661   };
52662
52663   Promise.prototype.send = // XXX Mark Miller's proposed parlance
52664   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
52665   Promise.prototype.invoke = function (name /*...args*/) {
52666       return this.dispatch("post", [name, array_slice(arguments, 1)]);
52667   };
52668
52669   /**
52670    * Applies the promised function in a future turn.
52671    * @param object    promise or immediate reference for target function
52672    * @param args      array of application arguments
52673    */
52674   Q.fapply = function (object, args) {
52675       return Q(object).dispatch("apply", [void 0, args]);
52676   };
52677
52678   Promise.prototype.fapply = function (args) {
52679       return this.dispatch("apply", [void 0, args]);
52680   };
52681
52682   /**
52683    * Calls the promised function in a future turn.
52684    * @param object    promise or immediate reference for target function
52685    * @param ...args   array of application arguments
52686    */
52687   Q["try"] =
52688   Q.fcall = function (object /* ...args*/) {
52689       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
52690   };
52691
52692   Promise.prototype.fcall = function (/*...args*/) {
52693       return this.dispatch("apply", [void 0, array_slice(arguments)]);
52694   };
52695
52696   /**
52697    * Binds the promised function, transforming return values into a fulfilled
52698    * promise and thrown errors into a rejected one.
52699    * @param object    promise or immediate reference for target function
52700    * @param ...args   array of application arguments
52701    */
52702   Q.fbind = function (object /*...args*/) {
52703       var promise = Q(object);
52704       var args = array_slice(arguments, 1);
52705       return function fbound() {
52706           return promise.dispatch("apply", [
52707               this,
52708               args.concat(array_slice(arguments))
52709           ]);
52710       };
52711   };
52712   Promise.prototype.fbind = function (/*...args*/) {
52713       var promise = this;
52714       var args = array_slice(arguments);
52715       return function fbound() {
52716           return promise.dispatch("apply", [
52717               this,
52718               args.concat(array_slice(arguments))
52719           ]);
52720       };
52721   };
52722
52723   /**
52724    * Requests the names of the owned properties of a promised
52725    * object in a future turn.
52726    * @param object    promise or immediate reference for target object
52727    * @return promise for the keys of the eventually settled object
52728    */
52729   Q.keys = function (object) {
52730       return Q(object).dispatch("keys", []);
52731   };
52732
52733   Promise.prototype.keys = function () {
52734       return this.dispatch("keys", []);
52735   };
52736
52737   /**
52738    * Turns an array of promises into a promise for an array.  If any of
52739    * the promises gets rejected, the whole array is rejected immediately.
52740    * @param {Array*} an array (or promise for an array) of values (or
52741    * promises for values)
52742    * @returns a promise for an array of the corresponding values
52743    */
52744   // By Mark Miller
52745   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
52746   Q.all = all;
52747   function all(promises) {
52748       return when(promises, function (promises) {
52749           var pendingCount = 0;
52750           var deferred = defer();
52751           array_reduce(promises, function (undefined$1, promise, index) {
52752               var snapshot;
52753               if (
52754                   isPromise(promise) &&
52755                   (snapshot = promise.inspect()).state === "fulfilled"
52756               ) {
52757                   promises[index] = snapshot.value;
52758               } else {
52759                   ++pendingCount;
52760                   when(
52761                       promise,
52762                       function (value) {
52763                           promises[index] = value;
52764                           if (--pendingCount === 0) {
52765                               deferred.resolve(promises);
52766                           }
52767                       },
52768                       deferred.reject,
52769                       function (progress) {
52770                           deferred.notify({ index: index, value: progress });
52771                       }
52772                   );
52773               }
52774           }, void 0);
52775           if (pendingCount === 0) {
52776               deferred.resolve(promises);
52777           }
52778           return deferred.promise;
52779       });
52780   }
52781
52782   Promise.prototype.all = function () {
52783       return all(this);
52784   };
52785
52786   /**
52787    * Returns the first resolved promise of an array. Prior rejected promises are
52788    * ignored.  Rejects only if all promises are rejected.
52789    * @param {Array*} an array containing values or promises for values
52790    * @returns a promise fulfilled with the value of the first resolved promise,
52791    * or a rejected promise if all promises are rejected.
52792    */
52793   Q.any = any;
52794
52795   function any(promises) {
52796       if (promises.length === 0) {
52797           return Q.resolve();
52798       }
52799
52800       var deferred = Q.defer();
52801       var pendingCount = 0;
52802       array_reduce(promises, function (prev, current, index) {
52803           var promise = promises[index];
52804
52805           pendingCount++;
52806
52807           when(promise, onFulfilled, onRejected, onProgress);
52808           function onFulfilled(result) {
52809               deferred.resolve(result);
52810           }
52811           function onRejected(err) {
52812               pendingCount--;
52813               if (pendingCount === 0) {
52814                   var rejection = err || new Error("" + err);
52815
52816                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
52817                       "promises were rejected. Last error message: " + rejection.message);
52818
52819                   deferred.reject(rejection);
52820               }
52821           }
52822           function onProgress(progress) {
52823               deferred.notify({
52824                   index: index,
52825                   value: progress
52826               });
52827           }
52828       }, undefined);
52829
52830       return deferred.promise;
52831   }
52832
52833   Promise.prototype.any = function () {
52834       return any(this);
52835   };
52836
52837   /**
52838    * Waits for all promises to be settled, either fulfilled or
52839    * rejected.  This is distinct from `all` since that would stop
52840    * waiting at the first rejection.  The promise returned by
52841    * `allResolved` will never be rejected.
52842    * @param promises a promise for an array (or an array) of promises
52843    * (or values)
52844    * @return a promise for an array of promises
52845    */
52846   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
52847   function allResolved(promises) {
52848       return when(promises, function (promises) {
52849           promises = array_map(promises, Q);
52850           return when(all(array_map(promises, function (promise) {
52851               return when(promise, noop, noop);
52852           })), function () {
52853               return promises;
52854           });
52855       });
52856   }
52857
52858   Promise.prototype.allResolved = function () {
52859       return allResolved(this);
52860   };
52861
52862   /**
52863    * @see Promise#allSettled
52864    */
52865   Q.allSettled = allSettled;
52866   function allSettled(promises) {
52867       return Q(promises).allSettled();
52868   }
52869
52870   /**
52871    * Turns an array of promises into a promise for an array of their states (as
52872    * returned by `inspect`) when they have all settled.
52873    * @param {Array[Any*]} values an array (or promise for an array) of values (or
52874    * promises for values)
52875    * @returns {Array[State]} an array of states for the respective values.
52876    */
52877   Promise.prototype.allSettled = function () {
52878       return this.then(function (promises) {
52879           return all(array_map(promises, function (promise) {
52880               promise = Q(promise);
52881               function regardless() {
52882                   return promise.inspect();
52883               }
52884               return promise.then(regardless, regardless);
52885           }));
52886       });
52887   };
52888
52889   /**
52890    * Captures the failure of a promise, giving an oportunity to recover
52891    * with a callback.  If the given promise is fulfilled, the returned
52892    * promise is fulfilled.
52893    * @param {Any*} promise for something
52894    * @param {Function} callback to fulfill the returned promise if the
52895    * given promise is rejected
52896    * @returns a promise for the return value of the callback
52897    */
52898   Q.fail = // XXX legacy
52899   Q["catch"] = function (object, rejected) {
52900       return Q(object).then(void 0, rejected);
52901   };
52902
52903   Promise.prototype.fail = // XXX legacy
52904   Promise.prototype["catch"] = function (rejected) {
52905       return this.then(void 0, rejected);
52906   };
52907
52908   /**
52909    * Attaches a listener that can respond to progress notifications from a
52910    * promise's originating deferred. This listener receives the exact arguments
52911    * passed to ``deferred.notify``.
52912    * @param {Any*} promise for something
52913    * @param {Function} callback to receive any progress notifications
52914    * @returns the given promise, unchanged
52915    */
52916   Q.progress = progress;
52917   function progress(object, progressed) {
52918       return Q(object).then(void 0, void 0, progressed);
52919   }
52920
52921   Promise.prototype.progress = function (progressed) {
52922       return this.then(void 0, void 0, progressed);
52923   };
52924
52925   /**
52926    * Provides an opportunity to observe the settling of a promise,
52927    * regardless of whether the promise is fulfilled or rejected.  Forwards
52928    * the resolution to the returned promise when the callback is done.
52929    * The callback can return a promise to defer completion.
52930    * @param {Any*} promise
52931    * @param {Function} callback to observe the resolution of the given
52932    * promise, takes no arguments.
52933    * @returns a promise for the resolution of the given promise when
52934    * ``fin`` is done.
52935    */
52936   Q.fin = // XXX legacy
52937   Q["finally"] = function (object, callback) {
52938       return Q(object)["finally"](callback);
52939   };
52940
52941   Promise.prototype.fin = // XXX legacy
52942   Promise.prototype["finally"] = function (callback) {
52943       if (!callback || typeof callback.apply !== "function") {
52944           throw new Error("Q can't apply finally callback");
52945       }
52946       callback = Q(callback);
52947       return this.then(function (value) {
52948           return callback.fcall().then(function () {
52949               return value;
52950           });
52951       }, function (reason) {
52952           // TODO attempt to recycle the rejection with "this".
52953           return callback.fcall().then(function () {
52954               throw reason;
52955           });
52956       });
52957   };
52958
52959   /**
52960    * Terminates a chain of promises, forcing rejections to be
52961    * thrown as exceptions.
52962    * @param {Any*} promise at the end of a chain of promises
52963    * @returns nothing
52964    */
52965   Q.done = function (object, fulfilled, rejected, progress) {
52966       return Q(object).done(fulfilled, rejected, progress);
52967   };
52968
52969   Promise.prototype.done = function (fulfilled, rejected, progress) {
52970       var onUnhandledError = function (error) {
52971           // forward to a future turn so that ``when``
52972           // does not catch it and turn it into a rejection.
52973           Q.nextTick(function () {
52974               makeStackTraceLong(error, promise);
52975               if (Q.onerror) {
52976                   Q.onerror(error);
52977               } else {
52978                   throw error;
52979               }
52980           });
52981       };
52982
52983       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
52984       var promise = fulfilled || rejected || progress ?
52985           this.then(fulfilled, rejected, progress) :
52986           this;
52987
52988       if (typeof process === "object" && process && process.domain) {
52989           onUnhandledError = process.domain.bind(onUnhandledError);
52990       }
52991
52992       promise.then(void 0, onUnhandledError);
52993   };
52994
52995   /**
52996    * Causes a promise to be rejected if it does not get fulfilled before
52997    * some milliseconds time out.
52998    * @param {Any*} promise
52999    * @param {Number} milliseconds timeout
53000    * @param {Any*} custom error message or Error object (optional)
53001    * @returns a promise for the resolution of the given promise if it is
53002    * fulfilled before the timeout, otherwise rejected.
53003    */
53004   Q.timeout = function (object, ms, error) {
53005       return Q(object).timeout(ms, error);
53006   };
53007
53008   Promise.prototype.timeout = function (ms, error) {
53009       var deferred = defer();
53010       var timeoutId = setTimeout(function () {
53011           if (!error || "string" === typeof error) {
53012               error = new Error(error || "Timed out after " + ms + " ms");
53013               error.code = "ETIMEDOUT";
53014           }
53015           deferred.reject(error);
53016       }, ms);
53017
53018       this.then(function (value) {
53019           clearTimeout(timeoutId);
53020           deferred.resolve(value);
53021       }, function (exception) {
53022           clearTimeout(timeoutId);
53023           deferred.reject(exception);
53024       }, deferred.notify);
53025
53026       return deferred.promise;
53027   };
53028
53029   /**
53030    * Returns a promise for the given value (or promised value), some
53031    * milliseconds after it resolved. Passes rejections immediately.
53032    * @param {Any*} promise
53033    * @param {Number} milliseconds
53034    * @returns a promise for the resolution of the given promise after milliseconds
53035    * time has elapsed since the resolution of the given promise.
53036    * If the given promise rejects, that is passed immediately.
53037    */
53038   Q.delay = function (object, timeout) {
53039       if (timeout === void 0) {
53040           timeout = object;
53041           object = void 0;
53042       }
53043       return Q(object).delay(timeout);
53044   };
53045
53046   Promise.prototype.delay = function (timeout) {
53047       return this.then(function (value) {
53048           var deferred = defer();
53049           setTimeout(function () {
53050               deferred.resolve(value);
53051           }, timeout);
53052           return deferred.promise;
53053       });
53054   };
53055
53056   /**
53057    * Passes a continuation to a Node function, which is called with the given
53058    * arguments provided as an array, and returns a promise.
53059    *
53060    *      Q.nfapply(FS.readFile, [__filename])
53061    *      .then(function (content) {
53062    *      })
53063    *
53064    */
53065   Q.nfapply = function (callback, args) {
53066       return Q(callback).nfapply(args);
53067   };
53068
53069   Promise.prototype.nfapply = function (args) {
53070       var deferred = defer();
53071       var nodeArgs = array_slice(args);
53072       nodeArgs.push(deferred.makeNodeResolver());
53073       this.fapply(nodeArgs).fail(deferred.reject);
53074       return deferred.promise;
53075   };
53076
53077   /**
53078    * Passes a continuation to a Node function, which is called with the given
53079    * arguments provided individually, and returns a promise.
53080    * @example
53081    * Q.nfcall(FS.readFile, __filename)
53082    * .then(function (content) {
53083    * })
53084    *
53085    */
53086   Q.nfcall = function (callback /*...args*/) {
53087       var args = array_slice(arguments, 1);
53088       return Q(callback).nfapply(args);
53089   };
53090
53091   Promise.prototype.nfcall = function (/*...args*/) {
53092       var nodeArgs = array_slice(arguments);
53093       var deferred = defer();
53094       nodeArgs.push(deferred.makeNodeResolver());
53095       this.fapply(nodeArgs).fail(deferred.reject);
53096       return deferred.promise;
53097   };
53098
53099   /**
53100    * Wraps a NodeJS continuation passing function and returns an equivalent
53101    * version that returns a promise.
53102    * @example
53103    * Q.nfbind(FS.readFile, __filename)("utf-8")
53104    * .then(console.log)
53105    * .done()
53106    */
53107   Q.nfbind =
53108   Q.denodeify = function (callback /*...args*/) {
53109       if (callback === undefined) {
53110           throw new Error("Q can't wrap an undefined function");
53111       }
53112       var baseArgs = array_slice(arguments, 1);
53113       return function () {
53114           var nodeArgs = baseArgs.concat(array_slice(arguments));
53115           var deferred = defer();
53116           nodeArgs.push(deferred.makeNodeResolver());
53117           Q(callback).fapply(nodeArgs).fail(deferred.reject);
53118           return deferred.promise;
53119       };
53120   };
53121
53122   Promise.prototype.nfbind =
53123   Promise.prototype.denodeify = function (/*...args*/) {
53124       var args = array_slice(arguments);
53125       args.unshift(this);
53126       return Q.denodeify.apply(void 0, args);
53127   };
53128
53129   Q.nbind = function (callback, thisp /*...args*/) {
53130       var baseArgs = array_slice(arguments, 2);
53131       return function () {
53132           var nodeArgs = baseArgs.concat(array_slice(arguments));
53133           var deferred = defer();
53134           nodeArgs.push(deferred.makeNodeResolver());
53135           function bound() {
53136               return callback.apply(thisp, arguments);
53137           }
53138           Q(bound).fapply(nodeArgs).fail(deferred.reject);
53139           return deferred.promise;
53140       };
53141   };
53142
53143   Promise.prototype.nbind = function (/*thisp, ...args*/) {
53144       var args = array_slice(arguments, 0);
53145       args.unshift(this);
53146       return Q.nbind.apply(void 0, args);
53147   };
53148
53149   /**
53150    * Calls a method of a Node-style object that accepts a Node-style
53151    * callback with a given array of arguments, plus a provided callback.
53152    * @param object an object that has the named method
53153    * @param {String} name name of the method of object
53154    * @param {Array} args arguments to pass to the method; the callback
53155    * will be provided by Q and appended to these arguments.
53156    * @returns a promise for the value or error
53157    */
53158   Q.nmapply = // XXX As proposed by "Redsandro"
53159   Q.npost = function (object, name, args) {
53160       return Q(object).npost(name, args);
53161   };
53162
53163   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
53164   Promise.prototype.npost = function (name, args) {
53165       var nodeArgs = array_slice(args || []);
53166       var deferred = defer();
53167       nodeArgs.push(deferred.makeNodeResolver());
53168       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53169       return deferred.promise;
53170   };
53171
53172   /**
53173    * Calls a method of a Node-style object that accepts a Node-style
53174    * callback, forwarding the given variadic arguments, plus a provided
53175    * callback argument.
53176    * @param object an object that has the named method
53177    * @param {String} name name of the method of object
53178    * @param ...args arguments to pass to the method; the callback will
53179    * be provided by Q and appended to these arguments.
53180    * @returns a promise for the value or error
53181    */
53182   Q.nsend = // XXX Based on Mark Miller's proposed "send"
53183   Q.nmcall = // XXX Based on "Redsandro's" proposal
53184   Q.ninvoke = function (object, name /*...args*/) {
53185       var nodeArgs = array_slice(arguments, 2);
53186       var deferred = defer();
53187       nodeArgs.push(deferred.makeNodeResolver());
53188       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53189       return deferred.promise;
53190   };
53191
53192   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
53193   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
53194   Promise.prototype.ninvoke = function (name /*...args*/) {
53195       var nodeArgs = array_slice(arguments, 1);
53196       var deferred = defer();
53197       nodeArgs.push(deferred.makeNodeResolver());
53198       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
53199       return deferred.promise;
53200   };
53201
53202   /**
53203    * If a function would like to support both Node continuation-passing-style and
53204    * promise-returning-style, it can end its internal promise chain with
53205    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
53206    * elects to use a nodeback, the result will be sent there.  If they do not
53207    * pass a nodeback, they will receive the result promise.
53208    * @param object a result (or a promise for a result)
53209    * @param {Function} nodeback a Node.js-style callback
53210    * @returns either the promise or nothing
53211    */
53212   Q.nodeify = nodeify;
53213   function nodeify(object, nodeback) {
53214       return Q(object).nodeify(nodeback);
53215   }
53216
53217   Promise.prototype.nodeify = function (nodeback) {
53218       if (nodeback) {
53219           this.then(function (value) {
53220               Q.nextTick(function () {
53221                   nodeback(null, value);
53222               });
53223           }, function (error) {
53224               Q.nextTick(function () {
53225                   nodeback(error);
53226               });
53227           });
53228       } else {
53229           return this;
53230       }
53231   };
53232
53233   Q.noConflict = function() {
53234       throw new Error("Q.noConflict only works when Q is used as a global");
53235   };
53236
53237   // All code before this point will be filtered from stack traces.
53238   var qEndingLine = captureLine();
53239
53240   return Q;
53241
53242   });
53243   });
53244
53245   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
53246   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
53247   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
53248   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
53249   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
53250   var maxResults$2 = 2000;
53251   var tileZoom$2 = 16.5;
53252   var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
53253   var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
53254   var minHfov = 10;         // zoom in degrees:  20, 10, 5
53255   var maxHfov = 90;         // zoom out degrees
53256   var defaultHfov = 45;
53257
53258   var _hires = false;
53259   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
53260   var _currScene = 0;
53261   var _ssCache;
53262   var _pannellumViewer;
53263   var _sceneOptions;
53264   var _dataUrlArray = [];
53265
53266
53267   /**
53268    * abortRequest().
53269    */
53270   function abortRequest$5(i) {
53271       i.abort();
53272   }
53273
53274
53275   /**
53276    * localeTimeStamp().
53277    */
53278   function localeTimestamp(s) {
53279       if (!s) return null;
53280       var detected = utilDetect();
53281       var options = { day: 'numeric', month: 'short', year: 'numeric' };
53282       var d = new Date(s);
53283       if (isNaN(d.getTime())) return null;
53284       return d.toLocaleString(detected.locale, options);
53285   }
53286
53287
53288   /**
53289    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
53290    */
53291   function loadTiles$2(which, url, projection, margin) {
53292       var tiles = tiler$5.margin(margin).getTiles(projection);
53293
53294       // abort inflight requests that are no longer needed
53295       var cache = _ssCache[which];
53296       forEach(cache.inflight, function(v, k) {
53297           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
53298
53299           if (!wanted) {
53300               abortRequest$5(v);
53301               delete cache.inflight[k];
53302           }
53303       });
53304
53305       tiles.forEach(function (tile) {
53306          loadNextTilePage$2(which, url, tile);
53307       });
53308   }
53309
53310   /**
53311    * loadNextTilePage() load data for the next tile page in line.
53312    */
53313   function loadNextTilePage$2(which, url, tile) {
53314       var cache = _ssCache[which];
53315       var nextPage = cache.nextPage[tile.id] || 0;
53316       var id = tile.id + ',' + String(nextPage);
53317       if (cache.loaded[id] || cache.inflight[id]) return;
53318
53319       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
53320           cache.loaded[id] = true;
53321           delete cache.inflight[id];
53322           if (!bubbles) return;
53323
53324           // [].shift() removes the first element, some statistics info, not a bubble point
53325           bubbles.shift();
53326
53327           var features = bubbles.map(function(bubble) {
53328               if (cache.points[bubble.id]) return null;  // skip duplicates
53329
53330               var loc = [bubble.lo, bubble.la];
53331               var d = {
53332                   loc: loc,
53333                   key: bubble.id,
53334                   ca: bubble.he,
53335                   captured_at: bubble.cd,
53336                   captured_by: 'microsoft',
53337                   // nbn: bubble.nbn,
53338                   // pbn: bubble.pbn,
53339                   // ad: bubble.ad,
53340                   // rn: bubble.rn,
53341                   pr: bubble.pr,  // previous
53342                   ne: bubble.ne,  // next
53343                   pano: true,
53344                   sequenceKey: null
53345               };
53346
53347               cache.points[bubble.id] = d;
53348
53349               // a sequence starts here
53350               if (bubble.pr === undefined) {
53351                   cache.leaders.push(bubble.id);
53352               }
53353
53354               return {
53355                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
53356               };
53357
53358           }).filter(Boolean);
53359
53360           cache.rtree.load(features);
53361
53362           connectSequences();
53363
53364           if (which === 'bubbles') {
53365               dispatch$6.call('loadedBubbles');
53366           }
53367       });
53368   }
53369
53370
53371   // call this sometimes to connect the bubbles into sequences
53372   function connectSequences() {
53373       var cache = _ssCache.bubbles;
53374       var keepLeaders = [];
53375
53376       for (var i = 0; i < cache.leaders.length; i++) {
53377           var bubble = cache.points[cache.leaders[i]];
53378           var seen = {};
53379
53380           // try to make a sequence.. use the key of the leader bubble.
53381           var sequence = { key: bubble.key, bubbles: [] };
53382           var complete = false;
53383
53384           do {
53385               sequence.bubbles.push(bubble);
53386               seen[bubble.key] = true;
53387
53388               if (bubble.ne === undefined) {
53389                   complete = true;
53390               } else {
53391                   bubble = cache.points[bubble.ne];  // advance to next
53392               }
53393           } while (bubble && !seen[bubble.key] && !complete);
53394
53395
53396           if (complete) {
53397               _ssCache.sequences[sequence.key] = sequence;
53398
53399               // assign bubbles to the sequence
53400               for (var j = 0; j < sequence.bubbles.length; j++) {
53401                   sequence.bubbles[j].sequenceKey = sequence.key;
53402               }
53403
53404               // create a GeoJSON LineString
53405               sequence.geojson = {
53406                   type: 'LineString',
53407                   properties: { key: sequence.key },
53408                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
53409               };
53410
53411           } else {
53412               keepLeaders.push(cache.leaders[i]);
53413           }
53414       }
53415
53416       // couldn't complete these, save for later
53417       cache.leaders = keepLeaders;
53418   }
53419
53420   /**
53421    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
53422    */
53423   function getBubbles(url, tile, callback) {
53424       var rect = tile.extent.rectangle();
53425       var urlForRequest = url + utilQsString({
53426           n: rect[3],
53427           s: rect[1],
53428           e: rect[2],
53429           w: rect[0],
53430           c: maxResults$2,
53431           appkey: bubbleAppKey,
53432           jsCallback: '{callback}'
53433       });
53434
53435       return jsonpRequest(urlForRequest, function (data) {
53436           if (!data || data.error) {
53437               callback(null);
53438           } else {
53439               callback(data);
53440           }
53441       });
53442   }
53443
53444
53445   // partition viewport into higher zoom tiles
53446   function partitionViewport$2(projection) {
53447       var z = geoScaleToZoom(projection.scale());
53448       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
53449       var tiler = utilTiler().zoomExtent([z2, z2]);
53450
53451       return tiler.getTiles(projection)
53452           .map(function(tile) { return tile.extent; });
53453   }
53454
53455
53456   // no more than `limit` results per partition.
53457   function searchLimited$2(limit, projection, rtree) {
53458       limit = limit || 5;
53459
53460       return partitionViewport$2(projection)
53461           .reduce(function(result, extent) {
53462               var found = rtree.search(extent.bbox())
53463                   .slice(0, limit)
53464                   .map(function(d) { return d.data; });
53465
53466               return (found.length ? result.concat(found) : result);
53467           }, []);
53468   }
53469
53470
53471   /**
53472    * getImage()
53473    */
53474   function getImage(imgInfo) {
53475       var response = q.defer();
53476       var img = new Image();
53477
53478       img.onload = function() {
53479           var canvas = document.getElementById('canvas' + imgInfo.face);
53480           var ctx = canvas.getContext('2d');
53481           ctx.drawImage(img, imgInfo.x, imgInfo.y);
53482           response.resolve({imgInfo:imgInfo, status: 'ok'});
53483       };
53484       img.onerror = function() {
53485           response.resolve({data: imgInfo, status: 'error'});
53486       };
53487       img.setAttribute('crossorigin', '');
53488       img.src = imgInfo.url;
53489
53490       return response.promise;
53491   }
53492
53493
53494   /**
53495    * loadCanvas()
53496    */
53497   function loadCanvas(imgInfoGroup) {
53498       var response = q.defer();
53499       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
53500           return getImage(imgInfo);
53501       });
53502
53503       q.all(getImagePromises).then(function(data) {
53504           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
53505           switch (data[0].imgInfo.face) {
53506               case '01':
53507                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
53508                   break;
53509               case '02':
53510                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
53511                   break;
53512               case '03':
53513                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
53514                   break;
53515               case '10':
53516                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
53517                   break;
53518               case '11':
53519                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
53520                   break;
53521               case '12':
53522                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
53523                   break;
53524           }
53525           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
53526       });
53527
53528       return response.promise;
53529   }
53530
53531
53532   function setupCanvas(selection, reset) {
53533       if (reset) {
53534           selection.selectAll('#divForCanvasWork')
53535               .remove();
53536       }
53537
53538       // Add the Streetside working canvases. These are used for 'stitching', or combining,
53539       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
53540       selection.selectAll('#divForCanvasWork')
53541           .data([0])
53542           .enter()
53543           .append('div')
53544           .attr('id', 'divForCanvasWork')
53545           .attr('display', 'none')
53546           .selectAll('canvas')
53547           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
53548           .enter()
53549           .append('canvas')
53550           .attr('id', function(d) { return d; })
53551           .attr('width', _resolution)
53552           .attr('height', _resolution);
53553   }
53554
53555
53556   /**
53557    * processFaces()
53558    */
53559   function processFaces(imgFaceInfoGroups) {
53560       var response = q.defer();
53561       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
53562           return loadCanvas(faceImgGroup);
53563       });
53564
53565       q.all(loadCanvasPromises).then(function() {
53566           response.resolve({status: 'processFaces done'});
53567       });
53568
53569       return response.promise;
53570   }
53571
53572
53573
53574   function qkToXY(qk) {
53575       var x = 0;
53576       var y = 0;
53577       var scale = 256;
53578       for (var i = qk.length; i > 0; i--) {
53579           var key = qk[i-1];
53580           x += (+(key === '1' || key === '3')) * scale;
53581           y += (+(key === '2' || key === '3')) * scale;
53582           scale *= 2;
53583       }
53584       return [x, y];
53585   }
53586
53587
53588   function getQuadKeys() {
53589       var dim = _resolution / 256;
53590       var quadKeys;
53591
53592       if (dim === 16) {
53593           quadKeys = [
53594               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
53595               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
53596               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
53597               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
53598               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
53599               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
53600               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
53601               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
53602
53603               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
53604               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
53605               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
53606               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
53607               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
53608               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
53609               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
53610               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
53611           ];
53612
53613       } else if (dim === 8) {
53614           quadKeys = [
53615               '000','001','010','011',  '100','101','110','111',
53616               '002','003','012','013',  '102','103','112','113',
53617               '020','021','030','031',  '120','121','130','131',
53618               '022','023','032','033',  '122','123','132','133',
53619
53620               '200','201','210','211',  '300','301','310','311',
53621               '202','203','212','213',  '302','303','312','313',
53622               '220','221','230','231',  '320','321','330','331',
53623               '222','223','232','233',  '322','323','332','333'
53624           ];
53625
53626       } else if (dim === 4) {
53627           quadKeys = [
53628               '00','01',  '10','11',
53629               '02','03',  '12','13',
53630
53631               '20','21',  '30','31',
53632               '22','23',  '32','33'
53633           ];
53634
53635       } else {  // dim === 2
53636           quadKeys = [
53637               '0', '1',
53638               '2', '3'
53639           ];
53640       }
53641
53642       return quadKeys;
53643   }
53644
53645
53646
53647   var serviceStreetside = {
53648       /**
53649        * init() initialize streetside.
53650        */
53651       init: function () {
53652           if (!_ssCache) {
53653               this.reset();
53654           }
53655
53656           this.event = utilRebind(this, dispatch$6, 'on');
53657       },
53658
53659       /**
53660        * reset() reset the cache.
53661        */
53662       reset: function () {
53663           var cache = _ssCache;
53664
53665           if (cache) {
53666               if (cache.bubbles && cache.bubbles.inflight) {
53667                   forEach(cache.bubbles.inflight, abortRequest$5);
53668               }
53669           }
53670
53671           _ssCache = {
53672               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
53673               sequences: {}
53674           };
53675       },
53676
53677       /**
53678        * bubbles()
53679        */
53680       bubbles: function (projection) {
53681           var limit = 5;
53682           return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
53683       },
53684
53685
53686       sequences: function(projection) {
53687           var viewport = projection.clipExtent();
53688           var min = [viewport[0][0], viewport[1][1]];
53689           var max = [viewport[1][0], viewport[0][1]];
53690           var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
53691           var seen = {};
53692           var results = [];
53693
53694           // all sequences for bubbles in viewport
53695           _ssCache.bubbles.rtree.search(bbox)
53696               .forEach(function(d) {
53697                   var key = d.data.sequenceKey;
53698                   if (key && !seen[key]) {
53699                       seen[key] = true;
53700                       results.push(_ssCache.sequences[key].geojson);
53701                   }
53702               });
53703
53704           return results;
53705       },
53706
53707
53708       /**
53709        * loadBubbles()
53710        */
53711       loadBubbles: function (projection, margin) {
53712           // by default: request 2 nearby tiles so we can connect sequences.
53713           if (margin === undefined) margin = 2;
53714
53715           loadTiles$2('bubbles', bubbleApi, projection, margin);
53716       },
53717
53718
53719       viewer: function() {
53720           return _pannellumViewer;
53721       },
53722
53723
53724       initViewer: function () {
53725           if (!window.pannellum) return;
53726           if (_pannellumViewer) return;
53727
53728           var sceneID = ++_currScene + '';
53729           var options = {
53730               'default': { firstScene: sceneID },
53731               scenes: {}
53732           };
53733           options.scenes[sceneID] = _sceneOptions;
53734
53735           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
53736
53737           _pannellumViewer
53738               .on('mousedown', function() {
53739                   select(window).on('mousemove.pannellum', function() {
53740                       dispatch$6.call('viewerChanged');
53741                   });
53742               })
53743               .on('mouseup', function() {
53744                   select(window).on('mousemove.pannellum', null);
53745                   // continue dispatching events for a few seconds, in case viewer has inertia.
53746                   var t = timer(function(elapsed) {
53747                       dispatch$6.call('viewerChanged');
53748                       if (elapsed > 2000) {
53749                           t.stop();
53750                       }
53751                   });
53752               });
53753       },
53754
53755
53756       /**
53757        * loadViewer() create the streeside viewer.
53758        */
53759       loadViewer: function (context) {
53760           var that = this;
53761
53762           // create ms-wrapper, a photo wrapper class
53763           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
53764               .data([0]);
53765
53766           // inject ms-wrapper into the photoviewer div
53767           // (used by all to house each custom photo viewer)
53768           var wrapEnter = wrap.enter()
53769               .append('div')
53770               .attr('id', 'ms')
53771               .attr('class', 'photo-wrapper ms-wrapper')
53772               .classed('hide', true);
53773
53774           // inject div to support streetside viewer (pannellum) and attribution line
53775           wrapEnter
53776               .append('div')
53777               .attr('id', 'viewer-streetside')
53778               .append('div')
53779               .attr('class', 'photo-attribution fillD');
53780
53781           var controlsEnter = wrapEnter
53782               .append('div')
53783               .attr('class', 'photo-controls-wrap')
53784               .append('div')
53785               .attr('class', 'photo-controls');
53786
53787           controlsEnter
53788               .append('button')
53789               .on('click.back', step(-1))
53790               .text('◄');
53791
53792           controlsEnter
53793               .append('button')
53794               .on('click.forward', step(1))
53795               .text('►');
53796
53797
53798           // create working canvas for stitching together images
53799           wrap = wrap
53800               .merge(wrapEnter)
53801               .call(setupCanvas, true);
53802
53803           // load streetside pannellum viewer css
53804           select('head').selectAll('#streetside-viewercss')
53805               .data([0])
53806               .enter()
53807               .append('link')
53808               .attr('id', 'streetside-viewercss')
53809               .attr('rel', 'stylesheet')
53810               .attr('href', context.asset(pannellumViewerCSS));
53811
53812           // load streetside pannellum viewer js
53813           select('head').selectAll('#streetside-viewerjs')
53814               .data([0])
53815               .enter()
53816               .append('script')
53817               .attr('id', 'streetside-viewerjs')
53818               .attr('src', context.asset(pannellumViewerJS));
53819
53820
53821           // Register viewer resize handler
53822           context.ui().photoviewer.on('resize', function() {
53823               if (_pannellumViewer) {
53824                   _pannellumViewer.resize();
53825               }
53826           });
53827
53828
53829           function step(stepBy) {
53830               return function() {
53831                   var viewer = select('#photoviewer');
53832                   var selected = viewer.empty() ? undefined : viewer.datum();
53833                   if (!selected) return;
53834
53835                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
53836                   var yaw = _pannellumViewer.getYaw();
53837                   var ca = selected.ca + yaw;
53838                   var origin = selected.loc;
53839
53840                   // construct a search trapezoid pointing out from current bubble
53841                   var meters = 35;
53842                   var p1 = [
53843                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
53844                       origin[1]
53845                   ];
53846                   var p2 = [
53847                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
53848                       origin[1] + geoMetersToLat(meters)
53849                   ];
53850                   var p3 = [
53851                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
53852                       origin[1] + geoMetersToLat(meters)
53853                   ];
53854                   var p4 = [
53855                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
53856                       origin[1]
53857                   ];
53858
53859                   var poly = [p1, p2, p3, p4, p1];
53860
53861                   // rotate it to face forward/backward
53862                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
53863                   poly = geoRotate(poly, -angle, origin);
53864
53865                   var extent = poly.reduce(function(extent, point) {
53866                       return extent.extend(geoExtent(point));
53867                   }, geoExtent());
53868
53869                   // find nearest other bubble in the search polygon
53870                   var minDist = Infinity;
53871                   _ssCache.bubbles.rtree.search(extent.bbox())
53872                       .forEach(function(d) {
53873                           if (d.data.key === selected.key) return;
53874                           if (!geoPointInPolygon(d.data.loc, poly)) return;
53875
53876                           var dist = geoVecLength(d.data.loc, selected.loc);
53877                           var theta = selected.ca - d.data.ca;
53878                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
53879                           if (minTheta > 20) {
53880                               dist += 5;  // penalize distance if camera angles don't match
53881                           }
53882
53883                           if (dist < minDist) {
53884                               nextID = d.data.key;
53885                               minDist = dist;
53886                           }
53887                       });
53888
53889                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
53890                   if (!nextBubble) return;
53891
53892                   context.map().centerEase(nextBubble.loc);
53893
53894                   that.selectImage(nextBubble)
53895                       .then(function(r) {
53896                           if (r.status === 'ok') {
53897                               _sceneOptions.yaw = yaw;
53898                               that.showViewer();
53899                           }
53900                       });
53901               };
53902           }
53903       },
53904
53905       /**
53906        * showViewer()
53907        */
53908       showViewer: function (yaw) {
53909           if (!_sceneOptions) return;
53910
53911           if (yaw !== undefined) {
53912               _sceneOptions.yaw = yaw;
53913           }
53914
53915           if (!_pannellumViewer) {
53916               this.initViewer();
53917           } else {
53918               // make a new scene
53919               var sceneID = ++_currScene + '';
53920               _pannellumViewer
53921                   .addScene(sceneID, _sceneOptions)
53922                   .loadScene(sceneID);
53923
53924               // remove previous scene
53925               if (_currScene > 2) {
53926                   sceneID = (_currScene - 1) + '';
53927                   _pannellumViewer
53928                       .removeScene(sceneID);
53929               }
53930           }
53931
53932           var wrap = select('#photoviewer')
53933               .classed('hide', false);
53934
53935           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
53936
53937           if (isHidden) {
53938               wrap
53939                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
53940                   .classed('hide', true);
53941
53942               wrap
53943                   .selectAll('.photo-wrapper.ms-wrapper')
53944                   .classed('hide', false);
53945           }
53946
53947           return this;
53948       },
53949
53950       /**
53951        * hideViewer()
53952        */
53953       hideViewer: function () {
53954           var viewer = select('#photoviewer');
53955           if (!viewer.empty()) viewer.datum(null);
53956
53957           viewer
53958               .classed('hide', true)
53959               .selectAll('.photo-wrapper')
53960               .classed('hide', true);
53961
53962           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
53963               .classed('currentView', false);
53964
53965           return this.setStyles(null, true);
53966       },
53967
53968       /**
53969        * selectImage().
53970        */
53971       selectImage: function (d) {
53972           var response = q.defer();
53973           var that = this;
53974
53975           var viewer = select('#photoviewer');
53976           if (!viewer.empty()) viewer.datum(d);
53977
53978           this.setStyles(null, true);
53979
53980           var wrap = select('#photoviewer .ms-wrapper');
53981           var attribution = wrap.selectAll('.photo-attribution').html('');
53982
53983           wrap.selectAll('.pnlm-load-box')   // display "loading.."
53984               .style('display', 'block');
53985
53986           if (!d) {
53987               response.resolve({status: 'ok'});
53988               return response.promise;
53989           }
53990
53991           var line1 = attribution
53992               .append('div')
53993               .attr('class', 'attribution-row');
53994
53995           // Add hires checkbox
53996           var label = line1
53997               .append('label')
53998               .attr('class', 'streetside-hires');
53999
54000           label
54001               .append('input')
54002               .attr('type', 'checkbox')
54003               .attr('id', 'streetside-hires-input')
54004               .property('checked', _hires)
54005               .on('click', function() {
54006                   event.stopPropagation();
54007
54008                   _hires = !_hires;
54009                   _resolution = _hires ? 1024 : 512;
54010                   wrap.call(setupCanvas, true);
54011
54012                   var viewstate = {
54013                       yaw: _pannellumViewer.getYaw(),
54014                       pitch: _pannellumViewer.getPitch(),
54015                       hfov: _pannellumViewer.getHfov()
54016                   };
54017
54018                   that.selectImage(d)
54019                       .then(function(r) {
54020                           if (r.status === 'ok') {
54021                               _sceneOptions = assignIn(_sceneOptions, viewstate);
54022                               that.showViewer();
54023                           }
54024                       });
54025               });
54026
54027           label
54028               .append('span')
54029               .text(t('streetside.hires'));
54030
54031
54032           var captureInfo = line1
54033               .append('div')
54034               .attr('class', 'attribution-capture-info');
54035
54036           // Add capture date
54037           if (d.captured_by) {
54038               var yyyy = (new Date()).getFullYear();
54039
54040               captureInfo
54041                   .append('a')
54042                   .attr('class', 'captured_by')
54043                   .attr('target', '_blank')
54044                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
54045                   .text('©' + yyyy + ' Microsoft');
54046
54047               captureInfo
54048                   .append('span')
54049                   .text('|');
54050           }
54051
54052           if (d.captured_at) {
54053               captureInfo
54054                   .append('span')
54055                   .attr('class', 'captured_at')
54056                   .text(localeTimestamp(d.captured_at));
54057           }
54058
54059           // Add image links
54060           var line2 = attribution
54061               .append('div')
54062               .attr('class', 'attribution-row');
54063
54064           line2
54065               .append('a')
54066               .attr('class', 'image-view-link')
54067               .attr('target', '_blank')
54068               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
54069                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
54070               .text(t('streetside.view_on_bing'));
54071
54072           line2
54073               .append('a')
54074               .attr('class', 'image-report-link')
54075               .attr('target', '_blank')
54076               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
54077                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
54078               .text(t('streetside.report'));
54079
54080
54081           var bubbleIdQuadKey = d.key.toString(4);
54082           var paddingNeeded = 16 - bubbleIdQuadKey.length;
54083           for (var i = 0; i < paddingNeeded; i++) {
54084               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
54085           }
54086           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
54087           var imgUrlSuffix = '.jpg?g=6338&n=z';
54088
54089           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
54090           var faceKeys = ['01','02','03','10','11','12'];
54091
54092           // Map images to cube faces
54093           var quadKeys = getQuadKeys();
54094           var faces = faceKeys.map(function(faceKey) {
54095               return quadKeys.map(function(quadKey) {
54096                   var xy = qkToXY(quadKey);
54097                   return {
54098                       face: faceKey,
54099                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
54100                       x: xy[0],
54101                       y: xy[1]
54102                   };
54103               });
54104           });
54105
54106           processFaces(faces).then(function() {
54107               _sceneOptions = {
54108                   showFullscreenCtrl: false,
54109                   autoLoad: true,
54110                   compass: true,
54111                   northOffset: d.ca,
54112                   yaw: 0,
54113                   minHfov: minHfov,
54114                   maxHfov: maxHfov,
54115                   hfov: defaultHfov,
54116                   type: 'cubemap',
54117                   cubeMap: [
54118                       _dataUrlArray[0],
54119                       _dataUrlArray[1],
54120                       _dataUrlArray[2],
54121                       _dataUrlArray[3],
54122                       _dataUrlArray[4],
54123                       _dataUrlArray[5]
54124                   ]
54125               };
54126               response.resolve({status: 'ok'});
54127           });
54128
54129           return response.promise;
54130       },
54131
54132
54133       getSequenceKeyForBubble: function(d) {
54134           return d && d.sequenceKey;
54135       },
54136
54137
54138       // Updates the currently highlighted sequence and selected bubble.
54139       // Reset is only necessary when interacting with the viewport because
54140       // this implicitly changes the currently selected bubble/sequence
54141       setStyles: function (hovered, reset) {
54142           if (reset) {  // reset all layers
54143               d3_selectAll('.viewfield-group')
54144                   .classed('highlighted', false)
54145                   .classed('hovered', false)
54146                   .classed('currentView', false);
54147
54148               d3_selectAll('.sequence')
54149                   .classed('highlighted', false)
54150                   .classed('currentView', false);
54151           }
54152
54153           var hoveredBubbleKey = hovered && hovered.key;
54154           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
54155           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
54156           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
54157
54158           var viewer = select('#photoviewer');
54159           var selected = viewer.empty() ? undefined : viewer.datum();
54160           var selectedBubbleKey = selected && selected.key;
54161           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
54162           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
54163           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
54164
54165           // highlight sibling viewfields on either the selected or the hovered sequences
54166           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
54167
54168           d3_selectAll('.layer-streetside-images .viewfield-group')
54169               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
54170               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
54171               .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
54172
54173           d3_selectAll('.layer-streetside-images .sequence')
54174               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
54175               .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
54176
54177           // update viewfields if needed
54178           d3_selectAll('.viewfield-group .viewfield')
54179               .attr('d', viewfieldPath);
54180
54181           function viewfieldPath() {
54182               var d = this.parentNode.__data__;
54183               if (d.pano && d.key !== selectedBubbleKey) {
54184                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
54185               } else {
54186                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
54187               }
54188           }
54189
54190           return this;
54191       },
54192
54193       /**
54194        * cache().
54195        */
54196       cache: function () {
54197           return _ssCache;
54198       }
54199   };
54200
54201   var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
54202   var _inflight$1 = {};
54203   var _popularKeys = {};
54204   var _taginfoCache = {};
54205
54206   var tag_sorts = {
54207       point: 'count_nodes',
54208       vertex: 'count_nodes',
54209       area: 'count_ways',
54210       line: 'count_ways'
54211   };
54212   var tag_sort_members = {
54213       point: 'count_node_members',
54214       vertex: 'count_node_members',
54215       area: 'count_way_members',
54216       line: 'count_way_members',
54217       relation: 'count_relation_members'
54218   };
54219   var tag_filters = {
54220       point: 'nodes',
54221       vertex: 'nodes',
54222       area: 'ways',
54223       line: 'ways'
54224   };
54225   var tag_members_fractions = {
54226       point: 'count_node_members_fraction',
54227       vertex: 'count_node_members_fraction',
54228       area: 'count_way_members_fraction',
54229       line: 'count_way_members_fraction',
54230       relation: 'count_relation_members_fraction'
54231   };
54232
54233
54234   function sets(params, n, o) {
54235       if (params.geometry && o[params.geometry]) {
54236           params[n] = o[params.geometry];
54237       }
54238       return params;
54239   }
54240
54241
54242   function setFilter(params) {
54243       return sets(params, 'filter', tag_filters);
54244   }
54245
54246
54247   function setSort(params) {
54248       return sets(params, 'sortname', tag_sorts);
54249   }
54250
54251
54252   function setSortMembers(params) {
54253       return sets(params, 'sortname', tag_sort_members);
54254   }
54255
54256
54257   function clean(params) {
54258       return omit(params, ['geometry', 'debounce']);
54259   }
54260
54261
54262   function filterKeys(type) {
54263       var count_type = type ? 'count_' + type : 'count_all';
54264       return function(d) {
54265           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
54266       };
54267   }
54268
54269
54270   function filterMultikeys(prefix) {
54271       return function(d) {
54272           // d.key begins with prefix, and d.key contains no additional ':'s
54273           var re = new RegExp('^' + prefix + '(.*)$');
54274           var matches = d.key.match(re) || [];
54275           return (matches.length === 2 && matches[1].indexOf(':') === -1);
54276       };
54277   }
54278
54279
54280   function filterValues(allowUpperCase) {
54281       return function(d) {
54282           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
54283           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
54284           return parseFloat(d.fraction) > 0.0;
54285       };
54286   }
54287
54288
54289   function filterRoles(geometry) {
54290       return function(d) {
54291           if (d.role === '') return false; // exclude empty role
54292           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
54293           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
54294       };
54295   }
54296
54297
54298   function valKey(d) {
54299       return {
54300           value: d.key,
54301           title: d.key
54302       };
54303   }
54304
54305
54306   function valKeyDescription(d) {
54307       return {
54308           value: d.value,
54309           title: d.description || d.value
54310       };
54311   }
54312
54313
54314   function roleKey(d) {
54315       return {
54316           value: d.role,
54317           title: d.role
54318       };
54319   }
54320
54321
54322   // sort keys with ':' lower than keys without ':'
54323   function sortKeys(a, b) {
54324       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
54325           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
54326           : 0;
54327   }
54328
54329
54330   var debouncedRequest$1 = debounce(request$2, 300, { leading: false });
54331
54332   function request$2(url, params, exactMatch, callback, loaded) {
54333       if (_inflight$1[url]) return;
54334
54335       if (checkCache(url, params, exactMatch, callback)) return;
54336
54337       _inflight$1[url] = d3_json(url, function (err, data) {
54338           delete _inflight$1[url];
54339           loaded(err, data);
54340       });
54341   }
54342
54343
54344   function checkCache(url, params, exactMatch, callback) {
54345       var rp = params.rp || 25;
54346       var testQuery = params.query || '';
54347       var testUrl = url;
54348
54349       do {
54350           var hit = _taginfoCache[testUrl];
54351
54352           // exact match, or shorter match yielding fewer than max results (rp)
54353           if (hit && (url === testUrl || hit.length < rp)) {
54354               callback(null, hit);
54355               return true;
54356           }
54357
54358           // don't try to shorten the query
54359           if (exactMatch || !testQuery.length) return false;
54360
54361           // do shorten the query to see if we already have a cached result
54362           // that has returned fewer than max results (rp)
54363           testQuery = testQuery.slice(0, -1);
54364           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
54365       } while (testQuery.length >= 0);
54366
54367       return false;
54368   }
54369
54370
54371   var serviceTaginfo = {
54372
54373       init: function() {
54374           _inflight$1 = {};
54375           _taginfoCache = {};
54376           _popularKeys = {
54377               postal_code: true   // #5377
54378           };
54379
54380           // Fetch popular keys.  We'll exclude these from `values`
54381           // lookups because they stress taginfo, and they aren't likely
54382           // to yield meaningful autocomplete results.. see #3955
54383           var params = {
54384               rp: 100,
54385               sortname: 'values_all',
54386               sortorder: 'desc',
54387               page: 1,
54388               debounce: false,
54389               lang: currentLocale
54390           };
54391           this.keys(params, function(err, data) {
54392               if (err) return;
54393               data.forEach(function(d) {
54394                   if (d.value === 'opening_hours') return;  // exception
54395                   _popularKeys[d.value] = true;
54396               });
54397           });
54398       },
54399
54400
54401       reset: function() {
54402           forEach(_inflight$1, function(req) { req.abort(); });
54403           _inflight$1 = {};
54404       },
54405
54406
54407       keys: function(params, callback) {
54408           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54409           params = clean(setSort(params));
54410           params = assignIn({
54411               rp: 10,
54412               sortname: 'count_all',
54413               sortorder: 'desc',
54414               page: 1,
54415               lang: currentLocale
54416           }, params);
54417
54418           var url = apibase$4 + 'keys/all?' + utilQsString(params);
54419           doRequest(url, params, false, callback, function(err, d) {
54420               if (err) {
54421                   callback(err);
54422               } else {
54423                   var f = filterKeys(params.filter);
54424                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
54425                   _taginfoCache[url] = result;
54426                   callback(null, result);
54427               }
54428           });
54429       },
54430
54431
54432       multikeys: function(params, callback) {
54433           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54434           params = clean(setSort(params));
54435           params = assignIn({
54436               rp: 25,
54437               sortname: 'count_all',
54438               sortorder: 'desc',
54439               page: 1,
54440               lang: currentLocale
54441           }, params);
54442
54443           var prefix = params.query;
54444           var url = apibase$4 + 'keys/all?' + utilQsString(params);
54445           doRequest(url, params, true, callback, function(err, d) {
54446               if (err) {
54447                   callback(err);
54448               } else {
54449                   var f = filterMultikeys(prefix);
54450                   var result = d.data.filter(f).map(valKey);
54451                   _taginfoCache[url] = result;
54452                   callback(null, result);
54453               }
54454           });
54455       },
54456
54457
54458       values: function(params, callback) {
54459           // Exclude popular keys from values lookups.. see #3955
54460           var key = params.key;
54461           if (key && _popularKeys[key]) {
54462               callback(null, []);
54463               return;
54464           }
54465
54466           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54467           params = clean(setSort(setFilter(params)));
54468           params = assignIn({
54469               rp: 25,
54470               sortname: 'count_all',
54471               sortorder: 'desc',
54472               page: 1,
54473               lang: currentLocale
54474           }, params);
54475
54476           var url = apibase$4 + 'key/values?' + utilQsString(params);
54477           doRequest(url, params, false, callback, function(err, d) {
54478               if (err) {
54479                   callback(err);
54480               } else {
54481                   // In most cases we prefer taginfo value results with lowercase letters.
54482                   // A few OSM keys expect values to contain uppercase values (see #3377).
54483                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
54484                   // but these are the fields where taginfo value lookup is most useful.
54485                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
54486                   var allowUpperCase = (params.key.match(re) !== null);
54487                   var f = filterValues(allowUpperCase);
54488
54489                   var result = d.data.filter(f).map(valKeyDescription);
54490                   _taginfoCache[url] = result;
54491                   callback(null, result);
54492               }
54493           });
54494       },
54495
54496
54497       roles: function(params, callback) {
54498           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54499           var geometry = params.geometry;
54500           params = clean(setSortMembers(params));
54501           params = assignIn({
54502               rp: 25,
54503               sortname: 'count_all_members',
54504               sortorder: 'desc',
54505               page: 1,
54506               lang: currentLocale
54507           }, params);
54508
54509           var url = apibase$4 + 'relation/roles?' + utilQsString(params);
54510           doRequest(url, params, true, callback, function(err, d) {
54511               if (err) {
54512                   callback(err);
54513               } else {
54514                   var f = filterRoles(geometry);
54515                   var result = d.data.filter(f).map(roleKey);
54516                   _taginfoCache[url] = result;
54517                   callback(null, result);
54518               }
54519           });
54520       },
54521
54522
54523       docs: function(params, callback) {
54524           var doRequest = params.debounce ? debouncedRequest$1 : request$2;
54525           params = clean(setSort(params));
54526
54527           var path = 'key/wiki_pages?';
54528           if (params.value) {
54529               path = 'tag/wiki_pages?';
54530           } else if (params.rtype) {
54531               path = 'relation/wiki_pages?';
54532           }
54533
54534           var url = apibase$4 + path + utilQsString(params);
54535           doRequest(url, params, true, callback, function(err, d) {
54536               if (err) {
54537                   callback(err);
54538               } else {
54539                   _taginfoCache[url] = d.data;
54540                   callback(null, d.data);
54541               }
54542           });
54543       },
54544
54545
54546       apibase: function(_) {
54547           if (!arguments.length) return apibase$4;
54548           apibase$4 = _;
54549           return this;
54550       }
54551
54552   };
54553
54554   var helpers = createCommonjsModule(function (module, exports) {
54555   Object.defineProperty(exports, "__esModule", { value: true });
54556   /**
54557    * @module helpers
54558    */
54559   /**
54560    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
54561    *
54562    * @memberof helpers
54563    * @type {number}
54564    */
54565   exports.earthRadius = 6371008.8;
54566   /**
54567    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
54568    *
54569    * @memberof helpers
54570    * @type {Object}
54571    */
54572   exports.factors = {
54573       centimeters: exports.earthRadius * 100,
54574       centimetres: exports.earthRadius * 100,
54575       degrees: exports.earthRadius / 111325,
54576       feet: exports.earthRadius * 3.28084,
54577       inches: exports.earthRadius * 39.370,
54578       kilometers: exports.earthRadius / 1000,
54579       kilometres: exports.earthRadius / 1000,
54580       meters: exports.earthRadius,
54581       metres: exports.earthRadius,
54582       miles: exports.earthRadius / 1609.344,
54583       millimeters: exports.earthRadius * 1000,
54584       millimetres: exports.earthRadius * 1000,
54585       nauticalmiles: exports.earthRadius / 1852,
54586       radians: 1,
54587       yards: exports.earthRadius / 1.0936,
54588   };
54589   /**
54590    * Units of measurement factors based on 1 meter.
54591    *
54592    * @memberof helpers
54593    * @type {Object}
54594    */
54595   exports.unitsFactors = {
54596       centimeters: 100,
54597       centimetres: 100,
54598       degrees: 1 / 111325,
54599       feet: 3.28084,
54600       inches: 39.370,
54601       kilometers: 1 / 1000,
54602       kilometres: 1 / 1000,
54603       meters: 1,
54604       metres: 1,
54605       miles: 1 / 1609.344,
54606       millimeters: 1000,
54607       millimetres: 1000,
54608       nauticalmiles: 1 / 1852,
54609       radians: 1 / exports.earthRadius,
54610       yards: 1 / 1.0936,
54611   };
54612   /**
54613    * Area of measurement factors based on 1 square meter.
54614    *
54615    * @memberof helpers
54616    * @type {Object}
54617    */
54618   exports.areaFactors = {
54619       acres: 0.000247105,
54620       centimeters: 10000,
54621       centimetres: 10000,
54622       feet: 10.763910417,
54623       inches: 1550.003100006,
54624       kilometers: 0.000001,
54625       kilometres: 0.000001,
54626       meters: 1,
54627       metres: 1,
54628       miles: 3.86e-7,
54629       millimeters: 1000000,
54630       millimetres: 1000000,
54631       yards: 1.195990046,
54632   };
54633   /**
54634    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
54635    *
54636    * @name feature
54637    * @param {Geometry} geometry input geometry
54638    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54639    * @param {Object} [options={}] Optional Parameters
54640    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54641    * @param {string|number} [options.id] Identifier associated with the Feature
54642    * @returns {Feature} a GeoJSON Feature
54643    * @example
54644    * var geometry = {
54645    *   "type": "Point",
54646    *   "coordinates": [110, 50]
54647    * };
54648    *
54649    * var feature = turf.feature(geometry);
54650    *
54651    * //=feature
54652    */
54653   function feature(geom, properties, options) {
54654       if (options === void 0) { options = {}; }
54655       var feat = { type: "Feature" };
54656       if (options.id === 0 || options.id) {
54657           feat.id = options.id;
54658       }
54659       if (options.bbox) {
54660           feat.bbox = options.bbox;
54661       }
54662       feat.properties = properties || {};
54663       feat.geometry = geom;
54664       return feat;
54665   }
54666   exports.feature = feature;
54667   /**
54668    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
54669    * For GeometryCollection type use `helpers.geometryCollection`
54670    *
54671    * @name geometry
54672    * @param {string} type Geometry Type
54673    * @param {Array<any>} coordinates Coordinates
54674    * @param {Object} [options={}] Optional Parameters
54675    * @returns {Geometry} a GeoJSON Geometry
54676    * @example
54677    * var type = "Point";
54678    * var coordinates = [110, 50];
54679    * var geometry = turf.geometry(type, coordinates);
54680    * // => geometry
54681    */
54682   function geometry(type, coordinates, options) {
54683       if (options === void 0) { options = {}; }
54684       switch (type) {
54685           case "Point": return point(coordinates).geometry;
54686           case "LineString": return lineString(coordinates).geometry;
54687           case "Polygon": return polygon(coordinates).geometry;
54688           case "MultiPoint": return multiPoint(coordinates).geometry;
54689           case "MultiLineString": return multiLineString(coordinates).geometry;
54690           case "MultiPolygon": return multiPolygon(coordinates).geometry;
54691           default: throw new Error(type + " is invalid");
54692       }
54693   }
54694   exports.geometry = geometry;
54695   /**
54696    * Creates a {@link Point} {@link Feature} from a Position.
54697    *
54698    * @name point
54699    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
54700    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54701    * @param {Object} [options={}] Optional Parameters
54702    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54703    * @param {string|number} [options.id] Identifier associated with the Feature
54704    * @returns {Feature<Point>} a Point feature
54705    * @example
54706    * var point = turf.point([-75.343, 39.984]);
54707    *
54708    * //=point
54709    */
54710   function point(coordinates, properties, options) {
54711       if (options === void 0) { options = {}; }
54712       var geom = {
54713           type: "Point",
54714           coordinates: coordinates,
54715       };
54716       return feature(geom, properties, options);
54717   }
54718   exports.point = point;
54719   /**
54720    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
54721    *
54722    * @name points
54723    * @param {Array<Array<number>>} coordinates an array of Points
54724    * @param {Object} [properties={}] Translate these properties to each Feature
54725    * @param {Object} [options={}] Optional Parameters
54726    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
54727    * associated with the FeatureCollection
54728    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54729    * @returns {FeatureCollection<Point>} Point Feature
54730    * @example
54731    * var points = turf.points([
54732    *   [-75, 39],
54733    *   [-80, 45],
54734    *   [-78, 50]
54735    * ]);
54736    *
54737    * //=points
54738    */
54739   function points(coordinates, properties, options) {
54740       if (options === void 0) { options = {}; }
54741       return featureCollection(coordinates.map(function (coords) {
54742           return point(coords, properties);
54743       }), options);
54744   }
54745   exports.points = points;
54746   /**
54747    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
54748    *
54749    * @name polygon
54750    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
54751    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54752    * @param {Object} [options={}] Optional Parameters
54753    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54754    * @param {string|number} [options.id] Identifier associated with the Feature
54755    * @returns {Feature<Polygon>} Polygon Feature
54756    * @example
54757    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
54758    *
54759    * //=polygon
54760    */
54761   function polygon(coordinates, properties, options) {
54762       if (options === void 0) { options = {}; }
54763       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
54764           var ring = coordinates_1[_i];
54765           if (ring.length < 4) {
54766               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
54767           }
54768           for (var j = 0; j < ring[ring.length - 1].length; j++) {
54769               // Check if first point of Polygon contains two numbers
54770               if (ring[ring.length - 1][j] !== ring[0][j]) {
54771                   throw new Error("First and last Position are not equivalent.");
54772               }
54773           }
54774       }
54775       var geom = {
54776           type: "Polygon",
54777           coordinates: coordinates,
54778       };
54779       return feature(geom, properties, options);
54780   }
54781   exports.polygon = polygon;
54782   /**
54783    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
54784    *
54785    * @name polygons
54786    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
54787    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54788    * @param {Object} [options={}] Optional Parameters
54789    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54790    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54791    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
54792    * @example
54793    * var polygons = turf.polygons([
54794    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
54795    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
54796    * ]);
54797    *
54798    * //=polygons
54799    */
54800   function polygons(coordinates, properties, options) {
54801       if (options === void 0) { options = {}; }
54802       return featureCollection(coordinates.map(function (coords) {
54803           return polygon(coords, properties);
54804       }), options);
54805   }
54806   exports.polygons = polygons;
54807   /**
54808    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
54809    *
54810    * @name lineString
54811    * @param {Array<Array<number>>} coordinates an array of Positions
54812    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54813    * @param {Object} [options={}] Optional Parameters
54814    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54815    * @param {string|number} [options.id] Identifier associated with the Feature
54816    * @returns {Feature<LineString>} LineString Feature
54817    * @example
54818    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
54819    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
54820    *
54821    * //=linestring1
54822    * //=linestring2
54823    */
54824   function lineString(coordinates, properties, options) {
54825       if (options === void 0) { options = {}; }
54826       if (coordinates.length < 2) {
54827           throw new Error("coordinates must be an array of two or more positions");
54828       }
54829       var geom = {
54830           type: "LineString",
54831           coordinates: coordinates,
54832       };
54833       return feature(geom, properties, options);
54834   }
54835   exports.lineString = lineString;
54836   /**
54837    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
54838    *
54839    * @name lineStrings
54840    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
54841    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54842    * @param {Object} [options={}] Optional Parameters
54843    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
54844    * associated with the FeatureCollection
54845    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
54846    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
54847    * @example
54848    * var linestrings = turf.lineStrings([
54849    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
54850    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
54851    * ]);
54852    *
54853    * //=linestrings
54854    */
54855   function lineStrings(coordinates, properties, options) {
54856       if (options === void 0) { options = {}; }
54857       return featureCollection(coordinates.map(function (coords) {
54858           return lineString(coords, properties);
54859       }), options);
54860   }
54861   exports.lineStrings = lineStrings;
54862   /**
54863    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
54864    *
54865    * @name featureCollection
54866    * @param {Feature[]} features input features
54867    * @param {Object} [options={}] Optional Parameters
54868    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54869    * @param {string|number} [options.id] Identifier associated with the Feature
54870    * @returns {FeatureCollection} FeatureCollection of Features
54871    * @example
54872    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
54873    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
54874    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
54875    *
54876    * var collection = turf.featureCollection([
54877    *   locationA,
54878    *   locationB,
54879    *   locationC
54880    * ]);
54881    *
54882    * //=collection
54883    */
54884   function featureCollection(features, options) {
54885       if (options === void 0) { options = {}; }
54886       var fc = { type: "FeatureCollection" };
54887       if (options.id) {
54888           fc.id = options.id;
54889       }
54890       if (options.bbox) {
54891           fc.bbox = options.bbox;
54892       }
54893       fc.features = features;
54894       return fc;
54895   }
54896   exports.featureCollection = featureCollection;
54897   /**
54898    * Creates a {@link Feature<MultiLineString>} based on a
54899    * coordinate array. Properties can be added optionally.
54900    *
54901    * @name multiLineString
54902    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
54903    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54904    * @param {Object} [options={}] Optional Parameters
54905    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54906    * @param {string|number} [options.id] Identifier associated with the Feature
54907    * @returns {Feature<MultiLineString>} a MultiLineString feature
54908    * @throws {Error} if no coordinates are passed
54909    * @example
54910    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
54911    *
54912    * //=multiLine
54913    */
54914   function multiLineString(coordinates, properties, options) {
54915       if (options === void 0) { options = {}; }
54916       var geom = {
54917           type: "MultiLineString",
54918           coordinates: coordinates,
54919       };
54920       return feature(geom, properties, options);
54921   }
54922   exports.multiLineString = multiLineString;
54923   /**
54924    * Creates a {@link Feature<MultiPoint>} based on a
54925    * coordinate array. Properties can be added optionally.
54926    *
54927    * @name multiPoint
54928    * @param {Array<Array<number>>} coordinates an array of Positions
54929    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54930    * @param {Object} [options={}] Optional Parameters
54931    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54932    * @param {string|number} [options.id] Identifier associated with the Feature
54933    * @returns {Feature<MultiPoint>} a MultiPoint feature
54934    * @throws {Error} if no coordinates are passed
54935    * @example
54936    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
54937    *
54938    * //=multiPt
54939    */
54940   function multiPoint(coordinates, properties, options) {
54941       if (options === void 0) { options = {}; }
54942       var geom = {
54943           type: "MultiPoint",
54944           coordinates: coordinates,
54945       };
54946       return feature(geom, properties, options);
54947   }
54948   exports.multiPoint = multiPoint;
54949   /**
54950    * Creates a {@link Feature<MultiPolygon>} based on a
54951    * coordinate array. Properties can be added optionally.
54952    *
54953    * @name multiPolygon
54954    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
54955    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54956    * @param {Object} [options={}] Optional Parameters
54957    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54958    * @param {string|number} [options.id] Identifier associated with the Feature
54959    * @returns {Feature<MultiPolygon>} a multipolygon feature
54960    * @throws {Error} if no coordinates are passed
54961    * @example
54962    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
54963    *
54964    * //=multiPoly
54965    *
54966    */
54967   function multiPolygon(coordinates, properties, options) {
54968       if (options === void 0) { options = {}; }
54969       var geom = {
54970           type: "MultiPolygon",
54971           coordinates: coordinates,
54972       };
54973       return feature(geom, properties, options);
54974   }
54975   exports.multiPolygon = multiPolygon;
54976   /**
54977    * Creates a {@link Feature<GeometryCollection>} based on a
54978    * coordinate array. Properties can be added optionally.
54979    *
54980    * @name geometryCollection
54981    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
54982    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
54983    * @param {Object} [options={}] Optional Parameters
54984    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
54985    * @param {string|number} [options.id] Identifier associated with the Feature
54986    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
54987    * @example
54988    * var pt = turf.geometry("Point", [100, 0]);
54989    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
54990    * var collection = turf.geometryCollection([pt, line]);
54991    *
54992    * // => collection
54993    */
54994   function geometryCollection(geometries, properties, options) {
54995       if (options === void 0) { options = {}; }
54996       var geom = {
54997           type: "GeometryCollection",
54998           geometries: geometries,
54999       };
55000       return feature(geom, properties, options);
55001   }
55002   exports.geometryCollection = geometryCollection;
55003   /**
55004    * Round number to precision
55005    *
55006    * @param {number} num Number
55007    * @param {number} [precision=0] Precision
55008    * @returns {number} rounded number
55009    * @example
55010    * turf.round(120.4321)
55011    * //=120
55012    *
55013    * turf.round(120.4321, 2)
55014    * //=120.43
55015    */
55016   function round(num, precision) {
55017       if (precision === void 0) { precision = 0; }
55018       if (precision && !(precision >= 0)) {
55019           throw new Error("precision must be a positive number");
55020       }
55021       var multiplier = Math.pow(10, precision || 0);
55022       return Math.round(num * multiplier) / multiplier;
55023   }
55024   exports.round = round;
55025   /**
55026    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
55027    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
55028    *
55029    * @name radiansToLength
55030    * @param {number} radians in radians across the sphere
55031    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
55032    * meters, kilometres, kilometers.
55033    * @returns {number} distance
55034    */
55035   function radiansToLength(radians, units) {
55036       if (units === void 0) { units = "kilometers"; }
55037       var factor = exports.factors[units];
55038       if (!factor) {
55039           throw new Error(units + " units is invalid");
55040       }
55041       return radians * factor;
55042   }
55043   exports.radiansToLength = radiansToLength;
55044   /**
55045    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
55046    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
55047    *
55048    * @name lengthToRadians
55049    * @param {number} distance in real units
55050    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
55051    * meters, kilometres, kilometers.
55052    * @returns {number} radians
55053    */
55054   function lengthToRadians(distance, units) {
55055       if (units === void 0) { units = "kilometers"; }
55056       var factor = exports.factors[units];
55057       if (!factor) {
55058           throw new Error(units + " units is invalid");
55059       }
55060       return distance / factor;
55061   }
55062   exports.lengthToRadians = lengthToRadians;
55063   /**
55064    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
55065    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
55066    *
55067    * @name lengthToDegrees
55068    * @param {number} distance in real units
55069    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
55070    * meters, kilometres, kilometers.
55071    * @returns {number} degrees
55072    */
55073   function lengthToDegrees(distance, units) {
55074       return radiansToDegrees(lengthToRadians(distance, units));
55075   }
55076   exports.lengthToDegrees = lengthToDegrees;
55077   /**
55078    * Converts any bearing angle from the north line direction (positive clockwise)
55079    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
55080    *
55081    * @name bearingToAzimuth
55082    * @param {number} bearing angle, between -180 and +180 degrees
55083    * @returns {number} angle between 0 and 360 degrees
55084    */
55085   function bearingToAzimuth(bearing) {
55086       var angle = bearing % 360;
55087       if (angle < 0) {
55088           angle += 360;
55089       }
55090       return angle;
55091   }
55092   exports.bearingToAzimuth = bearingToAzimuth;
55093   /**
55094    * Converts an angle in radians to degrees
55095    *
55096    * @name radiansToDegrees
55097    * @param {number} radians angle in radians
55098    * @returns {number} degrees between 0 and 360 degrees
55099    */
55100   function radiansToDegrees(radians) {
55101       var degrees = radians % (2 * Math.PI);
55102       return degrees * 180 / Math.PI;
55103   }
55104   exports.radiansToDegrees = radiansToDegrees;
55105   /**
55106    * Converts an angle in degrees to radians
55107    *
55108    * @name degreesToRadians
55109    * @param {number} degrees angle between 0 and 360 degrees
55110    * @returns {number} angle in radians
55111    */
55112   function degreesToRadians(degrees) {
55113       var radians = degrees % 360;
55114       return radians * Math.PI / 180;
55115   }
55116   exports.degreesToRadians = degreesToRadians;
55117   /**
55118    * Converts a length to the requested unit.
55119    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
55120    *
55121    * @param {number} length to be converted
55122    * @param {Units} [originalUnit="kilometers"] of the length
55123    * @param {Units} [finalUnit="kilometers"] returned unit
55124    * @returns {number} the converted length
55125    */
55126   function convertLength(length, originalUnit, finalUnit) {
55127       if (originalUnit === void 0) { originalUnit = "kilometers"; }
55128       if (finalUnit === void 0) { finalUnit = "kilometers"; }
55129       if (!(length >= 0)) {
55130           throw new Error("length must be a positive number");
55131       }
55132       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
55133   }
55134   exports.convertLength = convertLength;
55135   /**
55136    * Converts a area to the requested unit.
55137    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
55138    * @param {number} area to be converted
55139    * @param {Units} [originalUnit="meters"] of the distance
55140    * @param {Units} [finalUnit="kilometers"] returned unit
55141    * @returns {number} the converted distance
55142    */
55143   function convertArea(area, originalUnit, finalUnit) {
55144       if (originalUnit === void 0) { originalUnit = "meters"; }
55145       if (finalUnit === void 0) { finalUnit = "kilometers"; }
55146       if (!(area >= 0)) {
55147           throw new Error("area must be a positive number");
55148       }
55149       var startFactor = exports.areaFactors[originalUnit];
55150       if (!startFactor) {
55151           throw new Error("invalid original units");
55152       }
55153       var finalFactor = exports.areaFactors[finalUnit];
55154       if (!finalFactor) {
55155           throw new Error("invalid final units");
55156       }
55157       return (area / startFactor) * finalFactor;
55158   }
55159   exports.convertArea = convertArea;
55160   /**
55161    * isNumber
55162    *
55163    * @param {*} num Number to validate
55164    * @returns {boolean} true/false
55165    * @example
55166    * turf.isNumber(123)
55167    * //=true
55168    * turf.isNumber('foo')
55169    * //=false
55170    */
55171   function isNumber(num) {
55172       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
55173   }
55174   exports.isNumber = isNumber;
55175   /**
55176    * isObject
55177    *
55178    * @param {*} input variable to validate
55179    * @returns {boolean} true/false
55180    * @example
55181    * turf.isObject({elevation: 10})
55182    * //=true
55183    * turf.isObject('foo')
55184    * //=false
55185    */
55186   function isObject(input) {
55187       return (!!input) && (input.constructor === Object);
55188   }
55189   exports.isObject = isObject;
55190   /**
55191    * Validate BBox
55192    *
55193    * @private
55194    * @param {Array<number>} bbox BBox to validate
55195    * @returns {void}
55196    * @throws Error if BBox is not valid
55197    * @example
55198    * validateBBox([-180, -40, 110, 50])
55199    * //=OK
55200    * validateBBox([-180, -40])
55201    * //=Error
55202    * validateBBox('Foo')
55203    * //=Error
55204    * validateBBox(5)
55205    * //=Error
55206    * validateBBox(null)
55207    * //=Error
55208    * validateBBox(undefined)
55209    * //=Error
55210    */
55211   function validateBBox(bbox) {
55212       if (!bbox) {
55213           throw new Error("bbox is required");
55214       }
55215       if (!Array.isArray(bbox)) {
55216           throw new Error("bbox must be an Array");
55217       }
55218       if (bbox.length !== 4 && bbox.length !== 6) {
55219           throw new Error("bbox must be an Array of 4 or 6 numbers");
55220       }
55221       bbox.forEach(function (num) {
55222           if (!isNumber(num)) {
55223               throw new Error("bbox must only contain numbers");
55224           }
55225       });
55226   }
55227   exports.validateBBox = validateBBox;
55228   /**
55229    * Validate Id
55230    *
55231    * @private
55232    * @param {string|number} id Id to validate
55233    * @returns {void}
55234    * @throws Error if Id is not valid
55235    * @example
55236    * validateId([-180, -40, 110, 50])
55237    * //=Error
55238    * validateId([-180, -40])
55239    * //=Error
55240    * validateId('Foo')
55241    * //=OK
55242    * validateId(5)
55243    * //=OK
55244    * validateId(null)
55245    * //=Error
55246    * validateId(undefined)
55247    * //=Error
55248    */
55249   function validateId(id) {
55250       if (!id) {
55251           throw new Error("id is required");
55252       }
55253       if (["string", "number"].indexOf(typeof id) === -1) {
55254           throw new Error("id must be a number or a string");
55255       }
55256   }
55257   exports.validateId = validateId;
55258   // Deprecated methods
55259   function radians2degrees() {
55260       throw new Error("method has been renamed to `radiansToDegrees`");
55261   }
55262   exports.radians2degrees = radians2degrees;
55263   function degrees2radians() {
55264       throw new Error("method has been renamed to `degreesToRadians`");
55265   }
55266   exports.degrees2radians = degrees2radians;
55267   function distanceToDegrees() {
55268       throw new Error("method has been renamed to `lengthToDegrees`");
55269   }
55270   exports.distanceToDegrees = distanceToDegrees;
55271   function distanceToRadians() {
55272       throw new Error("method has been renamed to `lengthToRadians`");
55273   }
55274   exports.distanceToRadians = distanceToRadians;
55275   function radiansToDistance() {
55276       throw new Error("method has been renamed to `radiansToLength`");
55277   }
55278   exports.radiansToDistance = radiansToDistance;
55279   function bearingToAngle() {
55280       throw new Error("method has been renamed to `bearingToAzimuth`");
55281   }
55282   exports.bearingToAngle = bearingToAngle;
55283   function convertDistance() {
55284       throw new Error("method has been renamed to `convertLength`");
55285   }
55286   exports.convertDistance = convertDistance;
55287   });
55288
55289   unwrapExports(helpers);
55290   var helpers_1 = helpers.earthRadius;
55291   var helpers_2 = helpers.factors;
55292   var helpers_3 = helpers.unitsFactors;
55293   var helpers_4 = helpers.areaFactors;
55294   var helpers_5 = helpers.feature;
55295   var helpers_6 = helpers.geometry;
55296   var helpers_7 = helpers.point;
55297   var helpers_8 = helpers.points;
55298   var helpers_9 = helpers.polygon;
55299   var helpers_10 = helpers.polygons;
55300   var helpers_11 = helpers.lineString;
55301   var helpers_12 = helpers.lineStrings;
55302   var helpers_13 = helpers.featureCollection;
55303   var helpers_14 = helpers.multiLineString;
55304   var helpers_15 = helpers.multiPoint;
55305   var helpers_16 = helpers.multiPolygon;
55306   var helpers_17 = helpers.geometryCollection;
55307   var helpers_18 = helpers.round;
55308   var helpers_19 = helpers.radiansToLength;
55309   var helpers_20 = helpers.lengthToRadians;
55310   var helpers_21 = helpers.lengthToDegrees;
55311   var helpers_22 = helpers.bearingToAzimuth;
55312   var helpers_23 = helpers.radiansToDegrees;
55313   var helpers_24 = helpers.degreesToRadians;
55314   var helpers_25 = helpers.convertLength;
55315   var helpers_26 = helpers.convertArea;
55316   var helpers_27 = helpers.isNumber;
55317   var helpers_28 = helpers.isObject;
55318   var helpers_29 = helpers.validateBBox;
55319   var helpers_30 = helpers.validateId;
55320   var helpers_31 = helpers.radians2degrees;
55321   var helpers_32 = helpers.degrees2radians;
55322   var helpers_33 = helpers.distanceToDegrees;
55323   var helpers_34 = helpers.distanceToRadians;
55324   var helpers_35 = helpers.radiansToDistance;
55325   var helpers_36 = helpers.bearingToAngle;
55326   var helpers_37 = helpers.convertDistance;
55327
55328   var invariant = createCommonjsModule(function (module, exports) {
55329   Object.defineProperty(exports, "__esModule", { value: true });
55330
55331   /**
55332    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
55333    *
55334    * @name getCoord
55335    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
55336    * @returns {Array<number>} coordinates
55337    * @example
55338    * var pt = turf.point([10, 10]);
55339    *
55340    * var coord = turf.getCoord(pt);
55341    * //= [10, 10]
55342    */
55343   function getCoord(coord) {
55344       if (!coord) {
55345           throw new Error("coord is required");
55346       }
55347       if (!Array.isArray(coord)) {
55348           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
55349               return coord.geometry.coordinates;
55350           }
55351           if (coord.type === "Point") {
55352               return coord.coordinates;
55353           }
55354       }
55355       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
55356           return coord;
55357       }
55358       throw new Error("coord must be GeoJSON Point or an Array of numbers");
55359   }
55360   exports.getCoord = getCoord;
55361   /**
55362    * Unwrap coordinates from a Feature, Geometry Object or an Array
55363    *
55364    * @name getCoords
55365    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
55366    * @returns {Array<any>} coordinates
55367    * @example
55368    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
55369    *
55370    * var coords = turf.getCoords(poly);
55371    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
55372    */
55373   function getCoords(coords) {
55374       if (Array.isArray(coords)) {
55375           return coords;
55376       }
55377       // Feature
55378       if (coords.type === "Feature") {
55379           if (coords.geometry !== null) {
55380               return coords.geometry.coordinates;
55381           }
55382       }
55383       else {
55384           // Geometry
55385           if (coords.coordinates) {
55386               return coords.coordinates;
55387           }
55388       }
55389       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
55390   }
55391   exports.getCoords = getCoords;
55392   /**
55393    * Checks if coordinates contains a number
55394    *
55395    * @name containsNumber
55396    * @param {Array<any>} coordinates GeoJSON Coordinates
55397    * @returns {boolean} true if Array contains a number
55398    */
55399   function containsNumber(coordinates) {
55400       if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
55401           return true;
55402       }
55403       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
55404           return containsNumber(coordinates[0]);
55405       }
55406       throw new Error("coordinates must only contain numbers");
55407   }
55408   exports.containsNumber = containsNumber;
55409   /**
55410    * Enforce expectations about types of GeoJSON objects for Turf.
55411    *
55412    * @name geojsonType
55413    * @param {GeoJSON} value any GeoJSON object
55414    * @param {string} type expected GeoJSON type
55415    * @param {string} name name of calling function
55416    * @throws {Error} if value is not the expected type.
55417    */
55418   function geojsonType(value, type, name) {
55419       if (!type || !name) {
55420           throw new Error("type and name required");
55421       }
55422       if (!value || value.type !== type) {
55423           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
55424       }
55425   }
55426   exports.geojsonType = geojsonType;
55427   /**
55428    * Enforce expectations about types of {@link Feature} inputs for Turf.
55429    * Internally this uses {@link geojsonType} to judge geometry types.
55430    *
55431    * @name featureOf
55432    * @param {Feature} feature a feature with an expected geometry type
55433    * @param {string} type expected GeoJSON type
55434    * @param {string} name name of calling function
55435    * @throws {Error} error if value is not the expected type.
55436    */
55437   function featureOf(feature, type, name) {
55438       if (!feature) {
55439           throw new Error("No feature passed");
55440       }
55441       if (!name) {
55442           throw new Error(".featureOf() requires a name");
55443       }
55444       if (!feature || feature.type !== "Feature" || !feature.geometry) {
55445           throw new Error("Invalid input to " + name + ", Feature with geometry required");
55446       }
55447       if (!feature.geometry || feature.geometry.type !== type) {
55448           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
55449       }
55450   }
55451   exports.featureOf = featureOf;
55452   /**
55453    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
55454    * Internally this uses {@link geojsonType} to judge geometry types.
55455    *
55456    * @name collectionOf
55457    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
55458    * @param {string} type expected GeoJSON type
55459    * @param {string} name name of calling function
55460    * @throws {Error} if value is not the expected type.
55461    */
55462   function collectionOf(featureCollection, type, name) {
55463       if (!featureCollection) {
55464           throw new Error("No featureCollection passed");
55465       }
55466       if (!name) {
55467           throw new Error(".collectionOf() requires a name");
55468       }
55469       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
55470           throw new Error("Invalid input to " + name + ", FeatureCollection required");
55471       }
55472       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
55473           var feature = _a[_i];
55474           if (!feature || feature.type !== "Feature" || !feature.geometry) {
55475               throw new Error("Invalid input to " + name + ", Feature with geometry required");
55476           }
55477           if (!feature.geometry || feature.geometry.type !== type) {
55478               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
55479           }
55480       }
55481   }
55482   exports.collectionOf = collectionOf;
55483   /**
55484    * Get Geometry from Feature or Geometry Object
55485    *
55486    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
55487    * @returns {Geometry|null} GeoJSON Geometry Object
55488    * @throws {Error} if geojson is not a Feature or Geometry Object
55489    * @example
55490    * var point = {
55491    *   "type": "Feature",
55492    *   "properties": {},
55493    *   "geometry": {
55494    *     "type": "Point",
55495    *     "coordinates": [110, 40]
55496    *   }
55497    * }
55498    * var geom = turf.getGeom(point)
55499    * //={"type": "Point", "coordinates": [110, 40]}
55500    */
55501   function getGeom(geojson) {
55502       if (geojson.type === "Feature") {
55503           return geojson.geometry;
55504       }
55505       return geojson;
55506   }
55507   exports.getGeom = getGeom;
55508   /**
55509    * Get GeoJSON object's type, Geometry type is prioritize.
55510    *
55511    * @param {GeoJSON} geojson GeoJSON object
55512    * @param {string} [name="geojson"] name of the variable to display in error message
55513    * @returns {string} GeoJSON type
55514    * @example
55515    * var point = {
55516    *   "type": "Feature",
55517    *   "properties": {},
55518    *   "geometry": {
55519    *     "type": "Point",
55520    *     "coordinates": [110, 40]
55521    *   }
55522    * }
55523    * var geom = turf.getType(point)
55524    * //="Point"
55525    */
55526   function getType(geojson, name) {
55527       if (geojson.type === "FeatureCollection") {
55528           return "FeatureCollection";
55529       }
55530       if (geojson.type === "GeometryCollection") {
55531           return "GeometryCollection";
55532       }
55533       if (geojson.type === "Feature" && geojson.geometry !== null) {
55534           return geojson.geometry.type;
55535       }
55536       return geojson.type;
55537   }
55538   exports.getType = getType;
55539   });
55540
55541   unwrapExports(invariant);
55542   var invariant_1 = invariant.getCoord;
55543   var invariant_2 = invariant.getCoords;
55544   var invariant_3 = invariant.containsNumber;
55545   var invariant_4 = invariant.geojsonType;
55546   var invariant_5 = invariant.featureOf;
55547   var invariant_6 = invariant.collectionOf;
55548   var invariant_7 = invariant.getGeom;
55549   var invariant_8 = invariant.getType;
55550
55551   var lineclip_1$1 = lineclip$1;
55552   var default_1$1 = lineclip$1;
55553
55554   lineclip$1.polyline = lineclip$1;
55555   lineclip$1.polygon = polygonclip$1;
55556
55557
55558   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
55559   // handle polylines rather than just segments
55560
55561   function lineclip$1(points, bbox, result) {
55562
55563       var len = points.length,
55564           codeA = bitCode$1(points[0], bbox),
55565           part = [],
55566           i, a, b, codeB, lastCode;
55567
55568       if (!result) result = [];
55569
55570       for (i = 1; i < len; i++) {
55571           a = points[i - 1];
55572           b = points[i];
55573           codeB = lastCode = bitCode$1(b, bbox);
55574
55575           while (true) {
55576
55577               if (!(codeA | codeB)) { // accept
55578                   part.push(a);
55579
55580                   if (codeB !== lastCode) { // segment went outside
55581                       part.push(b);
55582
55583                       if (i < len - 1) { // start a new line
55584                           result.push(part);
55585                           part = [];
55586                       }
55587                   } else if (i === len - 1) {
55588                       part.push(b);
55589                   }
55590                   break;
55591
55592               } else if (codeA & codeB) { // trivial reject
55593                   break;
55594
55595               } else if (codeA) { // a outside, intersect with clip edge
55596                   a = intersect$2(a, b, codeA, bbox);
55597                   codeA = bitCode$1(a, bbox);
55598
55599               } else { // b outside
55600                   b = intersect$2(a, b, codeB, bbox);
55601                   codeB = bitCode$1(b, bbox);
55602               }
55603           }
55604
55605           codeA = lastCode;
55606       }
55607
55608       if (part.length) result.push(part);
55609
55610       return result;
55611   }
55612
55613   // Sutherland-Hodgeman polygon clipping algorithm
55614
55615   function polygonclip$1(points, bbox) {
55616
55617       var result, edge, prev, prevInside, i, p, inside;
55618
55619       // clip against each side of the clip rectangle
55620       for (edge = 1; edge <= 8; edge *= 2) {
55621           result = [];
55622           prev = points[points.length - 1];
55623           prevInside = !(bitCode$1(prev, bbox) & edge);
55624
55625           for (i = 0; i < points.length; i++) {
55626               p = points[i];
55627               inside = !(bitCode$1(p, bbox) & edge);
55628
55629               // if segment goes through the clip window, add an intersection
55630               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
55631
55632               if (inside) result.push(p); // add a point if it's inside
55633
55634               prev = p;
55635               prevInside = inside;
55636           }
55637
55638           points = result;
55639
55640           if (!points.length) break;
55641       }
55642
55643       return result;
55644   }
55645
55646   // intersect a segment against one of the 4 lines that make up the bbox
55647
55648   function intersect$2(a, b, edge, bbox) {
55649       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
55650              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
55651              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
55652              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
55653              null;
55654   }
55655
55656   // bit code reflects the point position relative to the bbox:
55657
55658   //         left  mid  right
55659   //    top  1001  1000  1010
55660   //    mid  0001  0000  0010
55661   // bottom  0101  0100  0110
55662
55663   function bitCode$1(p, bbox) {
55664       var code = 0;
55665
55666       if (p[0] < bbox[0]) code |= 1; // left
55667       else if (p[0] > bbox[2]) code |= 2; // right
55668
55669       if (p[1] < bbox[1]) code |= 4; // bottom
55670       else if (p[1] > bbox[3]) code |= 8; // top
55671
55672       return code;
55673   }
55674   lineclip_1$1.default = default_1$1;
55675
55676   var bboxClip_1 = createCommonjsModule(function (module, exports) {
55677   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
55678       if (mod && mod.__esModule) return mod;
55679       var result = {};
55680       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
55681       result["default"] = mod;
55682       return result;
55683   };
55684   Object.defineProperty(exports, "__esModule", { value: true });
55685
55686
55687   var lineclip = __importStar(lineclip_1$1);
55688   /**
55689    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
55690    * [lineclip](https://github.com/mapbox/lineclip).
55691    * May result in degenerate edges when clipping Polygons.
55692    *
55693    * @name bboxClip
55694    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
55695    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
55696    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
55697    * @example
55698    * var bbox = [0, 0, 10, 10];
55699    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
55700    *
55701    * var clipped = turf.bboxClip(poly, bbox);
55702    *
55703    * //addToMap
55704    * var addToMap = [bbox, poly, clipped]
55705    */
55706   function bboxClip(feature, bbox) {
55707       var geom = invariant.getGeom(feature);
55708       var type = geom.type;
55709       var properties = feature.type === "Feature" ? feature.properties : {};
55710       var coords = geom.coordinates;
55711       switch (type) {
55712           case "LineString":
55713           case "MultiLineString":
55714               var lines_1 = [];
55715               if (type === "LineString") {
55716                   coords = [coords];
55717               }
55718               coords.forEach(function (line) {
55719                   lineclip.polyline(line, bbox, lines_1);
55720               });
55721               if (lines_1.length === 1) {
55722                   return helpers.lineString(lines_1[0], properties);
55723               }
55724               return helpers.multiLineString(lines_1, properties);
55725           case "Polygon":
55726               return helpers.polygon(clipPolygon(coords, bbox), properties);
55727           case "MultiPolygon":
55728               return helpers.multiPolygon(coords.map(function (poly) {
55729                   return clipPolygon(poly, bbox);
55730               }), properties);
55731           default:
55732               throw new Error("geometry " + type + " not supported");
55733       }
55734   }
55735   exports.default = bboxClip;
55736   function clipPolygon(rings, bbox) {
55737       var outRings = [];
55738       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
55739           var ring = rings_1[_i];
55740           var clipped = lineclip.polygon(ring, bbox);
55741           if (clipped.length > 0) {
55742               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
55743                   clipped.push(clipped[0]);
55744               }
55745               if (clipped.length >= 4) {
55746                   outRings.push(clipped);
55747               }
55748           }
55749       }
55750       return outRings;
55751   }
55752   });
55753
55754   var turf_bboxClip = unwrapExports(bboxClip_1);
55755
55756   var martinez_umd = createCommonjsModule(function (module, exports) {
55757   /**
55758    * martinez v0.5.0
55759    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
55760    *
55761    * @author Alex Milevski <info@w8r.name>
55762    * @license MIT
55763    * @preserve
55764    */
55765
55766   (function (global, factory) {
55767     factory(exports);
55768   }(commonjsGlobal, (function (exports) {
55769     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
55770
55771     var SplayTree = function SplayTree(compare, noDuplicates) {
55772       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
55773       if ( noDuplicates === void 0 ) noDuplicates = false;
55774
55775       this._compare = compare;
55776       this._root = null;
55777       this._size = 0;
55778       this._noDuplicates = !!noDuplicates;
55779     };
55780
55781     var prototypeAccessors = { size: { configurable: true } };
55782
55783
55784     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
55785       var y = x.right;
55786       if (y) {
55787         x.right = y.left;
55788         if (y.left) { y.left.parent = x; }
55789         y.parent = x.parent;
55790       }
55791
55792       if (!x.parent)              { this._root = y; }
55793       else if (x === x.parent.left) { x.parent.left = y; }
55794       else                        { x.parent.right = y; }
55795       if (y) { y.left = x; }
55796       x.parent = y;
55797     };
55798
55799
55800     SplayTree.prototype.rotateRight = function rotateRight (x) {
55801       var y = x.left;
55802       if (y) {
55803         x.left = y.right;
55804         if (y.right) { y.right.parent = x; }
55805         y.parent = x.parent;
55806       }
55807
55808       if (!x.parent)             { this._root = y; }
55809       else if(x === x.parent.left) { x.parent.left = y; }
55810       else                       { x.parent.right = y; }
55811       if (y) { y.right = x; }
55812       x.parent = y;
55813     };
55814
55815
55816     SplayTree.prototype._splay = function _splay (x) {
55817         var this$1 = this;
55818
55819       while (x.parent) {
55820         var p = x.parent;
55821         if (!p.parent) {
55822           if (p.left === x) { this$1.rotateRight(p); }
55823           else            { this$1.rotateLeft(p); }
55824         } else if (p.left === x && p.parent.left === p) {
55825           this$1.rotateRight(p.parent);
55826           this$1.rotateRight(p);
55827         } else if (p.right === x && p.parent.right === p) {
55828           this$1.rotateLeft(p.parent);
55829           this$1.rotateLeft(p);
55830         } else if (p.left === x && p.parent.right === p) {
55831           this$1.rotateRight(p);
55832           this$1.rotateLeft(p);
55833         } else {
55834           this$1.rotateLeft(p);
55835           this$1.rotateRight(p);
55836         }
55837       }
55838     };
55839
55840
55841     SplayTree.prototype.splay = function splay (x) {
55842         var this$1 = this;
55843
55844       var p, gp, ggp, l, r;
55845
55846       while (x.parent) {
55847         p = x.parent;
55848         gp = p.parent;
55849
55850         if (gp && gp.parent) {
55851           ggp = gp.parent;
55852           if (ggp.left === gp) { ggp.left= x; }
55853           else               { ggp.right = x; }
55854           x.parent = ggp;
55855         } else {
55856           x.parent = null;
55857           this$1._root = x;
55858         }
55859
55860         l = x.left; r = x.right;
55861
55862         if (x === p.left) { // left
55863           if (gp) {
55864             if (gp.left === p) {
55865               /* zig-zig */
55866               if (p.right) {
55867                 gp.left = p.right;
55868                 gp.left.parent = gp;
55869               } else { gp.left = null; }
55870
55871               p.right = gp;
55872               gp.parent = p;
55873             } else {
55874               /* zig-zag */
55875               if (l) {
55876                 gp.right = l;
55877                 l.parent = gp;
55878               } else { gp.right = null; }
55879
55880               x.left  = gp;
55881               gp.parent = x;
55882             }
55883           }
55884           if (r) {
55885             p.left = r;
55886             r.parent = p;
55887           } else { p.left = null; }
55888
55889           x.right= p;
55890           p.parent = x;
55891         } else { // right
55892           if (gp) {
55893             if (gp.right === p) {
55894               /* zig-zig */
55895               if (p.left) {
55896                 gp.right = p.left;
55897                 gp.right.parent = gp;
55898               } else { gp.right = null; }
55899
55900               p.left = gp;
55901               gp.parent = p;
55902             } else {
55903               /* zig-zag */
55904               if (r) {
55905                 gp.left = r;
55906                 r.parent = gp;
55907               } else { gp.left = null; }
55908
55909               x.right = gp;
55910               gp.parent = x;
55911             }
55912           }
55913           if (l) {
55914             p.right = l;
55915             l.parent = p;
55916           } else { p.right = null; }
55917
55918           x.left = p;
55919           p.parent = x;
55920         }
55921       }
55922     };
55923
55924
55925     SplayTree.prototype.replace = function replace (u, v) {
55926       if (!u.parent) { this._root = v; }
55927       else if (u === u.parent.left) { u.parent.left = v; }
55928       else { u.parent.right = v; }
55929       if (v) { v.parent = u.parent; }
55930     };
55931
55932
55933     SplayTree.prototype.minNode = function minNode (u) {
55934         if ( u === void 0 ) u = this._root;
55935
55936       if (u) { while (u.left) { u = u.left; } }
55937       return u;
55938     };
55939
55940
55941     SplayTree.prototype.maxNode = function maxNode (u) {
55942         if ( u === void 0 ) u = this._root;
55943
55944       if (u) { while (u.right) { u = u.right; } }
55945       return u;
55946     };
55947
55948
55949     SplayTree.prototype.insert = function insert (key, data) {
55950       var z = this._root;
55951       var p = null;
55952       var comp = this._compare;
55953       var cmp;
55954
55955       if (this._noDuplicates) {
55956         while (z) {
55957           p = z;
55958           cmp = comp(z.key, key);
55959           if (cmp === 0) { return; }
55960           else if (comp(z.key, key) < 0) { z = z.right; }
55961           else { z = z.left; }
55962         }
55963       } else {
55964         while (z) {
55965           p = z;
55966           if (comp(z.key, key) < 0) { z = z.right; }
55967           else { z = z.left; }
55968         }
55969       }
55970
55971       z = { key: key, data: data, left: null, right: null, parent: p };
55972
55973       if (!p)                        { this._root = z; }
55974       else if (comp(p.key, z.key) < 0) { p.right = z; }
55975       else                           { p.left= z; }
55976
55977       this.splay(z);
55978       this._size++;
55979       return z;
55980     };
55981
55982
55983     SplayTree.prototype.find = function find (key) {
55984       var z  = this._root;
55985       var comp = this._compare;
55986       while (z) {
55987         var cmp = comp(z.key, key);
55988         if    (cmp < 0) { z = z.right; }
55989         else if (cmp > 0) { z = z.left; }
55990         else            { return z; }
55991       }
55992       return null;
55993     };
55994
55995     /**
55996      * Whether the tree contains a node with the given key
55997      * @param{Key} key
55998      * @return {boolean} true/false
55999      */
56000     SplayTree.prototype.contains = function contains (key) {
56001       var node     = this._root;
56002       var comparator = this._compare;
56003       while (node){
56004         var cmp = comparator(key, node.key);
56005         if    (cmp === 0) { return true; }
56006         else if (cmp < 0) { node = node.left; }
56007         else              { node = node.right; }
56008       }
56009
56010       return false;
56011     };
56012
56013
56014     SplayTree.prototype.remove = function remove (key) {
56015       var z = this.find(key);
56016
56017       if (!z) { return false; }
56018
56019       this.splay(z);
56020
56021       if (!z.left) { this.replace(z, z.right); }
56022       else if (!z.right) { this.replace(z, z.left); }
56023       else {
56024         var y = this.minNode(z.right);
56025         if (y.parent !== z) {
56026           this.replace(y, y.right);
56027           y.right = z.right;
56028           y.right.parent = y;
56029         }
56030         this.replace(z, y);
56031         y.left = z.left;
56032         y.left.parent = y;
56033       }
56034
56035       this._size--;
56036       return true;
56037     };
56038
56039
56040     SplayTree.prototype.removeNode = function removeNode (z) {
56041       if (!z) { return false; }
56042
56043       this.splay(z);
56044
56045       if (!z.left) { this.replace(z, z.right); }
56046       else if (!z.right) { this.replace(z, z.left); }
56047       else {
56048         var y = this.minNode(z.right);
56049         if (y.parent !== z) {
56050           this.replace(y, y.right);
56051           y.right = z.right;
56052           y.right.parent = y;
56053         }
56054         this.replace(z, y);
56055         y.left = z.left;
56056         y.left.parent = y;
56057       }
56058
56059       this._size--;
56060       return true;
56061     };
56062
56063
56064     SplayTree.prototype.erase = function erase (key) {
56065       var z = this.find(key);
56066       if (!z) { return; }
56067
56068       this.splay(z);
56069
56070       var s = z.left;
56071       var t = z.right;
56072
56073       var sMax = null;
56074       if (s) {
56075         s.parent = null;
56076         sMax = this.maxNode(s);
56077         this.splay(sMax);
56078         this._root = sMax;
56079       }
56080       if (t) {
56081         if (s) { sMax.right = t; }
56082         else { this._root = t; }
56083         t.parent = sMax;
56084       }
56085
56086       this._size--;
56087     };
56088
56089     /**
56090      * Removes and returns the node with smallest key
56091      * @return {?Node}
56092      */
56093     SplayTree.prototype.pop = function pop () {
56094       var node = this._root, returnValue = null;
56095       if (node) {
56096         while (node.left) { node = node.left; }
56097         returnValue = { key: node.key, data: node.data };
56098         this.remove(node.key);
56099       }
56100       return returnValue;
56101     };
56102
56103
56104     /* eslint-disable class-methods-use-this */
56105
56106     /**
56107      * Successor node
56108      * @param{Node} node
56109      * @return {?Node}
56110      */
56111     SplayTree.prototype.next = function next (node) {
56112       var successor = node;
56113       if (successor) {
56114         if (successor.right) {
56115           successor = successor.right;
56116           while (successor && successor.left) { successor = successor.left; }
56117         } else {
56118           successor = node.parent;
56119           while (successor && successor.right === node) {
56120             node = successor; successor = successor.parent;
56121           }
56122         }
56123       }
56124       return successor;
56125     };
56126
56127
56128     /**
56129      * Predecessor node
56130      * @param{Node} node
56131      * @return {?Node}
56132      */
56133     SplayTree.prototype.prev = function prev (node) {
56134       var predecessor = node;
56135       if (predecessor) {
56136         if (predecessor.left) {
56137           predecessor = predecessor.left;
56138           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
56139         } else {
56140           predecessor = node.parent;
56141           while (predecessor && predecessor.left === node) {
56142             node = predecessor;
56143             predecessor = predecessor.parent;
56144           }
56145         }
56146       }
56147       return predecessor;
56148     };
56149     /* eslint-enable class-methods-use-this */
56150
56151
56152     /**
56153      * @param{forEachCallback} callback
56154      * @return {SplayTree}
56155      */
56156     SplayTree.prototype.forEach = function forEach (callback) {
56157       var current = this._root;
56158       var s = [], done = false, i = 0;
56159
56160       while (!done) {
56161         // Reach the left most Node of the current Node
56162         if (current) {
56163           // Place pointer to a tree node on the stack
56164           // before traversing the node's left subtree
56165           s.push(current);
56166           current = current.left;
56167         } else {
56168           // BackTrack from the empty subtree and visit the Node
56169           // at the top of the stack; however, if the stack is
56170           // empty you are done
56171           if (s.length > 0) {
56172             current = s.pop();
56173             callback(current, i++);
56174
56175             // We have visited the node and its left
56176             // subtree. Now, it's right subtree's turn
56177             current = current.right;
56178           } else { done = true; }
56179         }
56180       }
56181       return this;
56182     };
56183
56184
56185     /**
56186      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
56187      * @param{Key}    low
56188      * @param{Key}    high
56189      * @param{Function} fn
56190      * @param{*?}     ctx
56191      * @return {SplayTree}
56192      */
56193     SplayTree.prototype.range = function range (low, high, fn, ctx) {
56194         var this$1 = this;
56195
56196       var Q = [];
56197       var compare = this._compare;
56198       var node = this._root, cmp;
56199
56200       while (Q.length !== 0 || node) {
56201         if (node) {
56202           Q.push(node);
56203           node = node.left;
56204         } else {
56205           node = Q.pop();
56206           cmp = compare(node.key, high);
56207           if (cmp > 0) {
56208             break;
56209           } else if (compare(node.key, low) >= 0) {
56210             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
56211           }
56212           node = node.right;
56213         }
56214       }
56215       return this;
56216     };
56217
56218     /**
56219      * Returns all keys in order
56220      * @return {Array<Key>}
56221      */
56222     SplayTree.prototype.keys = function keys () {
56223       var current = this._root;
56224       var s = [], r = [], done = false;
56225
56226       while (!done) {
56227         if (current) {
56228           s.push(current);
56229           current = current.left;
56230         } else {
56231           if (s.length > 0) {
56232             current = s.pop();
56233             r.push(current.key);
56234             current = current.right;
56235           } else { done = true; }
56236         }
56237       }
56238       return r;
56239     };
56240
56241
56242     /**
56243      * Returns `data` fields of all nodes in order.
56244      * @return {Array<Value>}
56245      */
56246     SplayTree.prototype.values = function values () {
56247       var current = this._root;
56248       var s = [], r = [], done = false;
56249
56250       while (!done) {
56251         if (current) {
56252           s.push(current);
56253           current = current.left;
56254         } else {
56255           if (s.length > 0) {
56256             current = s.pop();
56257             r.push(current.data);
56258             current = current.right;
56259           } else { done = true; }
56260         }
56261       }
56262       return r;
56263     };
56264
56265
56266     /**
56267      * Returns node at given index
56268      * @param{number} index
56269      * @return {?Node}
56270      */
56271     SplayTree.prototype.at = function at (index) {
56272       // removed after a consideration, more misleading than useful
56273       // index = index % this.size;
56274       // if (index < 0) index = this.size - index;
56275
56276       var current = this._root;
56277       var s = [], done = false, i = 0;
56278
56279       while (!done) {
56280         if (current) {
56281           s.push(current);
56282           current = current.left;
56283         } else {
56284           if (s.length > 0) {
56285             current = s.pop();
56286             if (i === index) { return current; }
56287             i++;
56288             current = current.right;
56289           } else { done = true; }
56290         }
56291       }
56292       return null;
56293     };
56294
56295     /**
56296      * Bulk-load items. Both array have to be same size
56297      * @param{Array<Key>}  keys
56298      * @param{Array<Value>}[values]
56299      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
56300      *                                       tree's comparator. Sorting is done
56301      *                                       in-place
56302      * @return {AVLTree}
56303      */
56304     SplayTree.prototype.load = function load (keys, values, presort) {
56305         if ( keys === void 0 ) keys = [];
56306         if ( values === void 0 ) values = [];
56307         if ( presort === void 0 ) presort = false;
56308
56309       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
56310       var size = keys.length;
56311       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
56312       this._root = loadRecursive(null, keys, values, 0, size);
56313       this._size = size;
56314       return this;
56315     };
56316
56317
56318     SplayTree.prototype.min = function min () {
56319       var node = this.minNode(this._root);
56320       if (node) { return node.key; }
56321       else    { return null; }
56322     };
56323
56324
56325     SplayTree.prototype.max = function max () {
56326       var node = this.maxNode(this._root);
56327       if (node) { return node.key; }
56328       else    { return null; }
56329     };
56330
56331     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
56332     prototypeAccessors.size.get = function () { return this._size; };
56333
56334
56335     /**
56336      * Create a tree and load it with items
56337      * @param{Array<Key>}        keys
56338      * @param{Array<Value>?}      [values]
56339
56340      * @param{Function?}          [comparator]
56341      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
56342      *                                             tree's comparator. Sorting is done
56343      *                                             in-place
56344      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
56345      * @return {SplayTree}
56346      */
56347     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
56348       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
56349     };
56350
56351     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
56352
56353
56354     function loadRecursive (parent, keys, values, start, end) {
56355       var size = end - start;
56356       if (size > 0) {
56357         var middle = start + Math.floor(size / 2);
56358         var key    = keys[middle];
56359         var data   = values[middle];
56360         var node   = { key: key, data: data, parent: parent };
56361         node.left    = loadRecursive(node, keys, values, start, middle);
56362         node.right   = loadRecursive(node, keys, values, middle + 1, end);
56363         return node;
56364       }
56365       return null;
56366     }
56367
56368
56369     function sort(keys, values, left, right, compare) {
56370       if (left >= right) { return; }
56371
56372       var pivot = keys[(left + right) >> 1];
56373       var i = left - 1;
56374       var j = right + 1;
56375
56376       while (true) {
56377         do { i++; } while (compare(keys[i], pivot) < 0);
56378         do { j--; } while (compare(keys[j], pivot) > 0);
56379         if (i >= j) { break; }
56380
56381         var tmp = keys[i];
56382         keys[i] = keys[j];
56383         keys[j] = tmp;
56384
56385         tmp = values[i];
56386         values[i] = values[j];
56387         values[j] = tmp;
56388       }
56389
56390       sort(keys, values,  left,     j, compare);
56391       sort(keys, values, j + 1, right, compare);
56392     }
56393
56394     var NORMAL               = 0;
56395     var NON_CONTRIBUTING     = 1;
56396     var SAME_TRANSITION      = 2;
56397     var DIFFERENT_TRANSITION = 3;
56398
56399     var INTERSECTION = 0;
56400     var UNION        = 1;
56401     var DIFFERENCE   = 2;
56402     var XOR          = 3;
56403
56404     /**
56405      * @param  {SweepEvent} event
56406      * @param  {SweepEvent} prev
56407      * @param  {Operation} operation
56408      */
56409     function computeFields (event, prev, operation) {
56410       // compute inOut and otherInOut fields
56411       if (prev === null) {
56412         event.inOut      = false;
56413         event.otherInOut = true;
56414
56415       // previous line segment in sweepline belongs to the same polygon
56416       } else {
56417         if (event.isSubject === prev.isSubject) {
56418           event.inOut      = !prev.inOut;
56419           event.otherInOut = prev.otherInOut;
56420
56421         // previous line segment in sweepline belongs to the clipping polygon
56422         } else {
56423           event.inOut      = !prev.otherInOut;
56424           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
56425         }
56426
56427         // compute prevInResult field
56428         if (prev) {
56429           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
56430             ? prev.prevInResult : prev;
56431         }
56432       }
56433
56434       // check if the line segment belongs to the Boolean operation
56435       event.inResult = inResult(event, operation);
56436     }
56437
56438
56439     /* eslint-disable indent */
56440     function inResult(event, operation) {
56441       switch (event.type) {
56442         case NORMAL:
56443           switch (operation) {
56444             case INTERSECTION:
56445               return !event.otherInOut;
56446             case UNION:
56447               return event.otherInOut;
56448             case DIFFERENCE:
56449               // return (event.isSubject && !event.otherInOut) ||
56450               //         (!event.isSubject && event.otherInOut);
56451               return (event.isSubject && event.otherInOut) ||
56452                       (!event.isSubject && !event.otherInOut);
56453             case XOR:
56454               return true;
56455           }
56456           break;
56457         case SAME_TRANSITION:
56458           return operation === INTERSECTION || operation === UNION;
56459         case DIFFERENT_TRANSITION:
56460           return operation === DIFFERENCE;
56461         case NON_CONTRIBUTING:
56462           return false;
56463       }
56464       return false;
56465     }
56466     /* eslint-enable indent */
56467
56468     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
56469
56470       /**
56471        * Is left endpoint?
56472        * @type {Boolean}
56473        */
56474       this.left = left;
56475
56476       /**
56477        * @type {Array.<Number>}
56478        */
56479       this.point = point;
56480
56481       /**
56482        * Other edge reference
56483        * @type {SweepEvent}
56484        */
56485       this.otherEvent = otherEvent;
56486
56487       /**
56488        * Belongs to source or clipping polygon
56489        * @type {Boolean}
56490        */
56491       this.isSubject = isSubject;
56492
56493       /**
56494        * Edge contribution type
56495        * @type {Number}
56496        */
56497       this.type = edgeType || NORMAL;
56498
56499
56500       /**
56501        * In-out transition for the sweepline crossing polygon
56502        * @type {Boolean}
56503        */
56504       this.inOut = false;
56505
56506
56507       /**
56508        * @type {Boolean}
56509        */
56510       this.otherInOut = false;
56511
56512       /**
56513        * Previous event in result?
56514        * @type {SweepEvent}
56515        */
56516       this.prevInResult = null;
56517
56518       /**
56519        * Does event belong to result?
56520        * @type {Boolean}
56521        */
56522       this.inResult = false;
56523
56524
56525       // connection step
56526
56527       /**
56528        * @type {Boolean}
56529        */
56530       this.resultInOut = false;
56531
56532       this.isExteriorRing = true;
56533     };
56534
56535
56536     /**
56537      * @param{Array.<Number>}p
56538      * @return {Boolean}
56539      */
56540     SweepEvent.prototype.isBelow = function isBelow (p) {
56541       var p0 = this.point, p1 = this.otherEvent.point;
56542       return this.left
56543         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
56544         // signedArea(this.point, this.otherEvent.point, p) > 0 :
56545         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
56546         //signedArea(this.otherEvent.point, this.point, p) > 0;
56547     };
56548
56549
56550     /**
56551      * @param{Array.<Number>}p
56552      * @return {Boolean}
56553      */
56554     SweepEvent.prototype.isAbove = function isAbove (p) {
56555       return !this.isBelow(p);
56556     };
56557
56558
56559     /**
56560      * @return {Boolean}
56561      */
56562     SweepEvent.prototype.isVertical = function isVertical () {
56563       return this.point[0] === this.otherEvent.point[0];
56564     };
56565
56566
56567     SweepEvent.prototype.clone = function clone () {
56568       var copy = new SweepEvent(
56569         this.point, this.left, this.otherEvent, this.isSubject, this.type);
56570
56571       copy.inResult     = this.inResult;
56572       copy.prevInResult = this.prevInResult;
56573       copy.isExteriorRing = this.isExteriorRing;
56574       copy.inOut        = this.inOut;
56575       copy.otherInOut   = this.otherInOut;
56576
56577       return copy;
56578     };
56579
56580     function equals(p1, p2) {
56581       if (p1[0] === p2[0]) {
56582         if (p1[1] === p2[1]) {
56583           return true;
56584         } else {
56585           return false;
56586         }
56587       }
56588       return false;
56589     }
56590
56591     // const EPSILON = 1e-9;
56592     // const abs = Math.abs;
56593     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
56594     // Precision problem.
56595     //
56596     // module.exports = function equals(p1, p2) {
56597     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
56598     // };
56599
56600     /**
56601      * Signed area of the triangle (p0, p1, p2)
56602      * @param  {Array.<Number>} p0
56603      * @param  {Array.<Number>} p1
56604      * @param  {Array.<Number>} p2
56605      * @return {Number}
56606      */
56607     function signedArea(p0, p1, p2) {
56608       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
56609     }
56610
56611     /**
56612      * @param  {SweepEvent} e1
56613      * @param  {SweepEvent} e2
56614      * @return {Number}
56615      */
56616     function compareEvents(e1, e2) {
56617       var p1 = e1.point;
56618       var p2 = e2.point;
56619
56620       // Different x-coordinate
56621       if (p1[0] > p2[0]) { return 1; }
56622       if (p1[0] < p2[0]) { return -1; }
56623
56624       // Different points, but same x-coordinate
56625       // Event with lower y-coordinate is processed first
56626       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
56627
56628       return specialCases(e1, e2, p1, p2);
56629     }
56630
56631
56632     /* eslint-disable no-unused-vars */
56633     function specialCases(e1, e2, p1, p2) {
56634       // Same coordinates, but one is a left endpoint and the other is
56635       // a right endpoint. The right endpoint is processed first
56636       if (e1.left !== e2.left)
56637         { return e1.left ? 1 : -1; }
56638
56639       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
56640       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
56641       // Same coordinates, both events
56642       // are left endpoints or right endpoints.
56643       // not collinear
56644       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
56645         // the event associate to the bottom segment is processed first
56646         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
56647       }
56648
56649       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
56650     }
56651     /* eslint-enable no-unused-vars */
56652
56653     /**
56654      * @param  {SweepEvent} se
56655      * @param  {Array.<Number>} p
56656      * @param  {Queue} queue
56657      * @return {Queue}
56658      */
56659     function divideSegment(se, p, queue)  {
56660       var r = new SweepEvent(p, false, se,            se.isSubject);
56661       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
56662
56663       /* eslint-disable no-console */
56664       if (equals(se.point, se.otherEvent.point)) {
56665
56666         console.warn('what is that, a collapsed segment?', se);
56667       }
56668       /* eslint-enable no-console */
56669
56670       r.contourId = l.contourId = se.contourId;
56671
56672       // avoid a rounding error. The left event would be processed after the right event
56673       if (compareEvents(l, se.otherEvent) > 0) {
56674         se.otherEvent.left = true;
56675         l.left = false;
56676       }
56677
56678       // avoid a rounding error. The left event would be processed after the right event
56679       // if (compareEvents(se, r) > 0) {}
56680
56681       se.otherEvent.otherEvent = l;
56682       se.otherEvent = r;
56683
56684       queue.push(l);
56685       queue.push(r);
56686
56687       return queue;
56688     }
56689
56690     //const EPS = 1e-9;
56691
56692     /**
56693      * Finds the magnitude of the cross product of two vectors (if we pretend
56694      * they're in three dimensions)
56695      *
56696      * @param {Object} a First vector
56697      * @param {Object} b Second vector
56698      * @private
56699      * @returns {Number} The magnitude of the cross product
56700      */
56701     function crossProduct(a, b) {
56702       return (a[0] * b[1]) - (a[1] * b[0]);
56703     }
56704
56705     /**
56706      * Finds the dot product of two vectors.
56707      *
56708      * @param {Object} a First vector
56709      * @param {Object} b Second vector
56710      * @private
56711      * @returns {Number} The dot product
56712      */
56713     function dotProduct(a, b) {
56714       return (a[0] * b[0]) + (a[1] * b[1]);
56715     }
56716
56717     /**
56718      * Finds the intersection (if any) between two line segments a and b, given the
56719      * line segments' end points a1, a2 and b1, b2.
56720      *
56721      * This algorithm is based on Schneider and Eberly.
56722      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
56723      * Page 244.
56724      *
56725      * @param {Array.<Number>} a1 point of first line
56726      * @param {Array.<Number>} a2 point of first line
56727      * @param {Array.<Number>} b1 point of second line
56728      * @param {Array.<Number>} b2 point of second line
56729      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
56730      *                                         (meaning connected segments) as
56731      *                                         intersections
56732      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
56733      * intersection. If they overlap, the two end points of the overlapping segment.
56734      * Otherwise, null.
56735      */
56736     function intersection (a1, a2, b1, b2, noEndpointTouch) {
56737       // The algorithm expects our lines in the form P + sd, where P is a point,
56738       // s is on the interval [0, 1], and d is a vector.
56739       // We are passed two points. P can be the first point of each pair. The
56740       // vector, then, could be thought of as the distance (in x and y components)
56741       // from the first point to the second point.
56742       // So first, let's make our vectors:
56743       var va = [a2[0] - a1[0], a2[1] - a1[1]];
56744       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
56745       // We also define a function to convert back to regular point form:
56746
56747       /* eslint-disable arrow-body-style */
56748
56749       function toPoint(p, s, d) {
56750         return [
56751           p[0] + s * d[0],
56752           p[1] + s * d[1]
56753         ];
56754       }
56755
56756       /* eslint-enable arrow-body-style */
56757
56758       // The rest is pretty much a straight port of the algorithm.
56759       var e = [b1[0] - a1[0], b1[1] - a1[1]];
56760       var kross    = crossProduct(va, vb);
56761       var sqrKross = kross * kross;
56762       var sqrLenA  = dotProduct(va, va);
56763       //const sqrLenB  = dotProduct(vb, vb);
56764
56765       // Check for line intersection. This works because of the properties of the
56766       // cross product -- specifically, two vectors are parallel if and only if the
56767       // cross product is the 0 vector. The full calculation involves relative error
56768       // to account for possible very small line segments. See Schneider & Eberly
56769       // for details.
56770       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
56771         // If they're not parallel, then (because these are line segments) they
56772         // still might not actually intersect. This code checks that the
56773         // intersection point of the lines is actually on both line segments.
56774         var s = crossProduct(e, vb) / kross;
56775         if (s < 0 || s > 1) {
56776           // not on line segment a
56777           return null;
56778         }
56779         var t = crossProduct(e, va) / kross;
56780         if (t < 0 || t > 1) {
56781           // not on line segment b
56782           return null;
56783         }
56784         if (s === 0 || s === 1) {
56785           // on an endpoint of line segment a
56786           return noEndpointTouch ? null : [toPoint(a1, s, va)];
56787         }
56788         if (t === 0 || t === 1) {
56789           // on an endpoint of line segment b
56790           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
56791         }
56792         return [toPoint(a1, s, va)];
56793       }
56794
56795       // If we've reached this point, then the lines are either parallel or the
56796       // same, but the segments could overlap partially or fully, or not at all.
56797       // So we need to find the overlap, if any. To do that, we can use e, which is
56798       // the (vector) difference between the two initial points. If this is parallel
56799       // with the line itself, then the two lines are the same line, and there will
56800       // be overlap.
56801       //const sqrLenE = dotProduct(e, e);
56802       kross = crossProduct(e, va);
56803       sqrKross = kross * kross;
56804
56805       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
56806       // Lines are just parallel, not the same. No overlap.
56807         return null;
56808       }
56809
56810       var sa = dotProduct(va, e) / sqrLenA;
56811       var sb = sa + dotProduct(va, vb) / sqrLenA;
56812       var smin = Math.min(sa, sb);
56813       var smax = Math.max(sa, sb);
56814
56815       // this is, essentially, the FindIntersection acting on floats from
56816       // Schneider & Eberly, just inlined into this function.
56817       if (smin <= 1 && smax >= 0) {
56818
56819         // overlap on an end point
56820         if (smin === 1) {
56821           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
56822         }
56823
56824         if (smax === 0) {
56825           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
56826         }
56827
56828         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
56829
56830         // There's overlap on a segment -- two points of intersection. Return both.
56831         return [
56832           toPoint(a1, smin > 0 ? smin : 0, va),
56833           toPoint(a1, smax < 1 ? smax : 1, va)
56834         ];
56835       }
56836
56837       return null;
56838     }
56839
56840     /**
56841      * @param  {SweepEvent} se1
56842      * @param  {SweepEvent} se2
56843      * @param  {Queue}      queue
56844      * @return {Number}
56845      */
56846     function possibleIntersection (se1, se2, queue) {
56847       // that disallows self-intersecting polygons,
56848       // did cost us half a day, so I'll leave it
56849       // out of respect
56850       // if (se1.isSubject === se2.isSubject) return;
56851       var inter = intersection(
56852         se1.point, se1.otherEvent.point,
56853         se2.point, se2.otherEvent.point
56854       );
56855
56856       var nintersections = inter ? inter.length : 0;
56857       if (nintersections === 0) { return 0; } // no intersection
56858
56859       // the line segments intersect at an endpoint of both line segments
56860       if ((nintersections === 1) &&
56861           (equals(se1.point, se2.point) ||
56862            equals(se1.otherEvent.point, se2.otherEvent.point))) {
56863         return 0;
56864       }
56865
56866       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
56867         // if(se1.contourId === se2.contourId){
56868         // console.warn('Edges of the same polygon overlap',
56869         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
56870         // }
56871         //throw new Error('Edges of the same polygon overlap');
56872         return 0;
56873       }
56874
56875       // The line segments associated to se1 and se2 intersect
56876       if (nintersections === 1) {
56877
56878         // if the intersection point is not an endpoint of se1
56879         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
56880           divideSegment(se1, inter[0], queue);
56881         }
56882
56883         // if the intersection point is not an endpoint of se2
56884         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
56885           divideSegment(se2, inter[0], queue);
56886         }
56887         return 1;
56888       }
56889
56890       // The line segments associated to se1 and se2 overlap
56891       var events        = [];
56892       var leftCoincide  = false;
56893       var rightCoincide = false;
56894
56895       if (equals(se1.point, se2.point)) {
56896         leftCoincide = true; // linked
56897       } else if (compareEvents(se1, se2) === 1) {
56898         events.push(se2, se1);
56899       } else {
56900         events.push(se1, se2);
56901       }
56902
56903       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
56904         rightCoincide = true;
56905       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
56906         events.push(se2.otherEvent, se1.otherEvent);
56907       } else {
56908         events.push(se1.otherEvent, se2.otherEvent);
56909       }
56910
56911       if ((leftCoincide && rightCoincide) || leftCoincide) {
56912         // both line segments are equal or share the left endpoint
56913         se2.type = NON_CONTRIBUTING;
56914         se1.type = (se2.inOut === se1.inOut)
56915           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
56916
56917         if (leftCoincide && !rightCoincide) {
56918           // honestly no idea, but changing events selection from [2, 1]
56919           // to [0, 1] fixes the overlapping self-intersecting polygons issue
56920           divideSegment(events[1].otherEvent, events[0].point, queue);
56921         }
56922         return 2;
56923       }
56924
56925       // the line segments share the right endpoint
56926       if (rightCoincide) {
56927         divideSegment(events[0], events[1].point, queue);
56928         return 3;
56929       }
56930
56931       // no line segment includes totally the other one
56932       if (events[0] !== events[3].otherEvent) {
56933         divideSegment(events[0], events[1].point, queue);
56934         divideSegment(events[1], events[2].point, queue);
56935         return 3;
56936       }
56937
56938       // one line segment includes the other one
56939       divideSegment(events[0], events[1].point, queue);
56940       divideSegment(events[3].otherEvent, events[2].point, queue);
56941
56942       return 3;
56943     }
56944
56945     /**
56946      * @param  {SweepEvent} le1
56947      * @param  {SweepEvent} le2
56948      * @return {Number}
56949      */
56950     function compareSegments(le1, le2) {
56951       if (le1 === le2) { return 0; }
56952
56953       // Segments are not collinear
56954       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
56955         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
56956
56957         // If they share their left endpoint use the right endpoint to sort
56958         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
56959
56960         // Different left endpoint: use the left endpoint to sort
56961         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
56962
56963         // has the line segment associated to e1 been inserted
56964         // into S after the line segment associated to e2 ?
56965         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
56966
56967         // The line segment associated to e2 has been inserted
56968         // into S after the line segment associated to e1
56969         return le1.isBelow(le2.point) ? -1 : 1;
56970       }
56971
56972       if (le1.isSubject === le2.isSubject) { // same polygon
56973         var p1 = le1.point, p2 = le2.point;
56974         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
56975           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
56976           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
56977           else { return le1.contourId > le2.contourId ? 1 : -1; }
56978         }
56979       } else { // Segments are collinear, but belong to separate polygons
56980         return le1.isSubject ? -1 : 1;
56981       }
56982
56983       return compareEvents(le1, le2) === 1 ? 1 : -1;
56984     }
56985
56986     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
56987       var sweepLine = new SplayTree(compareSegments);
56988       var sortedEvents = [];
56989
56990       var rightbound = Math.min(sbbox[2], cbbox[2]);
56991
56992       var prev, next, begin;
56993
56994       while (eventQueue.length !== 0) {
56995         var event = eventQueue.pop();
56996         sortedEvents.push(event);
56997
56998         // optimization by bboxes for intersection and difference goes here
56999         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
57000             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
57001           break;
57002         }
57003
57004         if (event.left) {
57005           next  = prev = sweepLine.insert(event);
57006           begin = sweepLine.minNode();
57007
57008           if (prev !== begin) { prev = sweepLine.prev(prev); }
57009           else                { prev = null; }
57010
57011           next = sweepLine.next(next);
57012
57013           var prevEvent = prev ? prev.key : null;
57014           var prevprevEvent = (void 0);
57015           computeFields(event, prevEvent, operation);
57016           if (next) {
57017             if (possibleIntersection(event, next.key, eventQueue) === 2) {
57018               computeFields(event, prevEvent, operation);
57019               computeFields(event, next.key, operation);
57020             }
57021           }
57022
57023           if (prev) {
57024             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
57025               var prevprev = prev;
57026               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
57027               else                    { prevprev = null; }
57028
57029               prevprevEvent = prevprev ? prevprev.key : null;
57030               computeFields(prevEvent, prevprevEvent, operation);
57031               computeFields(event,     prevEvent,     operation);
57032             }
57033           }
57034         } else {
57035           event = event.otherEvent;
57036           next = prev = sweepLine.find(event);
57037
57038           if (prev && next) {
57039
57040             if (prev !== begin) { prev = sweepLine.prev(prev); }
57041             else                { prev = null; }
57042
57043             next = sweepLine.next(next);
57044             sweepLine.remove(event);
57045
57046             if (next && prev) {
57047               possibleIntersection(prev.key, next.key, eventQueue);
57048             }
57049           }
57050         }
57051       }
57052       return sortedEvents;
57053     }
57054
57055     /**
57056      * @param  {Array.<SweepEvent>} sortedEvents
57057      * @return {Array.<SweepEvent>}
57058      */
57059     function orderEvents(sortedEvents) {
57060       var event, i, len, tmp;
57061       var resultEvents = [];
57062       for (i = 0, len = sortedEvents.length; i < len; i++) {
57063         event = sortedEvents[i];
57064         if ((event.left && event.inResult) ||
57065           (!event.left && event.otherEvent.inResult)) {
57066           resultEvents.push(event);
57067         }
57068       }
57069       // Due to overlapping edges the resultEvents array can be not wholly sorted
57070       var sorted = false;
57071       while (!sorted) {
57072         sorted = true;
57073         for (i = 0, len = resultEvents.length; i < len; i++) {
57074           if ((i + 1) < len &&
57075             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
57076             tmp = resultEvents[i];
57077             resultEvents[i] = resultEvents[i + 1];
57078             resultEvents[i + 1] = tmp;
57079             sorted = false;
57080           }
57081         }
57082       }
57083
57084
57085       for (i = 0, len = resultEvents.length; i < len; i++) {
57086         event = resultEvents[i];
57087         event.pos = i;
57088       }
57089
57090       // imagine, the right event is found in the beginning of the queue,
57091       // when his left counterpart is not marked yet
57092       for (i = 0, len = resultEvents.length; i < len; i++) {
57093         event = resultEvents[i];
57094         if (!event.left) {
57095           tmp = event.pos;
57096           event.pos = event.otherEvent.pos;
57097           event.otherEvent.pos = tmp;
57098         }
57099       }
57100
57101       return resultEvents;
57102     }
57103
57104
57105     /**
57106      * @param  {Number} pos
57107      * @param  {Array.<SweepEvent>} resultEvents
57108      * @param  {Object>}    processed
57109      * @return {Number}
57110      */
57111     function nextPos(pos, resultEvents, processed, origIndex) {
57112       var p, p1;
57113       var newPos = pos + 1;
57114       var length = resultEvents.length;
57115
57116       p  = resultEvents[pos].point;
57117
57118       if (newPos < length)
57119         { p1 = resultEvents[newPos].point; }
57120
57121
57122       // while in range and not the current one by value
57123       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
57124         if (!processed[newPos]) {
57125           return newPos;
57126         } else   {
57127           newPos++;
57128         }
57129         p1 = resultEvents[newPos].point;
57130       }
57131
57132       newPos = pos - 1;
57133
57134       while (processed[newPos] && newPos >= origIndex) {
57135         newPos--;
57136       }
57137       return newPos;
57138     }
57139
57140
57141     /**
57142      * @param  {Array.<SweepEvent>} sortedEvents
57143      * @return {Array.<*>} polygons
57144      */
57145     function connectEdges(sortedEvents, operation) {
57146       var i, len;
57147       var resultEvents = orderEvents(sortedEvents);
57148
57149       // "false"-filled array
57150       var processed = {};
57151       var result = [];
57152       var event;
57153
57154       for (i = 0, len = resultEvents.length; i < len; i++) {
57155         if (processed[i]) { continue; }
57156         var contour = [[]];
57157
57158         if (!resultEvents[i].isExteriorRing) {
57159           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
57160             result.push(contour);
57161           } else if (result.length === 0) {
57162             result.push([[contour]]);
57163           } else {
57164             result[result.length - 1].push(contour[0]);
57165           }
57166         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
57167           result[result.length - 1].push(contour[0]);
57168         } else {
57169           result.push(contour);
57170         }
57171
57172         var ringId = result.length - 1;
57173         var pos = i;
57174
57175         var initial = resultEvents[i].point;
57176         contour[0].push(initial);
57177
57178         while (pos >= i) {
57179           event = resultEvents[pos];
57180           processed[pos] = true;
57181
57182           if (event.left) {
57183             event.resultInOut = false;
57184             event.contourId   = ringId;
57185           } else {
57186             event.otherEvent.resultInOut = true;
57187             event.otherEvent.contourId   = ringId;
57188           }
57189
57190           pos = event.pos;
57191           processed[pos] = true;
57192           contour[0].push(resultEvents[pos].point);
57193           pos = nextPos(pos, resultEvents, processed, i);
57194         }
57195
57196         pos = pos === -1 ? i : pos;
57197
57198         event = resultEvents[pos];
57199         processed[pos] = processed[event.pos] = true;
57200         event.otherEvent.resultInOut = true;
57201         event.otherEvent.contourId   = ringId;
57202       }
57203
57204       // Handle if the result is a polygon (eg not multipoly)
57205       // Commented it again, let's see what do we mean by that
57206       // if (result.length === 1) result = result[0];
57207       return result;
57208     }
57209
57210     var tinyqueue = TinyQueue;
57211     var default_1 = TinyQueue;
57212
57213     function TinyQueue(data, compare) {
57214         var this$1 = this;
57215
57216         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
57217
57218         this.data = data || [];
57219         this.length = this.data.length;
57220         this.compare = compare || defaultCompare;
57221
57222         if (this.length > 0) {
57223             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
57224         }
57225     }
57226
57227     function defaultCompare(a, b) {
57228         return a < b ? -1 : a > b ? 1 : 0;
57229     }
57230
57231     TinyQueue.prototype = {
57232
57233         push: function (item) {
57234             this.data.push(item);
57235             this.length++;
57236             this._up(this.length - 1);
57237         },
57238
57239         pop: function () {
57240             if (this.length === 0) { return undefined; }
57241
57242             var top = this.data[0];
57243             this.length--;
57244
57245             if (this.length > 0) {
57246                 this.data[0] = this.data[this.length];
57247                 this._down(0);
57248             }
57249             this.data.pop();
57250
57251             return top;
57252         },
57253
57254         peek: function () {
57255             return this.data[0];
57256         },
57257
57258         _up: function (pos) {
57259             var data = this.data;
57260             var compare = this.compare;
57261             var item = data[pos];
57262
57263             while (pos > 0) {
57264                 var parent = (pos - 1) >> 1;
57265                 var current = data[parent];
57266                 if (compare(item, current) >= 0) { break; }
57267                 data[pos] = current;
57268                 pos = parent;
57269             }
57270
57271             data[pos] = item;
57272         },
57273
57274         _down: function (pos) {
57275             var this$1 = this;
57276
57277             var data = this.data;
57278             var compare = this.compare;
57279             var halfLength = this.length >> 1;
57280             var item = data[pos];
57281
57282             while (pos < halfLength) {
57283                 var left = (pos << 1) + 1;
57284                 var right = left + 1;
57285                 var best = data[left];
57286
57287                 if (right < this$1.length && compare(data[right], best) < 0) {
57288                     left = right;
57289                     best = data[right];
57290                 }
57291                 if (compare(best, item) >= 0) { break; }
57292
57293                 data[pos] = best;
57294                 pos = left;
57295             }
57296
57297             data[pos] = item;
57298         }
57299     };
57300     tinyqueue.default = default_1;
57301
57302     var max = Math.max;
57303     var min = Math.min;
57304
57305     var contourId = 0;
57306
57307
57308     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
57309       var i, len, s1, s2, e1, e2;
57310       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
57311         s1 = contourOrHole[i];
57312         s2 = contourOrHole[i + 1];
57313         e1 = new SweepEvent(s1, false, undefined, isSubject);
57314         e2 = new SweepEvent(s2, false, e1,        isSubject);
57315         e1.otherEvent = e2;
57316
57317         if (s1[0] === s2[0] && s1[1] === s2[1]) {
57318           continue; // skip collapsed edges, or it breaks
57319         }
57320
57321         e1.contourId = e2.contourId = depth;
57322         if (!isExteriorRing) {
57323           e1.isExteriorRing = false;
57324           e2.isExteriorRing = false;
57325         }
57326         if (compareEvents(e1, e2) > 0) {
57327           e2.left = true;
57328         } else {
57329           e1.left = true;
57330         }
57331
57332         var x = s1[0], y = s1[1];
57333         bbox[0] = min(bbox[0], x);
57334         bbox[1] = min(bbox[1], y);
57335         bbox[2] = max(bbox[2], x);
57336         bbox[3] = max(bbox[3], y);
57337
57338         // Pushing it so the queue is sorted from left to right,
57339         // with object on the left having the highest priority.
57340         Q.push(e1);
57341         Q.push(e2);
57342       }
57343     }
57344
57345
57346     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
57347       var eventQueue = new tinyqueue(null, compareEvents);
57348       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
57349
57350       for (i = 0, ii = subject.length; i < ii; i++) {
57351         polygonSet = subject[i];
57352         for (j = 0, jj = polygonSet.length; j < jj; j++) {
57353           isExteriorRing = j === 0;
57354           if (isExteriorRing) { contourId++; }
57355           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
57356         }
57357       }
57358
57359       for (i = 0, ii = clipping.length; i < ii; i++) {
57360         polygonSet = clipping[i];
57361         for (j = 0, jj = polygonSet.length; j < jj; j++) {
57362           isExteriorRing = j === 0;
57363           if (operation === DIFFERENCE) { isExteriorRing = false; }
57364           if (isExteriorRing) { contourId++; }
57365           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
57366         }
57367       }
57368
57369       return eventQueue;
57370     }
57371
57372     var EMPTY = [];
57373
57374
57375     function trivialOperation(subject, clipping, operation) {
57376       var result = null;
57377       if (subject.length * clipping.length === 0) {
57378         if        (operation === INTERSECTION) {
57379           result = EMPTY;
57380         } else if (operation === DIFFERENCE) {
57381           result = subject;
57382         } else if (operation === UNION ||
57383                    operation === XOR) {
57384           result = (subject.length === 0) ? clipping : subject;
57385         }
57386       }
57387       return result;
57388     }
57389
57390
57391     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
57392       var result = null;
57393       if (sbbox[0] > cbbox[2] ||
57394           cbbox[0] > sbbox[2] ||
57395           sbbox[1] > cbbox[3] ||
57396           cbbox[1] > sbbox[3]) {
57397         if        (operation === INTERSECTION) {
57398           result = EMPTY;
57399         } else if (operation === DIFFERENCE) {
57400           result = subject;
57401         } else if (operation === UNION ||
57402                    operation === XOR) {
57403           result = subject.concat(clipping);
57404         }
57405       }
57406       return result;
57407     }
57408
57409
57410     function boolean(subject, clipping, operation) {
57411       if (typeof subject[0][0][0] === 'number') {
57412         subject = [subject];
57413       }
57414       if (typeof clipping[0][0][0] === 'number') {
57415         clipping = [clipping];
57416       }
57417       var trivial = trivialOperation(subject, clipping, operation);
57418       if (trivial) {
57419         return trivial === EMPTY ? null : trivial;
57420       }
57421       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
57422       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
57423
57424       //console.time('fill queue');
57425       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
57426       //console.timeEnd('fill queue');
57427
57428       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
57429       if (trivial) {
57430         return trivial === EMPTY ? null : trivial;
57431       }
57432       //console.time('subdivide edges');
57433       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
57434       //console.timeEnd('subdivide edges');
57435
57436       //console.time('connect vertices');
57437       var result = connectEdges(sortedEvents, operation);
57438       //console.timeEnd('connect vertices');
57439       return result;
57440     }
57441
57442     function union (subject, clipping) {
57443       return boolean(subject, clipping, UNION);
57444     }
57445
57446     function diff (subject, clipping) {
57447       return boolean(subject, clipping, DIFFERENCE);
57448     }
57449
57450     function xor (subject, clipping){
57451       return boolean(subject, clipping, XOR);
57452     }
57453
57454     function intersection$1 (subject, clipping) {
57455       return boolean(subject, clipping, INTERSECTION);
57456     }
57457
57458     /**
57459      * @enum {Number}
57460      */
57461     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
57462
57463     exports.union = union;
57464     exports.diff = diff;
57465     exports.xor = xor;
57466     exports.intersection = intersection$1;
57467     exports.operations = operations;
57468
57469     Object.defineProperty(exports, '__esModule', { value: true });
57470
57471   })));
57472
57473   });
57474
57475   var martinez = unwrapExports(martinez_umd);
57476
57477   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
57478     var e, m;
57479     var eLen = (nBytes * 8) - mLen - 1;
57480     var eMax = (1 << eLen) - 1;
57481     var eBias = eMax >> 1;
57482     var nBits = -7;
57483     var i = isLE ? (nBytes - 1) : 0;
57484     var d = isLE ? -1 : 1;
57485     var s = buffer[offset + i];
57486
57487     i += d;
57488
57489     e = s & ((1 << (-nBits)) - 1);
57490     s >>= (-nBits);
57491     nBits += eLen;
57492     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
57493
57494     m = e & ((1 << (-nBits)) - 1);
57495     e >>= (-nBits);
57496     nBits += mLen;
57497     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
57498
57499     if (e === 0) {
57500       e = 1 - eBias;
57501     } else if (e === eMax) {
57502       return m ? NaN : ((s ? -1 : 1) * Infinity)
57503     } else {
57504       m = m + Math.pow(2, mLen);
57505       e = e - eBias;
57506     }
57507     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
57508   };
57509
57510   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
57511     var e, m, c;
57512     var eLen = (nBytes * 8) - mLen - 1;
57513     var eMax = (1 << eLen) - 1;
57514     var eBias = eMax >> 1;
57515     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
57516     var i = isLE ? 0 : (nBytes - 1);
57517     var d = isLE ? 1 : -1;
57518     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
57519
57520     value = Math.abs(value);
57521
57522     if (isNaN(value) || value === Infinity) {
57523       m = isNaN(value) ? 1 : 0;
57524       e = eMax;
57525     } else {
57526       e = Math.floor(Math.log(value) / Math.LN2);
57527       if (value * (c = Math.pow(2, -e)) < 1) {
57528         e--;
57529         c *= 2;
57530       }
57531       if (e + eBias >= 1) {
57532         value += rt / c;
57533       } else {
57534         value += rt * Math.pow(2, 1 - eBias);
57535       }
57536       if (value * c >= 2) {
57537         e++;
57538         c /= 2;
57539       }
57540
57541       if (e + eBias >= eMax) {
57542         m = 0;
57543         e = eMax;
57544       } else if (e + eBias >= 1) {
57545         m = ((value * c) - 1) * Math.pow(2, mLen);
57546         e = e + eBias;
57547       } else {
57548         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
57549         e = 0;
57550       }
57551     }
57552
57553     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
57554
57555     e = (e << mLen) | m;
57556     eLen += mLen;
57557     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
57558
57559     buffer[offset + i - d] |= s * 128;
57560   };
57561
57562   var ieee754 = {
57563         read: read$6,
57564         write: write$6
57565   };
57566
57567   var pbf = Pbf;
57568
57569
57570
57571   function Pbf(buf) {
57572       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
57573       this.pos = 0;
57574       this.type = 0;
57575       this.length = this.buf.length;
57576   }
57577
57578   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
57579   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
57580   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
57581   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
57582
57583   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
57584       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
57585
57586   Pbf.prototype = {
57587
57588       destroy: function() {
57589           this.buf = null;
57590       },
57591
57592       // === READING =================================================================
57593
57594       readFields: function(readField, result, end) {
57595           end = end || this.length;
57596
57597           while (this.pos < end) {
57598               var val = this.readVarint(),
57599                   tag = val >> 3,
57600                   startPos = this.pos;
57601
57602               this.type = val & 0x7;
57603               readField(tag, result, this);
57604
57605               if (this.pos === startPos) this.skip(val);
57606           }
57607           return result;
57608       },
57609
57610       readMessage: function(readField, result) {
57611           return this.readFields(readField, result, this.readVarint() + this.pos);
57612       },
57613
57614       readFixed32: function() {
57615           var val = readUInt32(this.buf, this.pos);
57616           this.pos += 4;
57617           return val;
57618       },
57619
57620       readSFixed32: function() {
57621           var val = readInt32(this.buf, this.pos);
57622           this.pos += 4;
57623           return val;
57624       },
57625
57626       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
57627
57628       readFixed64: function() {
57629           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
57630           this.pos += 8;
57631           return val;
57632       },
57633
57634       readSFixed64: function() {
57635           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
57636           this.pos += 8;
57637           return val;
57638       },
57639
57640       readFloat: function() {
57641           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
57642           this.pos += 4;
57643           return val;
57644       },
57645
57646       readDouble: function() {
57647           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
57648           this.pos += 8;
57649           return val;
57650       },
57651
57652       readVarint: function(isSigned) {
57653           var buf = this.buf,
57654               val, b;
57655
57656           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
57657           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
57658           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
57659           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
57660           b = buf[this.pos];   val |= (b & 0x0f) << 28;
57661
57662           return readVarintRemainder(val, isSigned, this);
57663       },
57664
57665       readVarint64: function() { // for compatibility with v2.0.1
57666           return this.readVarint(true);
57667       },
57668
57669       readSVarint: function() {
57670           var num = this.readVarint();
57671           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
57672       },
57673
57674       readBoolean: function() {
57675           return Boolean(this.readVarint());
57676       },
57677
57678       readString: function() {
57679           var end = this.readVarint() + this.pos,
57680               str = readUtf8(this.buf, this.pos, end);
57681           this.pos = end;
57682           return str;
57683       },
57684
57685       readBytes: function() {
57686           var end = this.readVarint() + this.pos,
57687               buffer = this.buf.subarray(this.pos, end);
57688           this.pos = end;
57689           return buffer;
57690       },
57691
57692       // verbose for performance reasons; doesn't affect gzipped size
57693
57694       readPackedVarint: function(arr, isSigned) {
57695           var end = readPackedEnd(this);
57696           arr = arr || [];
57697           while (this.pos < end) arr.push(this.readVarint(isSigned));
57698           return arr;
57699       },
57700       readPackedSVarint: function(arr) {
57701           var end = readPackedEnd(this);
57702           arr = arr || [];
57703           while (this.pos < end) arr.push(this.readSVarint());
57704           return arr;
57705       },
57706       readPackedBoolean: function(arr) {
57707           var end = readPackedEnd(this);
57708           arr = arr || [];
57709           while (this.pos < end) arr.push(this.readBoolean());
57710           return arr;
57711       },
57712       readPackedFloat: function(arr) {
57713           var end = readPackedEnd(this);
57714           arr = arr || [];
57715           while (this.pos < end) arr.push(this.readFloat());
57716           return arr;
57717       },
57718       readPackedDouble: function(arr) {
57719           var end = readPackedEnd(this);
57720           arr = arr || [];
57721           while (this.pos < end) arr.push(this.readDouble());
57722           return arr;
57723       },
57724       readPackedFixed32: function(arr) {
57725           var end = readPackedEnd(this);
57726           arr = arr || [];
57727           while (this.pos < end) arr.push(this.readFixed32());
57728           return arr;
57729       },
57730       readPackedSFixed32: function(arr) {
57731           var end = readPackedEnd(this);
57732           arr = arr || [];
57733           while (this.pos < end) arr.push(this.readSFixed32());
57734           return arr;
57735       },
57736       readPackedFixed64: function(arr) {
57737           var end = readPackedEnd(this);
57738           arr = arr || [];
57739           while (this.pos < end) arr.push(this.readFixed64());
57740           return arr;
57741       },
57742       readPackedSFixed64: function(arr) {
57743           var end = readPackedEnd(this);
57744           arr = arr || [];
57745           while (this.pos < end) arr.push(this.readSFixed64());
57746           return arr;
57747       },
57748
57749       skip: function(val) {
57750           var type = val & 0x7;
57751           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
57752           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
57753           else if (type === Pbf.Fixed32) this.pos += 4;
57754           else if (type === Pbf.Fixed64) this.pos += 8;
57755           else throw new Error('Unimplemented type: ' + type);
57756       },
57757
57758       // === WRITING =================================================================
57759
57760       writeTag: function(tag, type) {
57761           this.writeVarint((tag << 3) | type);
57762       },
57763
57764       realloc: function(min) {
57765           var length = this.length || 16;
57766
57767           while (length < this.pos + min) length *= 2;
57768
57769           if (length !== this.length) {
57770               var buf = new Uint8Array(length);
57771               buf.set(this.buf);
57772               this.buf = buf;
57773               this.length = length;
57774           }
57775       },
57776
57777       finish: function() {
57778           this.length = this.pos;
57779           this.pos = 0;
57780           return this.buf.subarray(0, this.length);
57781       },
57782
57783       writeFixed32: function(val) {
57784           this.realloc(4);
57785           writeInt32(this.buf, val, this.pos);
57786           this.pos += 4;
57787       },
57788
57789       writeSFixed32: function(val) {
57790           this.realloc(4);
57791           writeInt32(this.buf, val, this.pos);
57792           this.pos += 4;
57793       },
57794
57795       writeFixed64: function(val) {
57796           this.realloc(8);
57797           writeInt32(this.buf, val & -1, this.pos);
57798           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
57799           this.pos += 8;
57800       },
57801
57802       writeSFixed64: function(val) {
57803           this.realloc(8);
57804           writeInt32(this.buf, val & -1, this.pos);
57805           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
57806           this.pos += 8;
57807       },
57808
57809       writeVarint: function(val) {
57810           val = +val || 0;
57811
57812           if (val > 0xfffffff || val < 0) {
57813               writeBigVarint(val, this);
57814               return;
57815           }
57816
57817           this.realloc(4);
57818
57819           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57820           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57821           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
57822           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
57823       },
57824
57825       writeSVarint: function(val) {
57826           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
57827       },
57828
57829       writeBoolean: function(val) {
57830           this.writeVarint(Boolean(val));
57831       },
57832
57833       writeString: function(str) {
57834           str = String(str);
57835           this.realloc(str.length * 4);
57836
57837           this.pos++; // reserve 1 byte for short string length
57838
57839           var startPos = this.pos;
57840           // write the string directly to the buffer and see how much was written
57841           this.pos = writeUtf8(this.buf, str, this.pos);
57842           var len = this.pos - startPos;
57843
57844           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
57845
57846           // finally, write the message length in the reserved place and restore the position
57847           this.pos = startPos - 1;
57848           this.writeVarint(len);
57849           this.pos += len;
57850       },
57851
57852       writeFloat: function(val) {
57853           this.realloc(4);
57854           ieee754.write(this.buf, val, this.pos, true, 23, 4);
57855           this.pos += 4;
57856       },
57857
57858       writeDouble: function(val) {
57859           this.realloc(8);
57860           ieee754.write(this.buf, val, this.pos, true, 52, 8);
57861           this.pos += 8;
57862       },
57863
57864       writeBytes: function(buffer) {
57865           var len = buffer.length;
57866           this.writeVarint(len);
57867           this.realloc(len);
57868           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
57869       },
57870
57871       writeRawMessage: function(fn, obj) {
57872           this.pos++; // reserve 1 byte for short message length
57873
57874           // write the message directly to the buffer and see how much was written
57875           var startPos = this.pos;
57876           fn(obj, this);
57877           var len = this.pos - startPos;
57878
57879           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
57880
57881           // finally, write the message length in the reserved place and restore the position
57882           this.pos = startPos - 1;
57883           this.writeVarint(len);
57884           this.pos += len;
57885       },
57886
57887       writeMessage: function(tag, fn, obj) {
57888           this.writeTag(tag, Pbf.Bytes);
57889           this.writeRawMessage(fn, obj);
57890       },
57891
57892       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
57893       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
57894       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
57895       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
57896       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
57897       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
57898       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
57899       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
57900       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
57901
57902       writeBytesField: function(tag, buffer) {
57903           this.writeTag(tag, Pbf.Bytes);
57904           this.writeBytes(buffer);
57905       },
57906       writeFixed32Field: function(tag, val) {
57907           this.writeTag(tag, Pbf.Fixed32);
57908           this.writeFixed32(val);
57909       },
57910       writeSFixed32Field: function(tag, val) {
57911           this.writeTag(tag, Pbf.Fixed32);
57912           this.writeSFixed32(val);
57913       },
57914       writeFixed64Field: function(tag, val) {
57915           this.writeTag(tag, Pbf.Fixed64);
57916           this.writeFixed64(val);
57917       },
57918       writeSFixed64Field: function(tag, val) {
57919           this.writeTag(tag, Pbf.Fixed64);
57920           this.writeSFixed64(val);
57921       },
57922       writeVarintField: function(tag, val) {
57923           this.writeTag(tag, Pbf.Varint);
57924           this.writeVarint(val);
57925       },
57926       writeSVarintField: function(tag, val) {
57927           this.writeTag(tag, Pbf.Varint);
57928           this.writeSVarint(val);
57929       },
57930       writeStringField: function(tag, str) {
57931           this.writeTag(tag, Pbf.Bytes);
57932           this.writeString(str);
57933       },
57934       writeFloatField: function(tag, val) {
57935           this.writeTag(tag, Pbf.Fixed32);
57936           this.writeFloat(val);
57937       },
57938       writeDoubleField: function(tag, val) {
57939           this.writeTag(tag, Pbf.Fixed64);
57940           this.writeDouble(val);
57941       },
57942       writeBooleanField: function(tag, val) {
57943           this.writeVarintField(tag, Boolean(val));
57944       }
57945   };
57946
57947   function readVarintRemainder(l, s, p) {
57948       var buf = p.buf,
57949           h, b;
57950
57951       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
57952       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
57953       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
57954       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
57955       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
57956       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
57957
57958       throw new Error('Expected varint not more than 10 bytes');
57959   }
57960
57961   function readPackedEnd(pbf) {
57962       return pbf.type === Pbf.Bytes ?
57963           pbf.readVarint() + pbf.pos : pbf.pos + 1;
57964   }
57965
57966   function toNum(low, high, isSigned) {
57967       if (isSigned) {
57968           return high * 0x100000000 + (low >>> 0);
57969       }
57970
57971       return ((high >>> 0) * 0x100000000) + (low >>> 0);
57972   }
57973
57974   function writeBigVarint(val, pbf) {
57975       var low, high;
57976
57977       if (val >= 0) {
57978           low  = (val % 0x100000000) | 0;
57979           high = (val / 0x100000000) | 0;
57980       } else {
57981           low  = ~(-val % 0x100000000);
57982           high = ~(-val / 0x100000000);
57983
57984           if (low ^ 0xffffffff) {
57985               low = (low + 1) | 0;
57986           } else {
57987               low = 0;
57988               high = (high + 1) | 0;
57989           }
57990       }
57991
57992       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
57993           throw new Error('Given varint doesn\'t fit into 10 bytes');
57994       }
57995
57996       pbf.realloc(10);
57997
57998       writeBigVarintLow(low, high, pbf);
57999       writeBigVarintHigh(high, pbf);
58000   }
58001
58002   function writeBigVarintLow(low, high, pbf) {
58003       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
58004       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
58005       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
58006       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
58007       pbf.buf[pbf.pos]   = low & 0x7f;
58008   }
58009
58010   function writeBigVarintHigh(high, pbf) {
58011       var lsb = (high & 0x07) << 4;
58012
58013       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
58014       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
58015       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
58016       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
58017       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
58018       pbf.buf[pbf.pos++]  = high & 0x7f;
58019   }
58020
58021   function makeRoomForExtraLength(startPos, len, pbf) {
58022       var extraLen =
58023           len <= 0x3fff ? 1 :
58024           len <= 0x1fffff ? 2 :
58025           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
58026
58027       // if 1 byte isn't enough for encoding message length, shift the data to the right
58028       pbf.realloc(extraLen);
58029       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
58030   }
58031
58032   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
58033   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
58034   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
58035   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
58036   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
58037   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
58038   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
58039   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
58040   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
58041
58042   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
58043
58044   function readUInt32(buf, pos) {
58045       return ((buf[pos]) |
58046           (buf[pos + 1] << 8) |
58047           (buf[pos + 2] << 16)) +
58048           (buf[pos + 3] * 0x1000000);
58049   }
58050
58051   function writeInt32(buf, val, pos) {
58052       buf[pos] = val;
58053       buf[pos + 1] = (val >>> 8);
58054       buf[pos + 2] = (val >>> 16);
58055       buf[pos + 3] = (val >>> 24);
58056   }
58057
58058   function readInt32(buf, pos) {
58059       return ((buf[pos]) |
58060           (buf[pos + 1] << 8) |
58061           (buf[pos + 2] << 16)) +
58062           (buf[pos + 3] << 24);
58063   }
58064
58065   function readUtf8(buf, pos, end) {
58066       var str = '';
58067       var i = pos;
58068
58069       while (i < end) {
58070           var b0 = buf[i];
58071           var c = null; // codepoint
58072           var bytesPerSequence =
58073               b0 > 0xEF ? 4 :
58074               b0 > 0xDF ? 3 :
58075               b0 > 0xBF ? 2 : 1;
58076
58077           if (i + bytesPerSequence > end) break;
58078
58079           var b1, b2, b3;
58080
58081           if (bytesPerSequence === 1) {
58082               if (b0 < 0x80) {
58083                   c = b0;
58084               }
58085           } else if (bytesPerSequence === 2) {
58086               b1 = buf[i + 1];
58087               if ((b1 & 0xC0) === 0x80) {
58088                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
58089                   if (c <= 0x7F) {
58090                       c = null;
58091                   }
58092               }
58093           } else if (bytesPerSequence === 3) {
58094               b1 = buf[i + 1];
58095               b2 = buf[i + 2];
58096               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
58097                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
58098                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
58099                       c = null;
58100                   }
58101               }
58102           } else if (bytesPerSequence === 4) {
58103               b1 = buf[i + 1];
58104               b2 = buf[i + 2];
58105               b3 = buf[i + 3];
58106               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
58107                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
58108                   if (c <= 0xFFFF || c >= 0x110000) {
58109                       c = null;
58110                   }
58111               }
58112           }
58113
58114           if (c === null) {
58115               c = 0xFFFD;
58116               bytesPerSequence = 1;
58117
58118           } else if (c > 0xFFFF) {
58119               c -= 0x10000;
58120               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
58121               c = 0xDC00 | c & 0x3FF;
58122           }
58123
58124           str += String.fromCharCode(c);
58125           i += bytesPerSequence;
58126       }
58127
58128       return str;
58129   }
58130
58131   function writeUtf8(buf, str, pos) {
58132       for (var i = 0, c, lead; i < str.length; i++) {
58133           c = str.charCodeAt(i); // code point
58134
58135           if (c > 0xD7FF && c < 0xE000) {
58136               if (lead) {
58137                   if (c < 0xDC00) {
58138                       buf[pos++] = 0xEF;
58139                       buf[pos++] = 0xBF;
58140                       buf[pos++] = 0xBD;
58141                       lead = c;
58142                       continue;
58143                   } else {
58144                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
58145                       lead = null;
58146                   }
58147               } else {
58148                   if (c > 0xDBFF || (i + 1 === str.length)) {
58149                       buf[pos++] = 0xEF;
58150                       buf[pos++] = 0xBF;
58151                       buf[pos++] = 0xBD;
58152                   } else {
58153                       lead = c;
58154                   }
58155                   continue;
58156               }
58157           } else if (lead) {
58158               buf[pos++] = 0xEF;
58159               buf[pos++] = 0xBF;
58160               buf[pos++] = 0xBD;
58161               lead = null;
58162           }
58163
58164           if (c < 0x80) {
58165               buf[pos++] = c;
58166           } else {
58167               if (c < 0x800) {
58168                   buf[pos++] = c >> 0x6 | 0xC0;
58169               } else {
58170                   if (c < 0x10000) {
58171                       buf[pos++] = c >> 0xC | 0xE0;
58172                   } else {
58173                       buf[pos++] = c >> 0x12 | 0xF0;
58174                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
58175                   }
58176                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
58177               }
58178               buf[pos++] = c & 0x3F | 0x80;
58179           }
58180       }
58181       return pos;
58182   }
58183
58184   var pointGeometry = Point;
58185
58186   /**
58187    * A standalone point geometry with useful accessor, comparison, and
58188    * modification methods.
58189    *
58190    * @class Point
58191    * @param {Number} x the x-coordinate. this could be longitude or screen
58192    * pixels, or any other sort of unit.
58193    * @param {Number} y the y-coordinate. this could be latitude or screen
58194    * pixels, or any other sort of unit.
58195    * @example
58196    * var point = new Point(-77, 38);
58197    */
58198   function Point(x, y) {
58199       this.x = x;
58200       this.y = y;
58201   }
58202
58203   Point.prototype = {
58204
58205       /**
58206        * Clone this point, returning a new point that can be modified
58207        * without affecting the old one.
58208        * @return {Point} the clone
58209        */
58210       clone: function() { return new Point(this.x, this.y); },
58211
58212       /**
58213        * Add this point's x & y coordinates to another point,
58214        * yielding a new point.
58215        * @param {Point} p the other point
58216        * @return {Point} output point
58217        */
58218       add:     function(p) { return this.clone()._add(p); },
58219
58220       /**
58221        * Subtract this point's x & y coordinates to from point,
58222        * yielding a new point.
58223        * @param {Point} p the other point
58224        * @return {Point} output point
58225        */
58226       sub:     function(p) { return this.clone()._sub(p); },
58227
58228       /**
58229        * Multiply this point's x & y coordinates by point,
58230        * yielding a new point.
58231        * @param {Point} p the other point
58232        * @return {Point} output point
58233        */
58234       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
58235
58236       /**
58237        * Divide this point's x & y coordinates by point,
58238        * yielding a new point.
58239        * @param {Point} p the other point
58240        * @return {Point} output point
58241        */
58242       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
58243
58244       /**
58245        * Multiply this point's x & y coordinates by a factor,
58246        * yielding a new point.
58247        * @param {Point} k factor
58248        * @return {Point} output point
58249        */
58250       mult:    function(k) { return this.clone()._mult(k); },
58251
58252       /**
58253        * Divide this point's x & y coordinates by a factor,
58254        * yielding a new point.
58255        * @param {Point} k factor
58256        * @return {Point} output point
58257        */
58258       div:     function(k) { return this.clone()._div(k); },
58259
58260       /**
58261        * Rotate this point around the 0, 0 origin by an angle a,
58262        * given in radians
58263        * @param {Number} a angle to rotate around, in radians
58264        * @return {Point} output point
58265        */
58266       rotate:  function(a) { return this.clone()._rotate(a); },
58267
58268       /**
58269        * Rotate this point around p point by an angle a,
58270        * given in radians
58271        * @param {Number} a angle to rotate around, in radians
58272        * @param {Point} p Point to rotate around
58273        * @return {Point} output point
58274        */
58275       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
58276
58277       /**
58278        * Multiply this point by a 4x1 transformation matrix
58279        * @param {Array<Number>} m transformation matrix
58280        * @return {Point} output point
58281        */
58282       matMult: function(m) { return this.clone()._matMult(m); },
58283
58284       /**
58285        * Calculate this point but as a unit vector from 0, 0, meaning
58286        * that the distance from the resulting point to the 0, 0
58287        * coordinate will be equal to 1 and the angle from the resulting
58288        * point to the 0, 0 coordinate will be the same as before.
58289        * @return {Point} unit vector point
58290        */
58291       unit:    function() { return this.clone()._unit(); },
58292
58293       /**
58294        * Compute a perpendicular point, where the new y coordinate
58295        * is the old x coordinate and the new x coordinate is the old y
58296        * coordinate multiplied by -1
58297        * @return {Point} perpendicular point
58298        */
58299       perp:    function() { return this.clone()._perp(); },
58300
58301       /**
58302        * Return a version of this point with the x & y coordinates
58303        * rounded to integers.
58304        * @return {Point} rounded point
58305        */
58306       round:   function() { return this.clone()._round(); },
58307
58308       /**
58309        * Return the magitude of this point: this is the Euclidean
58310        * distance from the 0, 0 coordinate to this point's x and y
58311        * coordinates.
58312        * @return {Number} magnitude
58313        */
58314       mag: function() {
58315           return Math.sqrt(this.x * this.x + this.y * this.y);
58316       },
58317
58318       /**
58319        * Judge whether this point is equal to another point, returning
58320        * true or false.
58321        * @param {Point} other the other point
58322        * @return {boolean} whether the points are equal
58323        */
58324       equals: function(other) {
58325           return this.x === other.x &&
58326                  this.y === other.y;
58327       },
58328
58329       /**
58330        * Calculate the distance from this point to another point
58331        * @param {Point} p the other point
58332        * @return {Number} distance
58333        */
58334       dist: function(p) {
58335           return Math.sqrt(this.distSqr(p));
58336       },
58337
58338       /**
58339        * Calculate the distance from this point to another point,
58340        * without the square root step. Useful if you're comparing
58341        * relative distances.
58342        * @param {Point} p the other point
58343        * @return {Number} distance
58344        */
58345       distSqr: function(p) {
58346           var dx = p.x - this.x,
58347               dy = p.y - this.y;
58348           return dx * dx + dy * dy;
58349       },
58350
58351       /**
58352        * Get the angle from the 0, 0 coordinate to this point, in radians
58353        * coordinates.
58354        * @return {Number} angle
58355        */
58356       angle: function() {
58357           return Math.atan2(this.y, this.x);
58358       },
58359
58360       /**
58361        * Get the angle from this point to another point, in radians
58362        * @param {Point} b the other point
58363        * @return {Number} angle
58364        */
58365       angleTo: function(b) {
58366           return Math.atan2(this.y - b.y, this.x - b.x);
58367       },
58368
58369       /**
58370        * Get the angle between this point and another point, in radians
58371        * @param {Point} b the other point
58372        * @return {Number} angle
58373        */
58374       angleWith: function(b) {
58375           return this.angleWithSep(b.x, b.y);
58376       },
58377
58378       /*
58379        * Find the angle of the two vectors, solving the formula for
58380        * the cross product a x b = |a||b|sin(θ) for θ.
58381        * @param {Number} x the x-coordinate
58382        * @param {Number} y the y-coordinate
58383        * @return {Number} the angle in radians
58384        */
58385       angleWithSep: function(x, y) {
58386           return Math.atan2(
58387               this.x * y - this.y * x,
58388               this.x * x + this.y * y);
58389       },
58390
58391       _matMult: function(m) {
58392           var x = m[0] * this.x + m[1] * this.y,
58393               y = m[2] * this.x + m[3] * this.y;
58394           this.x = x;
58395           this.y = y;
58396           return this;
58397       },
58398
58399       _add: function(p) {
58400           this.x += p.x;
58401           this.y += p.y;
58402           return this;
58403       },
58404
58405       _sub: function(p) {
58406           this.x -= p.x;
58407           this.y -= p.y;
58408           return this;
58409       },
58410
58411       _mult: function(k) {
58412           this.x *= k;
58413           this.y *= k;
58414           return this;
58415       },
58416
58417       _div: function(k) {
58418           this.x /= k;
58419           this.y /= k;
58420           return this;
58421       },
58422
58423       _multByPoint: function(p) {
58424           this.x *= p.x;
58425           this.y *= p.y;
58426           return this;
58427       },
58428
58429       _divByPoint: function(p) {
58430           this.x /= p.x;
58431           this.y /= p.y;
58432           return this;
58433       },
58434
58435       _unit: function() {
58436           this._div(this.mag());
58437           return this;
58438       },
58439
58440       _perp: function() {
58441           var y = this.y;
58442           this.y = this.x;
58443           this.x = -y;
58444           return this;
58445       },
58446
58447       _rotate: function(angle) {
58448           var cos = Math.cos(angle),
58449               sin = Math.sin(angle),
58450               x = cos * this.x - sin * this.y,
58451               y = sin * this.x + cos * this.y;
58452           this.x = x;
58453           this.y = y;
58454           return this;
58455       },
58456
58457       _rotateAround: function(angle, p) {
58458           var cos = Math.cos(angle),
58459               sin = Math.sin(angle),
58460               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
58461               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
58462           this.x = x;
58463           this.y = y;
58464           return this;
58465       },
58466
58467       _round: function() {
58468           this.x = Math.round(this.x);
58469           this.y = Math.round(this.y);
58470           return this;
58471       }
58472   };
58473
58474   /**
58475    * Construct a point from an array if necessary, otherwise if the input
58476    * is already a Point, or an unknown type, return it unchanged
58477    * @param {Array<Number>|Point|*} a any kind of input value
58478    * @return {Point} constructed point, or passed-through value.
58479    * @example
58480    * // this
58481    * var point = Point.convert([0, 1]);
58482    * // is equivalent to
58483    * var point = new Point(0, 1);
58484    */
58485   Point.convert = function (a) {
58486       if (a instanceof Point) {
58487           return a;
58488       }
58489       if (Array.isArray(a)) {
58490           return new Point(a[0], a[1]);
58491       }
58492       return a;
58493   };
58494
58495   var vectortilefeature = VectorTileFeature;
58496
58497   function VectorTileFeature(pbf, end, extent, keys, values) {
58498       // Public
58499       this.properties = {};
58500       this.extent = extent;
58501       this.type = 0;
58502
58503       // Private
58504       this._pbf = pbf;
58505       this._geometry = -1;
58506       this._keys = keys;
58507       this._values = values;
58508
58509       pbf.readFields(readFeature, this, end);
58510   }
58511
58512   function readFeature(tag, feature, pbf) {
58513       if (tag == 1) feature.id = pbf.readVarint();
58514       else if (tag == 2) readTag(pbf, feature);
58515       else if (tag == 3) feature.type = pbf.readVarint();
58516       else if (tag == 4) feature._geometry = pbf.pos;
58517   }
58518
58519   function readTag(pbf, feature) {
58520       var end = pbf.readVarint() + pbf.pos;
58521
58522       while (pbf.pos < end) {
58523           var key = feature._keys[pbf.readVarint()],
58524               value = feature._values[pbf.readVarint()];
58525           feature.properties[key] = value;
58526       }
58527   }
58528
58529   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
58530
58531   VectorTileFeature.prototype.loadGeometry = function() {
58532       var pbf = this._pbf;
58533       pbf.pos = this._geometry;
58534
58535       var end = pbf.readVarint() + pbf.pos,
58536           cmd = 1,
58537           length = 0,
58538           x = 0,
58539           y = 0,
58540           lines = [],
58541           line;
58542
58543       while (pbf.pos < end) {
58544           if (length <= 0) {
58545               var cmdLen = pbf.readVarint();
58546               cmd = cmdLen & 0x7;
58547               length = cmdLen >> 3;
58548           }
58549
58550           length--;
58551
58552           if (cmd === 1 || cmd === 2) {
58553               x += pbf.readSVarint();
58554               y += pbf.readSVarint();
58555
58556               if (cmd === 1) { // moveTo
58557                   if (line) lines.push(line);
58558                   line = [];
58559               }
58560
58561               line.push(new pointGeometry(x, y));
58562
58563           } else if (cmd === 7) {
58564
58565               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
58566               if (line) {
58567                   line.push(line[0].clone()); // closePolygon
58568               }
58569
58570           } else {
58571               throw new Error('unknown command ' + cmd);
58572           }
58573       }
58574
58575       if (line) lines.push(line);
58576
58577       return lines;
58578   };
58579
58580   VectorTileFeature.prototype.bbox = function() {
58581       var pbf = this._pbf;
58582       pbf.pos = this._geometry;
58583
58584       var end = pbf.readVarint() + pbf.pos,
58585           cmd = 1,
58586           length = 0,
58587           x = 0,
58588           y = 0,
58589           x1 = Infinity,
58590           x2 = -Infinity,
58591           y1 = Infinity,
58592           y2 = -Infinity;
58593
58594       while (pbf.pos < end) {
58595           if (length <= 0) {
58596               var cmdLen = pbf.readVarint();
58597               cmd = cmdLen & 0x7;
58598               length = cmdLen >> 3;
58599           }
58600
58601           length--;
58602
58603           if (cmd === 1 || cmd === 2) {
58604               x += pbf.readSVarint();
58605               y += pbf.readSVarint();
58606               if (x < x1) x1 = x;
58607               if (x > x2) x2 = x;
58608               if (y < y1) y1 = y;
58609               if (y > y2) y2 = y;
58610
58611           } else if (cmd !== 7) {
58612               throw new Error('unknown command ' + cmd);
58613           }
58614       }
58615
58616       return [x1, y1, x2, y2];
58617   };
58618
58619   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
58620       var size = this.extent * Math.pow(2, z),
58621           x0 = this.extent * x,
58622           y0 = this.extent * y,
58623           coords = this.loadGeometry(),
58624           type = VectorTileFeature.types[this.type],
58625           i, j;
58626
58627       function project(line) {
58628           for (var j = 0; j < line.length; j++) {
58629               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
58630               line[j] = [
58631                   (p.x + x0) * 360 / size - 180,
58632                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
58633               ];
58634           }
58635       }
58636
58637       switch (this.type) {
58638       case 1:
58639           var points = [];
58640           for (i = 0; i < coords.length; i++) {
58641               points[i] = coords[i][0];
58642           }
58643           coords = points;
58644           project(coords);
58645           break;
58646
58647       case 2:
58648           for (i = 0; i < coords.length; i++) {
58649               project(coords[i]);
58650           }
58651           break;
58652
58653       case 3:
58654           coords = classifyRings(coords);
58655           for (i = 0; i < coords.length; i++) {
58656               for (j = 0; j < coords[i].length; j++) {
58657                   project(coords[i][j]);
58658               }
58659           }
58660           break;
58661       }
58662
58663       if (coords.length === 1) {
58664           coords = coords[0];
58665       } else {
58666           type = 'Multi' + type;
58667       }
58668
58669       var result = {
58670           type: "Feature",
58671           geometry: {
58672               type: type,
58673               coordinates: coords
58674           },
58675           properties: this.properties
58676       };
58677
58678       if ('id' in this) {
58679           result.id = this.id;
58680       }
58681
58682       return result;
58683   };
58684
58685   // classifies an array of rings into polygons with outer rings and holes
58686
58687   function classifyRings(rings) {
58688       var len = rings.length;
58689
58690       if (len <= 1) return [rings];
58691
58692       var polygons = [],
58693           polygon,
58694           ccw;
58695
58696       for (var i = 0; i < len; i++) {
58697           var area = signedArea(rings[i]);
58698           if (area === 0) continue;
58699
58700           if (ccw === undefined) ccw = area < 0;
58701
58702           if (ccw === area < 0) {
58703               if (polygon) polygons.push(polygon);
58704               polygon = [rings[i]];
58705
58706           } else {
58707               polygon.push(rings[i]);
58708           }
58709       }
58710       if (polygon) polygons.push(polygon);
58711
58712       return polygons;
58713   }
58714
58715   function signedArea(ring) {
58716       var sum = 0;
58717       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
58718           p1 = ring[i];
58719           p2 = ring[j];
58720           sum += (p2.x - p1.x) * (p1.y + p2.y);
58721       }
58722       return sum;
58723   }
58724
58725   var vectortilelayer = VectorTileLayer;
58726
58727   function VectorTileLayer(pbf, end) {
58728       // Public
58729       this.version = 1;
58730       this.name = null;
58731       this.extent = 4096;
58732       this.length = 0;
58733
58734       // Private
58735       this._pbf = pbf;
58736       this._keys = [];
58737       this._values = [];
58738       this._features = [];
58739
58740       pbf.readFields(readLayer, this, end);
58741
58742       this.length = this._features.length;
58743   }
58744
58745   function readLayer(tag, layer, pbf) {
58746       if (tag === 15) layer.version = pbf.readVarint();
58747       else if (tag === 1) layer.name = pbf.readString();
58748       else if (tag === 5) layer.extent = pbf.readVarint();
58749       else if (tag === 2) layer._features.push(pbf.pos);
58750       else if (tag === 3) layer._keys.push(pbf.readString());
58751       else if (tag === 4) layer._values.push(readValueMessage(pbf));
58752   }
58753
58754   function readValueMessage(pbf) {
58755       var value = null,
58756           end = pbf.readVarint() + pbf.pos;
58757
58758       while (pbf.pos < end) {
58759           var tag = pbf.readVarint() >> 3;
58760
58761           value = tag === 1 ? pbf.readString() :
58762               tag === 2 ? pbf.readFloat() :
58763               tag === 3 ? pbf.readDouble() :
58764               tag === 4 ? pbf.readVarint64() :
58765               tag === 5 ? pbf.readVarint() :
58766               tag === 6 ? pbf.readSVarint() :
58767               tag === 7 ? pbf.readBoolean() : null;
58768       }
58769
58770       return value;
58771   }
58772
58773   // return feature `i` from this layer as a `VectorTileFeature`
58774   VectorTileLayer.prototype.feature = function(i) {
58775       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
58776
58777       this._pbf.pos = this._features[i];
58778
58779       var end = this._pbf.readVarint() + this._pbf.pos;
58780       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
58781   };
58782
58783   var vectortile = VectorTile;
58784
58785   function VectorTile(pbf, end) {
58786       this.layers = pbf.readFields(readTile, {}, end);
58787   }
58788
58789   function readTile(tag, layers, pbf) {
58790       if (tag === 3) {
58791           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
58792           if (layer.length) layers[layer.name] = layer;
58793       }
58794   }
58795
58796   var VectorTile$1 = vectortile;
58797   var VectorTileFeature$1 = vectortilefeature;
58798   var VectorTileLayer$1 = vectortilelayer;
58799
58800   var vectorTile = {
58801         VectorTile: VectorTile$1,
58802         VectorTileFeature: VectorTileFeature$1,
58803         VectorTileLayer: VectorTileLayer$1
58804   };
58805
58806   var tiler$6 = utilTiler().tileSize(512).margin(1);
58807   var dispatch$7 = dispatch('loadedData');
58808   var _vtCache;
58809
58810
58811   function abortRequest$6(i) {
58812       i.abort();
58813   }
58814
58815
58816   function vtToGeoJSON(data, tile, mergeCache) {
58817       var vectorTile$1 = new vectorTile.VectorTile(new pbf(data.response));
58818       var layers = Object.keys(vectorTile$1.layers);
58819       if (!Array.isArray(layers)) { layers = [layers]; }
58820
58821       var features = [];
58822       layers.forEach(function(layerID) {
58823           var layer = vectorTile$1.layers[layerID];
58824           if (layer) {
58825               for (var i = 0; i < layer.length; i++) {
58826                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
58827                   var geometry = feature.geometry;
58828
58829                   // Treat all Polygons as MultiPolygons
58830                   if (geometry.type === 'Polygon') {
58831                       geometry.type = 'MultiPolygon';
58832                       geometry.coordinates = [geometry.coordinates];
58833                   }
58834
58835                   // Clip to tile bounds
58836                   if (geometry.type === 'MultiPolygon') {
58837                       var isClipped = false;
58838                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
58839                       if (!isEqual(feature.geometry, featureClip.geometry)) {
58840                           // feature = featureClip;
58841                           isClipped = true;
58842                       }
58843                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
58844                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
58845                   }
58846
58847                   // Generate some unique IDs and add some metadata
58848                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
58849                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
58850                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
58851                   feature.__featurehash__ = featurehash;
58852                   feature.__propertyhash__ = propertyhash;
58853                   features.push(feature);
58854
58855                   // Clipped Polygons at same zoom with identical properties can get merged
58856                   if (isClipped && geometry.type === 'MultiPolygon') {
58857                       var merged = mergeCache[propertyhash];
58858                       if (merged && merged.length) {
58859                           var other = merged[0];
58860                           var coords = martinez.union(
58861                               feature.geometry.coordinates, other.geometry.coordinates
58862                           );
58863
58864                           if (!coords || !coords.length) {
58865                               continue;  // something failed in martinez union
58866                           }
58867
58868                           merged.push(feature);
58869                           for (var j = 0; j < merged.length; j++) {      // all these features get...
58870                               merged[j].geometry.coordinates = coords;   // same coords
58871                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
58872                           }
58873                       } else {
58874                           mergeCache[propertyhash] = [feature];
58875                       }
58876                   }
58877               }
58878           }
58879       });
58880
58881       return features;
58882   }
58883
58884
58885   function loadTile(source, tile) {
58886       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
58887
58888       var url = source.template
58889           .replace('{x}', tile.xyz[0])
58890           .replace('{y}', tile.xyz[1])
58891           // TMS-flipped y coordinate
58892           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
58893           .replace(/\{z(oom)?\}/, tile.xyz[2])
58894           .replace(/\{switch:([^}]+)\}/, function(s, r) {
58895               var subdomains = r.split(',');
58896               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
58897           });
58898
58899       source.inflight[tile.id] = request(url)
58900           .responseType('arraybuffer')
58901           .get(function(err, data) {
58902               source.loaded[tile.id] = [];
58903               delete source.inflight[tile.id];
58904               if (err || !data) return;
58905
58906               var z = tile.xyz[2];
58907               if (!source.canMerge[z]) {
58908                   source.canMerge[z] = {};  // initialize mergeCache
58909               }
58910
58911               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
58912               dispatch$7.call('loadedData');
58913           });
58914   }
58915
58916
58917   var serviceVectorTile = {
58918
58919       init: function() {
58920           if (!_vtCache) {
58921               this.reset();
58922           }
58923
58924           this.event = utilRebind(this, dispatch$7, 'on');
58925       },
58926
58927
58928       reset: function() {
58929           for (var sourceID in _vtCache) {
58930               var source = _vtCache[sourceID];
58931               if (source && source.inflight) {
58932                   forEach(source.inflight, abortRequest$6);
58933               }
58934           }
58935
58936           _vtCache = {};
58937       },
58938
58939
58940       addSource: function(sourceID, template) {
58941           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
58942           return _vtCache[sourceID];
58943       },
58944
58945
58946       data: function(sourceID, projection) {
58947           var source = _vtCache[sourceID];
58948           if (!source) return [];
58949
58950           var tiles = tiler$6.getTiles(projection);
58951           var seen = {};
58952           var results = [];
58953
58954           for (var i = 0; i < tiles.length; i++) {
58955               var features = source.loaded[tiles[i].id];
58956               if (!features || !features.length) continue;
58957
58958               for (var j = 0; j < features.length; j++) {
58959                   var feature = features[j];
58960                   var hash = feature.__featurehash__;
58961                   if (seen[hash]) continue;
58962                   seen[hash] = true;
58963
58964                   // return a shallow clone, because the hash may change
58965                   // later if this feature gets merged with another
58966                   results.push(clone(feature));
58967               }
58968           }
58969
58970           return results;
58971       },
58972
58973
58974       loadTiles: function(sourceID, template, projection) {
58975           var source = _vtCache[sourceID];
58976           if (!source) {
58977               source = this.addSource(sourceID, template);
58978           }
58979
58980           var tiles = tiler$6.getTiles(projection);
58981
58982           // abort inflight requests that are no longer needed
58983           forEach(source.inflight, function(v, k) {
58984               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
58985
58986               if (!wanted) {
58987                   abortRequest$6(v);
58988                   delete source.inflight[k];
58989               }
58990           });
58991
58992           tiles.forEach(function(tile) {
58993               loadTile(source, tile);
58994           });
58995       },
58996
58997
58998       cache: function() {
58999           return _vtCache;
59000       }
59001
59002   };
59003
59004   var apibase$5 = 'https://www.wikidata.org/w/api.php?';
59005   var _wikidataCache = {};
59006
59007   var serviceWikidata = {
59008
59009       init: function() {},
59010
59011       reset: function() {
59012           _wikidataCache = {};
59013       },
59014
59015
59016       // Given a Wikipedia language and article title, return an array of
59017       // corresponding Wikidata entities.
59018       itemsByTitle: function(lang, title, callback) {
59019           if (!title) {
59020               callback('No title', {});
59021               return;
59022           }
59023
59024           lang = lang || 'en';
59025
59026           d3_json(apibase$5 + utilQsString({
59027               action: 'wbgetentities',
59028               format: 'json',
59029               formatversion: 2,
59030               sites: lang.replace(/-/g, '_') + 'wiki',
59031               titles: title,
59032               languages: 'en', // shrink response by filtering to one language
59033               origin: '*'
59034           }), function(err, data) {
59035               if (data && data.error) {
59036                   err = data.error;
59037               }
59038               if (err) {
59039                   callback(err, {});
59040               } else {
59041                   callback(null, data.entities || {});
59042               }
59043           });
59044       },
59045
59046
59047       entityByQID: function(qid, callback) {
59048           if (!qid) {
59049               callback('No qid', {});
59050               return;
59051           }
59052           if (_wikidataCache[qid]) {
59053               callback(null, _wikidataCache[qid]);
59054               return;
59055           }
59056
59057           var langs = uniq([
59058               currentLocale.toLowerCase(),
59059               currentLocale.split('-', 2)[0].toLowerCase(),
59060               'en'
59061           ]);
59062
59063           d3_json(apibase$5 + utilQsString({
59064               action: 'wbgetentities',
59065               format: 'json',
59066               formatversion: 2,
59067               ids: qid,
59068               props: 'labels|descriptions|claims|sitelinks',
59069               sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
59070               languages: langs.join('|'),
59071               languagefallback: 1,
59072               origin: '*'
59073           }), function(err, data) {
59074               if (data && data.error) {
59075                   err = data.error;
59076               }
59077               if (err) {
59078                   callback(err, {});
59079               } else {
59080                   _wikidataCache[qid] = data.entities[qid];
59081                   callback(null, data.entities[qid] || {});
59082               }
59083           });
59084       },
59085
59086
59087       // Pass `params` object of the form:
59088       // {
59089       //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
59090       // }
59091       //
59092       // Get an result object used to display tag documentation
59093       // {
59094       //   title:        'string',
59095       //   description:  'string',
59096       //   editURL:      'string',
59097       //   imageURL:     'string',
59098       //   wiki:         { title: 'string', text: 'string', url: 'string' }
59099       // }
59100       //
59101       getDocs: function(params, callback) {
59102           this.entityByQID(params.qid, function(err, entity) {
59103               if (err || !entity) {
59104                   callback(err || 'No entity');
59105                   return;
59106               }
59107
59108               var i;
59109
59110               var description;
59111               if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
59112                   description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
59113               }
59114
59115               // prepare result
59116               var result = {
59117                   title: entity.id,
59118                   description: description,
59119                   editURL: 'https://www.wikidata.org/wiki/' + entity.id
59120               };
59121
59122               // add image
59123               if (entity.claims) {
59124                   var imageroot = 'https://commons.wikimedia.org/w/index.php';
59125                   var props = ['P154','P18'];  // logo image, image
59126                   var prop, image;
59127                   for (i = 0; i < props.length; i++) {
59128                       prop = entity.claims[props[i]];
59129                       if (prop && Object.keys(prop).length > 0) {
59130                           image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
59131                           if (image) {
59132                               result.imageURL = imageroot + '?' + utilQsString({
59133                                   title: 'Special:Redirect/file/' + image,
59134                                   width: 400
59135                               });
59136                               break;
59137                           }
59138                       }
59139                   }
59140               }
59141
59142               if (entity.sitelinks) {
59143                   // must be one of these that we requested..
59144                   var langs = uniq([
59145                       currentLocale.toLowerCase(),
59146                       currentLocale.split('-', 2)[0].toLowerCase(),
59147                       'en'
59148                   ]);
59149                   var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
59150
59151                   for (i = 0; i < langs.length; i++) {   // check each, in order of preference
59152                       var w = langs[i] + 'wiki';
59153                       if (entity.sitelinks[w]) {
59154                           var title = entity.sitelinks[w].title;
59155                           var tKey = 'inspector.wiki_reference';
59156                           if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
59157                               tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
59158                           }
59159
59160                           result.wiki = {
59161                               title: title,
59162                               text: tKey,
59163                               url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
59164                           };
59165                           break;
59166                       }
59167                   }
59168               }
59169
59170               callback(null, result);
59171           });
59172       }
59173
59174   };
59175
59176   var endpoint = 'https://en.wikipedia.org/w/api.php?';
59177
59178   var serviceWikipedia = {
59179
59180       init: function() {},
59181       reset: function() {},
59182
59183
59184       search: function(lang, query, callback) {
59185           if (!query) {
59186               callback('', []);
59187               return;
59188           }
59189
59190           lang = lang || 'en';
59191           d3_json(endpoint.replace('en', lang) +
59192               utilQsString({
59193                   action: 'query',
59194                   list: 'search',
59195                   srlimit: '10',
59196                   srinfo: 'suggestion',
59197                   format: 'json',
59198                   origin: '*',
59199                   srsearch: query
59200               }), function(err, data) {
59201                   if (err || !data || !data.query || !data.query.search || data.error) {
59202                       callback('', []);
59203                   } else {
59204                       var results = data.query.search.map(function(d) { return d.title; });
59205                       callback(query, results);
59206                   }
59207               }
59208           );
59209       },
59210
59211
59212       suggestions: function(lang, query, callback) {
59213           if (!query) {
59214               callback('', []);
59215               return;
59216           }
59217
59218           lang = lang || 'en';
59219           d3_json(endpoint.replace('en', lang) +
59220               utilQsString({
59221                   action: 'opensearch',
59222                   namespace: 0,
59223                   suggest: '',
59224                   format: 'json',
59225                   origin: '*',
59226                   search: query
59227               }), function(err, data) {
59228                   if (err || !data || data.error) {
59229                       callback('', []);
59230                   } else {
59231                       callback(data[0], data[1] || []);
59232                   }
59233               }
59234           );
59235       },
59236
59237
59238       translations: function(lang, title, callback) {
59239           if (!title) {
59240               callback({});
59241               return;
59242           }
59243
59244           d3_json(endpoint.replace('en', lang) +
59245               utilQsString({
59246                   action: 'query',
59247                   prop: 'langlinks',
59248                   format: 'json',
59249                   origin: '*',
59250                   lllimit: 500,
59251                   titles: title
59252               }), function(err, data) {
59253                   if (err || !data || !data.query || !data.query.pages || data.error) {
59254                       callback({});
59255                   } else {
59256                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
59257                           translations = {};
59258                       if (list && list.langlinks) {
59259                           list.langlinks.forEach(function(d) {
59260                               translations[d.lang] = d['*'];
59261                           });
59262                       }
59263                       callback(translations);
59264                   }
59265               }
59266           );
59267       }
59268
59269   };
59270
59271   var services = {
59272       geocoder: serviceNominatim,
59273       keepRight: serviceKeepRight,
59274       improveOSM: serviceImproveOSM,
59275       mapillary: serviceMapillary,
59276       openstreetcam: serviceOpenstreetcam,
59277       osm: serviceOsm,
59278       osmWikibase: serviceOsmWikibase,
59279       maprules: serviceMapRules,
59280       streetside: serviceStreetside,
59281       taginfo: serviceTaginfo,
59282       vectorTile: serviceVectorTile,
59283       wikidata: serviceWikidata,
59284       wikipedia: serviceWikipedia
59285   };
59286
59287   function modeAddNote(context) {
59288       var mode = {
59289           id: 'add-note',
59290           button: 'note',
59291           title: t('modes.add_note.title'),
59292           description: t('modes.add_note.description'),
59293           key: '4'
59294       };
59295
59296       var behavior = behaviorDraw(context)
59297           .tail(t('modes.add_note.tail'))
59298           .on('click', add)
59299           .on('cancel', cancel)
59300           .on('finish', cancel);
59301
59302
59303       function add(loc) {
59304           var osm = services.osm;
59305           if (!osm) return;
59306
59307           var note = osmNote({ loc: loc, status: 'open', comments: [] });
59308           osm.replaceNote(note);
59309
59310           // force a reraw (there is no history change that would otherwise do this)
59311           context.pan([0,0]);
59312
59313           context
59314               .selectedNoteID(note.id)
59315               .enter(modeSelectNote(context, note.id).newFeature(true));
59316       }
59317
59318
59319       function cancel() {
59320           context.enter(modeBrowse(context));
59321       }
59322
59323
59324       mode.enter = function() {
59325           context.install(behavior);
59326       };
59327
59328
59329       mode.exit = function() {
59330           context.uninstall(behavior);
59331       };
59332
59333
59334       return mode;
59335   }
59336
59337   function modeDragNode(context) {
59338       var mode = {
59339           id: 'drag-node',
59340           button: 'browse'
59341       };
59342       var hover = behaviorHover(context).altDisables(true)
59343           .on('hover', context.ui().sidebar.hover);
59344       var edit = behaviorEdit(context);
59345
59346       var _nudgeInterval;
59347       var _restoreSelectedIDs = [];
59348       var _wasMidpoint = false;
59349       var _isCancelled = false;
59350       var _activeEntity;
59351       var _startLoc;
59352       var _lastLoc;
59353
59354
59355       function startNudge(entity, nudge) {
59356           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
59357           _nudgeInterval = window.setInterval(function() {
59358               context.pan(nudge);
59359               doMove(entity, nudge);
59360           }, 50);
59361       }
59362
59363
59364       function stopNudge() {
59365           if (_nudgeInterval) {
59366               window.clearInterval(_nudgeInterval);
59367               _nudgeInterval = null;
59368           }
59369       }
59370
59371
59372       function moveAnnotation(entity) {
59373           return t('operations.move.annotation.' + entity.geometry(context.graph()));
59374       }
59375
59376
59377       function connectAnnotation(nodeEntity, targetEntity) {
59378           var nodeGeometry = nodeEntity.geometry(context.graph());
59379           var targetGeometry = targetEntity.geometry(context.graph());
59380           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
59381               var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
59382               var targetParentWayIDs = context.graph().parentWays(targetEntity);
59383               var sharedParentWays = intersection(nodeParentWayIDs, targetParentWayIDs);
59384               // if both vertices are part of the same way
59385               if (sharedParentWays.length !== 0) {
59386                   // if the nodes are next to each other, they are merged
59387                   if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
59388                       return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
59389                   }
59390                   return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
59391               }
59392           }
59393           return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
59394       }
59395
59396
59397       function shouldSnapToNode(target) {
59398           return _activeEntity.geometry(context.graph()) !== 'vertex' ||
59399               (target.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(target, context.graph()));
59400       }
59401
59402
59403       function origin(entity) {
59404           return context.projection(entity.loc);
59405       }
59406
59407
59408       function keydown() {
59409           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
59410               if (context.surface().classed('nope')) {
59411                   context.surface()
59412                       .classed('nope-suppressed', true);
59413               }
59414               context.surface()
59415                   .classed('nope', false)
59416                   .classed('nope-disabled', true);
59417           }
59418       }
59419
59420
59421       function keyup() {
59422           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
59423               if (context.surface().classed('nope-suppressed')) {
59424                   context.surface()
59425                       .classed('nope', true);
59426               }
59427               context.surface()
59428                   .classed('nope-suppressed', false)
59429                   .classed('nope-disabled', false);
59430           }
59431       }
59432
59433
59434       function start(entity) {
59435           _wasMidpoint = entity.type === 'midpoint';
59436           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
59437           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
59438
59439
59440           if (_isCancelled) {
59441               if (hasHidden) {
59442                   uiFlash()
59443                       .duration(4000)
59444                       .text(t('modes.drag_node.connected_to_hidden'))();
59445               }
59446               return drag.cancel();
59447           }
59448
59449           if (_wasMidpoint) {
59450               var midpoint = entity;
59451               entity = osmNode();
59452               context.perform(actionAddMidpoint(midpoint, entity));
59453               entity = context.entity(entity.id);   // get post-action entity
59454
59455               var vertex = context.surface().selectAll('.' + entity.id);
59456               drag.target(vertex.node(), entity);
59457
59458           } else {
59459               context.perform(actionNoop());
59460           }
59461
59462           _activeEntity = entity;
59463           _startLoc = entity.loc;
59464
59465           hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
59466
59467           context.surface().selectAll('.' + _activeEntity.id)
59468               .classed('active', true);
59469
59470           context.enter(mode);
59471       }
59472
59473
59474       // related code
59475       // - `behavior/draw.js` `datum()`
59476       function datum() {
59477           var event$1 = event && event.sourceEvent;
59478           if (!event$1 || event$1.altKey) {
59479               return {};
59480           } else {
59481               // When dragging, snap only to touch targets..
59482               // (this excludes area fills and active drawing elements)
59483               var d = event$1.target.__data__;
59484               return (d && d.properties && d.properties.target) ? d : {};
59485           }
59486       }
59487
59488
59489       function doMove(entity, nudge) {
59490           nudge = nudge || [0, 0];
59491
59492           var currPoint = (event && event.point) || context.projection(_lastLoc);
59493           var currMouse = geoVecSubtract(currPoint, nudge);
59494           var loc = context.projection.invert(currMouse);
59495
59496           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
59497               // related code
59498               // - `mode/drag_node.js`     `doMode()`
59499               // - `behavior/draw.js`      `click()`
59500               // - `behavior/draw_way.js`  `move()`
59501               var d = datum();
59502               var target = d && d.properties && d.properties.entity;
59503               var targetLoc = target && target.loc;
59504               var targetNodes = d && d.properties && d.properties.nodes;
59505               var edge;
59506
59507               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
59508                   if (shouldSnapToNode(target)) {
59509                       loc = targetLoc;
59510                   }
59511
59512               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
59513                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
59514                   if (edge) {
59515                       loc = edge.loc;
59516                   }
59517               }
59518           }
59519
59520           context.replace(
59521               actionMoveNode(entity.id, loc)
59522           );
59523
59524           // Below here: validations
59525           var isInvalid = false;
59526
59527           // Check if this connection to `target` could cause relations to break..
59528           if (target) {
59529               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
59530           }
59531
59532           // Check if this drag causes the geometry to break..
59533           if (!isInvalid) {
59534               isInvalid = hasInvalidGeometry(entity, context.graph());
59535           }
59536
59537
59538           var nope = context.surface().classed('nope');
59539           if (isInvalid === 'relation' || isInvalid === 'restriction') {
59540               if (!nope) {   // about to nope - show hint
59541                   uiFlash()
59542                       .duration(4000)
59543                       .text(t('operations.connect.' + isInvalid,
59544                           { relation: context.presets().item('type/restriction').name() }
59545                       ))();
59546               }
59547           } else {
59548               if (nope) {   // about to un-nope, remove hint
59549                   uiFlash()
59550                       .duration(1)
59551                       .text('')();
59552               }
59553           }
59554
59555
59556           var nopeDisabled = context.surface().classed('nope-disabled');
59557           if (nopeDisabled) {
59558               context.surface()
59559                   .classed('nope', false)
59560                   .classed('nope-suppressed', isInvalid);
59561           } else {
59562               context.surface()
59563                   .classed('nope', isInvalid)
59564                   .classed('nope-suppressed', false);
59565           }
59566
59567           _lastLoc = loc;
59568       }
59569
59570
59571       // Uses `actionConnect.disabled()` to know whether this connection is ok..
59572       function hasRelationConflict(entity, target, edge, graph) {
59573           var testGraph = graph.update();  // copy
59574
59575           // if snapping to way - add midpoint there and consider that the target..
59576           if (edge) {
59577               var midpoint = osmNode();
59578               var action = actionAddMidpoint({
59579                   loc: edge.loc,
59580                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
59581               }, midpoint);
59582
59583               testGraph = action(testGraph);
59584               target = midpoint;
59585           }
59586
59587           // can we connect to it?
59588           var ids = [entity.id, target.id];
59589           return actionConnect(ids).disabled(testGraph);
59590       }
59591
59592
59593       function hasInvalidGeometry(entity, graph) {
59594           var parents = graph.parentWays(entity);
59595           var i, j, k;
59596
59597           for (i = 0; i < parents.length; i++) {
59598               var parent = parents[i];
59599               var nodes = [];
59600               var activeIndex = null;    // which multipolygon ring contains node being dragged
59601
59602               // test any parent multipolygons for valid geometry
59603               var relations = graph.parentRelations(parent);
59604               for (j = 0; j < relations.length; j++) {
59605                   if (!relations[j].isMultipolygon()) continue;
59606
59607                   var rings = osmJoinWays(relations[j].members, graph);
59608
59609                   // find active ring and test it for self intersections
59610                   for (k = 0; k < rings.length; k++) {
59611                       nodes = rings[k].nodes;
59612                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
59613                           activeIndex = k;
59614                           if (geoHasSelfIntersections(nodes, entity.id)) {
59615                               return true;
59616                           }
59617                       }
59618                       rings[k].coords = nodes.map(function(n) { return n.loc; });
59619                   }
59620
59621                   // test active ring for intersections with other rings in the multipolygon
59622                   for (k = 0; k < rings.length; k++) {
59623                       if (k === activeIndex) continue;
59624
59625                       // make sure active ring doesnt cross passive rings
59626                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
59627                           return true;
59628                       }
59629                   }
59630               }
59631
59632
59633               // If we still haven't tested this node's parent way for self-intersections.
59634               // (because it's not a member of a multipolygon), test it now.
59635               if (activeIndex === null) {
59636                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
59637                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
59638                       return true;
59639                   }
59640               }
59641
59642           }
59643
59644           return false;
59645       }
59646
59647
59648       function move(entity) {
59649           if (_isCancelled) return;
59650           event.sourceEvent.stopPropagation();
59651
59652           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
59653
59654           _lastLoc = context.projection.invert(event.point);
59655
59656           doMove(entity);
59657           var nudge = geoViewportEdge(event.point, context.map().dimensions());
59658           if (nudge) {
59659               startNudge(entity, nudge);
59660           } else {
59661               stopNudge();
59662           }
59663       }
59664
59665       function end(entity) {
59666           if (_isCancelled) return;
59667
59668           var d = datum();
59669           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
59670           var target = d && d.properties && d.properties.entity;   // entity to snap to
59671
59672           if (nope) {   // bounce back
59673               context.perform(
59674                   _actionBounceBack(entity.id, _startLoc)
59675               );
59676
59677           } else if (target && target.type === 'way') {
59678               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
59679               context.replace(
59680                   actionAddMidpoint({
59681                       loc: choice.loc,
59682                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
59683                   }, entity),
59684                   connectAnnotation(entity, target)
59685               );
59686
59687           } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
59688               context.replace(
59689                   actionConnect([target.id, entity.id]),
59690                   connectAnnotation(entity, target)
59691               );
59692
59693           } else if (_wasMidpoint) {
59694               context.replace(
59695                   actionNoop(),
59696                   t('operations.add.annotation.vertex')
59697               );
59698
59699           } else {
59700               context.replace(
59701                   actionNoop(),
59702                   moveAnnotation(entity)
59703               );
59704           }
59705
59706           var reselection = _restoreSelectedIDs.filter(function(id) {
59707               return context.graph().hasEntity(id);
59708           });
59709
59710           if (reselection.length) {
59711               context.enter(modeSelect(context, reselection));
59712           } else {
59713               context.enter(modeBrowse(context));
59714           }
59715       }
59716
59717
59718       function _actionBounceBack(nodeID, toLoc) {
59719           var moveNode = actionMoveNode(nodeID, toLoc);
59720           var action = function(graph, t) {
59721               // last time through, pop off the bounceback perform.
59722               // it will then overwrite the initial perform with a moveNode that does nothing
59723               if (t === 1) context.pop();
59724               return moveNode(graph, t);
59725           };
59726           action.transitionable = true;
59727           return action;
59728       }
59729
59730
59731       function cancel() {
59732           drag.cancel();
59733           context.enter(modeBrowse(context));
59734       }
59735
59736
59737       var drag = behaviorDrag()
59738           .selector('.layer-touch.points .target')
59739           .surface(select('#map').node())
59740           .origin(origin)
59741           .on('start', start)
59742           .on('move', move)
59743           .on('end', end);
59744
59745
59746       mode.enter = function() {
59747           context.install(hover);
59748           context.install(edit);
59749
59750           select(window)
59751               .on('keydown.drawWay', keydown)
59752               .on('keyup.drawWay', keyup);
59753
59754           context.history()
59755               .on('undone.drag-node', cancel);
59756       };
59757
59758
59759       mode.exit = function() {
59760           context.ui().sidebar.hover.cancel();
59761           context.uninstall(hover);
59762           context.uninstall(edit);
59763
59764           select(window)
59765               .on('keydown.hover', null)
59766               .on('keyup.hover', null);
59767
59768           context.history()
59769               .on('undone.drag-node', null);
59770
59771           _activeEntity = null;
59772
59773           context.surface()
59774               .classed('nope', false)
59775               .classed('nope-suppressed', false)
59776               .classed('nope-disabled', false)
59777               .selectAll('.active')
59778               .classed('active', false);
59779
59780           stopNudge();
59781       };
59782
59783
59784       mode.selectedIDs = function() {
59785           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
59786           // no assign
59787           return mode;
59788       };
59789
59790
59791       mode.activeID = function() {
59792           if (!arguments.length) return _activeEntity && _activeEntity.id;
59793           // no assign
59794           return mode;
59795       };
59796
59797
59798       mode.restoreSelectedIDs = function(_) {
59799           if (!arguments.length) return _restoreSelectedIDs;
59800           _restoreSelectedIDs = _;
59801           return mode;
59802       };
59803
59804
59805       mode.behavior = drag;
59806
59807
59808       return mode;
59809   }
59810
59811   function modeDragNote(context) {
59812       var mode = {
59813           id: 'drag-note',
59814           button: 'browse'
59815       };
59816
59817       var edit = behaviorEdit(context);
59818
59819       var _nudgeInterval;
59820       var _lastLoc;
59821       var _note;    // most current note.. dragged note may have stale datum.
59822
59823
59824       function startNudge(nudge) {
59825           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
59826           _nudgeInterval = window.setInterval(function() {
59827               context.pan(nudge);
59828               doMove(nudge);
59829           }, 50);
59830       }
59831
59832
59833       function stopNudge() {
59834           if (_nudgeInterval) {
59835               window.clearInterval(_nudgeInterval);
59836               _nudgeInterval = null;
59837           }
59838       }
59839
59840
59841       function origin(note) {
59842           return context.projection(note.loc);
59843       }
59844
59845
59846       function start(note) {
59847           _note = note;
59848           var osm = services.osm;
59849           if (osm) {
59850               // Get latest note from cache.. The marker may have a stale datum bound to it
59851               // and dragging it around can sometimes delete the users note comment.
59852               _note = osm.getNote(_note.id);
59853           }
59854
59855           context.surface().selectAll('.note-' + _note.id)
59856               .classed('active', true);
59857
59858           context.perform(actionNoop());
59859           context.enter(mode);
59860           context.selectedNoteID(_note.id);
59861       }
59862
59863
59864       function move() {
59865           event.sourceEvent.stopPropagation();
59866           _lastLoc = context.projection.invert(event.point);
59867
59868           doMove();
59869           var nudge = geoViewportEdge(event.point, context.map().dimensions());
59870           if (nudge) {
59871               startNudge(nudge);
59872           } else {
59873               stopNudge();
59874           }
59875       }
59876
59877
59878       function doMove(nudge) {
59879           nudge = nudge || [0, 0];
59880
59881           var currPoint = (event && event.point) || context.projection(_lastLoc);
59882           var currMouse = geoVecSubtract(currPoint, nudge);
59883           var loc = context.projection.invert(currMouse);
59884
59885           _note = _note.move(loc);
59886
59887           var osm = services.osm;
59888           if (osm) {
59889               osm.replaceNote(_note);  // update note cache
59890           }
59891
59892           context.replace(actionNoop());   // trigger redraw
59893       }
59894
59895
59896       function end() {
59897           context.replace(actionNoop());   // trigger redraw
59898
59899           context
59900               .selectedNoteID(_note.id)
59901               .enter(modeSelectNote(context, _note.id));
59902       }
59903
59904
59905       var drag = behaviorDrag()
59906           .selector('.layer-touch.markers .target.note.new')
59907           .surface(select('#map').node())
59908           .origin(origin)
59909           .on('start', start)
59910           .on('move', move)
59911           .on('end', end);
59912
59913
59914       mode.enter = function() {
59915           context.install(edit);
59916       };
59917
59918
59919       mode.exit = function() {
59920           context.ui().sidebar.hover.cancel();
59921           context.uninstall(edit);
59922
59923           context.surface()
59924               .selectAll('.active')
59925               .classed('active', false);
59926
59927           stopNudge();
59928       };
59929
59930       mode.behavior = drag;
59931
59932       return mode;
59933   }
59934
59935   function modeBrowse(context) {
59936       var mode = {
59937           button: 'browse',
59938           id: 'browse',
59939           title: t('modes.browse.title'),
59940           description: t('modes.browse.description')
59941       }, sidebar;
59942
59943       var behaviors = [
59944           behaviorPaste(context),
59945           behaviorHover(context).on('hover', context.ui().sidebar.hover),
59946           behaviorSelect(context),
59947           behaviorLasso(context),
59948           modeDragNode(context).behavior,
59949           modeDragNote(context).behavior
59950       ];
59951
59952
59953       mode.enter = function() {
59954           behaviors.forEach(context.install);
59955
59956           // Get focus on the body.
59957           if (document.activeElement && document.activeElement.blur) {
59958               document.activeElement.blur();
59959           }
59960
59961           if (sidebar) {
59962               context.ui().sidebar.show(sidebar);
59963           } else {
59964               context.ui().sidebar.select(null);
59965           }
59966       };
59967
59968
59969       mode.exit = function() {
59970           context.ui().sidebar.hover.cancel();
59971           behaviors.forEach(context.uninstall);
59972
59973           if (sidebar) {
59974               context.ui().sidebar.hide();
59975           }
59976       };
59977
59978
59979       mode.sidebar = function(_) {
59980           if (!arguments.length) return sidebar;
59981           sidebar = _;
59982           return mode;
59983       };
59984
59985
59986       return mode;
59987   }
59988
59989   function modeDrawArea(context, wayID, startGraph, baselineGraph) {
59990       var mode = {
59991           button: 'area',
59992           id: 'draw-area'
59993       };
59994
59995       var behavior;
59996
59997       mode.wayID = wayID;
59998
59999       mode.enter = function() {
60000           var way = context.entity(wayID);
60001
60002           behavior = behaviorDrawWay(context, wayID, undefined, mode, startGraph, baselineGraph)
60003               .tail(t('modes.draw_area.tail'));
60004
60005           var addNode = behavior.addNode;
60006
60007           behavior.addNode = function(node, d) {
60008               var length = way.nodes.length;
60009               var penultimate = length > 2 ? way.nodes[length - 2] : null;
60010
60011               if (node.id === way.first() || node.id === penultimate) {
60012                   behavior.finish();
60013               } else {
60014                   addNode(node, d);
60015               }
60016           };
60017
60018           context.install(behavior);
60019       };
60020
60021
60022       mode.exit = function() {
60023           context.uninstall(behavior);
60024       };
60025
60026
60027       mode.selectedIDs = function() {
60028           return [wayID];
60029       };
60030
60031
60032       mode.activeID = function() {
60033           return (behavior && behavior.activeID()) || [];
60034       };
60035
60036
60037       return mode;
60038   }
60039
60040   function modeDrawLine(context, wayID, startGraph, baselineGraph, affix, continuing) {
60041       var mode = {
60042           button: 'line',
60043           id: 'draw-line'
60044       };
60045
60046       var behavior;
60047
60048       mode.wayID = wayID;
60049
60050       mode.isContinuing = continuing;
60051
60052       mode.enter = function() {
60053           var way = context.entity(wayID);
60054           var index = (affix === 'prefix') ? 0 : undefined;
60055           var headID = (affix === 'prefix') ? way.first() : way.last();
60056
60057           behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
60058               .tail(t('modes.draw_line.tail'));
60059
60060           var addNode = behavior.addNode;
60061           behavior.addNode = function(node, d) {
60062               if (node.id === headID) {
60063                   behavior.finish();
60064               } else {
60065                   addNode(node, d);
60066               }
60067           };
60068
60069           context.install(behavior);
60070       };
60071
60072
60073       mode.exit = function() {
60074           context.uninstall(behavior);
60075       };
60076
60077
60078       mode.selectedIDs = function() {
60079           return [wayID];
60080       };
60081
60082
60083       mode.activeID = function() {
60084           return (behavior && behavior.activeID()) || [];
60085       };
60086
60087       return mode;
60088   }
60089
60090   function modeMove(context, entityIDs, baseGraph) {
60091       var mode = {
60092           id: 'move',
60093           button: 'browse'
60094       };
60095
60096       var keybinding = utilKeybinding('move');
60097       var behaviors = [
60098           behaviorEdit(context),
60099           operationCircularize(entityIDs, context).behavior,
60100           operationDelete(entityIDs, context).behavior,
60101           operationOrthogonalize(entityIDs, context).behavior,
60102           operationReflectLong(entityIDs, context).behavior,
60103           operationReflectShort(entityIDs, context).behavior,
60104           operationRotate(entityIDs, context).behavior
60105       ];
60106       var annotation = entityIDs.length === 1 ?
60107           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
60108           t('operations.move.annotation.multiple');
60109
60110       var _prevGraph;
60111       var _cache;
60112       var _origin;
60113       var _nudgeInterval;
60114
60115
60116       function doMove(nudge) {
60117           nudge = nudge || [0, 0];
60118
60119           var fn;
60120           if (_prevGraph !== context.graph()) {
60121               _cache = {};
60122               _origin = context.map().mouseCoordinates();
60123               fn = context.perform;
60124           } else {
60125               fn = context.overwrite;
60126           }
60127
60128           var currMouse = context.mouse();
60129           var origMouse = context.projection(_origin);
60130           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
60131
60132           fn(actionMove(entityIDs, delta, context.projection, _cache));
60133           _prevGraph = context.graph();
60134       }
60135
60136
60137       function startNudge(nudge) {
60138           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
60139           _nudgeInterval = window.setInterval(function() {
60140               context.pan(nudge);
60141               doMove(nudge);
60142           }, 50);
60143       }
60144
60145
60146       function stopNudge() {
60147           if (_nudgeInterval) {
60148               window.clearInterval(_nudgeInterval);
60149               _nudgeInterval = null;
60150           }
60151       }
60152
60153
60154       function move() {
60155           doMove();
60156           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
60157           if (nudge) {
60158               startNudge(nudge);
60159           } else {
60160               stopNudge();
60161           }
60162       }
60163
60164
60165       function finish() {
60166           event.stopPropagation();
60167           context.replace(actionNoop(), annotation);
60168           context.enter(modeSelect(context, entityIDs));
60169           stopNudge();
60170       }
60171
60172
60173       function cancel() {
60174           if (baseGraph) {
60175               while (context.graph() !== baseGraph) context.pop();
60176               context.enter(modeBrowse(context));
60177           } else {
60178               context.pop();
60179               context.enter(modeSelect(context, entityIDs));
60180           }
60181           stopNudge();
60182       }
60183
60184
60185       function undone() {
60186           context.enter(modeBrowse(context));
60187       }
60188
60189
60190       mode.enter = function() {
60191           _origin = context.map().mouseCoordinates();
60192           _prevGraph = null;
60193           _cache = {};
60194
60195           context.features().forceVisible(entityIDs);
60196
60197           behaviors.forEach(context.install);
60198
60199           context.surface()
60200               .on('mousemove.move', move)
60201               .on('click.move', finish);
60202
60203           context.history()
60204               .on('undone.move', undone);
60205
60206           keybinding
60207               .on('⎋', cancel)
60208               .on('↩', finish);
60209
60210           select(document)
60211               .call(keybinding);
60212       };
60213
60214
60215       mode.exit = function() {
60216           stopNudge();
60217
60218           behaviors.forEach(function(behavior) {
60219               context.uninstall(behavior);
60220           });
60221
60222           context.surface()
60223               .on('mousemove.move', null)
60224               .on('click.move', null);
60225
60226           context.history()
60227               .on('undone.move', null);
60228
60229           select(document)
60230               .call(keybinding.unbind);
60231
60232           context.features().forceVisible([]);
60233       };
60234
60235
60236       mode.selectedIDs = function() {
60237           if (!arguments.length) return entityIDs;
60238           // no assign
60239           return mode;
60240       };
60241
60242
60243       return mode;
60244   }
60245
60246   function modeRotate(context, entityIDs) {
60247       var mode = {
60248           id: 'rotate',
60249           button: 'browse'
60250       };
60251
60252       var keybinding = utilKeybinding('rotate');
60253       var behaviors = [
60254           behaviorEdit(context),
60255           operationCircularize(entityIDs, context).behavior,
60256           operationDelete(entityIDs, context).behavior,
60257           operationMove(entityIDs, context).behavior,
60258           operationOrthogonalize(entityIDs, context).behavior,
60259           operationReflectLong(entityIDs, context).behavior,
60260           operationReflectShort(entityIDs, context).behavior
60261       ];
60262       var annotation = entityIDs.length === 1 ?
60263           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
60264           t('operations.rotate.annotation.multiple');
60265
60266       var _prevGraph;
60267       var _prevAngle;
60268       var _prevTransform;
60269       var _pivot;
60270
60271
60272       function doRotate() {
60273           var fn;
60274           if (context.graph() !== _prevGraph) {
60275               fn = context.perform;
60276           } else {
60277               fn = context.replace;
60278           }
60279
60280           // projection changed, recalculate _pivot
60281           var projection = context.projection;
60282           var currTransform = projection.transform();
60283           if (!_prevTransform ||
60284               currTransform.k !== _prevTransform.k ||
60285               currTransform.x !== _prevTransform.x ||
60286               currTransform.y !== _prevTransform.y) {
60287
60288               var nodes = utilGetAllNodes(entityIDs, context.graph());
60289               var points = nodes.map(function(n) { return projection(n.loc); });
60290
60291               if (points.length === 1) {  // degenerate case
60292                   _pivot = points[0];
60293               } else if (points.length === 2) {
60294                   _pivot = geoVecInterp(points[0], points[1], 0.5);
60295               } else {
60296                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
60297               }
60298               _prevAngle = undefined;
60299           }
60300
60301
60302           var currMouse = context.mouse();
60303           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
60304
60305           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
60306           var delta = currAngle - _prevAngle;
60307
60308           fn(actionRotate(entityIDs, _pivot, delta, projection));
60309
60310           _prevTransform = currTransform;
60311           _prevAngle = currAngle;
60312           _prevGraph = context.graph();
60313       }
60314
60315
60316       function finish() {
60317           event.stopPropagation();
60318           context.replace(actionNoop(), annotation);
60319           context.enter(modeSelect(context, entityIDs));
60320       }
60321
60322
60323       function cancel() {
60324           context.pop();
60325           context.enter(modeSelect(context, entityIDs));
60326       }
60327
60328
60329       function undone() {
60330           context.enter(modeBrowse(context));
60331       }
60332
60333
60334       mode.enter = function() {
60335           context.features().forceVisible(entityIDs);
60336
60337           behaviors.forEach(context.install);
60338
60339           context.surface()
60340               .on('mousemove.rotate', doRotate)
60341               .on('click.rotate', finish);
60342
60343           context.history()
60344               .on('undone.rotate', undone);
60345
60346           keybinding
60347               .on('⎋', cancel)
60348               .on('↩', finish);
60349
60350           select(document)
60351               .call(keybinding);
60352       };
60353
60354
60355       mode.exit = function() {
60356           behaviors.forEach(context.uninstall);
60357
60358           context.surface()
60359               .on('mousemove.rotate', null)
60360               .on('click.rotate', null);
60361
60362           context.history()
60363               .on('undone.rotate', null);
60364
60365           select(document)
60366               .call(keybinding.unbind);
60367
60368           context.features().forceVisible([]);
60369       };
60370
60371
60372       mode.selectedIDs = function() {
60373           if (!arguments.length) return entityIDs;
60374           // no assign
60375           return mode;
60376       };
60377
60378
60379       return mode;
60380   }
60381
60382   var _isSaving = false;
60383
60384
60385   function modeSave(context) {
60386       var mode = { id: 'save' };
60387       var keybinding = utilKeybinding('modeSave');
60388
60389       var loading = uiLoading(context)
60390           .message(t('save.uploading'))
60391           .blocking(true);
60392
60393       var commit = uiCommit(context)
60394           .on('cancel', cancel)
60395           .on('save', save);
60396
60397       var _toCheck = [];
60398       var _toLoad = [];
60399       var _loaded = {};
60400       var _toLoadCount = 0;
60401       var _toLoadTotal = 0;
60402
60403       var _conflicts = [];
60404       var _errors = [];
60405       var _origChanges;
60406       var _location;
60407
60408
60409       function cancel(selectedID) {
60410           if (selectedID) {
60411               context.enter(modeSelect(context, [selectedID]));
60412           } else {
60413               context.enter(modeBrowse(context));
60414           }
60415       }
60416
60417
60418       function save(changeset, tryAgain, checkConflicts) {
60419           // Guard against accidentally entering save code twice - #4641
60420           if (_isSaving && !tryAgain) {
60421               return;
60422           }
60423
60424           var osm = context.connection();
60425           if (!osm) {
60426               cancel();
60427               return;
60428           }
60429
60430           // If user somehow got logged out mid-save, try to reauthenticate..
60431           // This can happen if they were logged in from before, but the tokens are no longer valid.
60432           if (!osm.authenticated()) {
60433               osm.authenticate(function(err) {
60434                   if (err) {
60435                       cancel();   // quit save mode..
60436                   } else {
60437                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
60438                   }
60439               });
60440               return;
60441           }
60442
60443           if (!_isSaving) {
60444               keybindingOff();
60445               context.container().call(loading);  // block input
60446               _isSaving = true;
60447           }
60448
60449           var history = context.history();
60450           var localGraph = context.graph();
60451           var remoteGraph = coreGraph(history.base(), true);
60452
60453           _conflicts = [];
60454           _errors = [];
60455
60456           // Store original changes, in case user wants to download them as an .osc file
60457           _origChanges = history.changes(actionDiscardTags(history.difference()));
60458
60459           // First time, `history.perform` a no-op action.
60460           // Any conflict resolutions will be done as `history.replace`
60461           if (!tryAgain) {
60462               history.perform(actionNoop());
60463           }
60464
60465           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
60466           if (!checkConflicts) {
60467               upload(changeset);
60468
60469           // Do the full (slow) conflict check..
60470           } else {
60471               var modified = filter(history.difference().summary(), { changeType: 'modified' });
60472               _toCheck = map$3(map$3(modified, 'entity'), 'id');
60473               _toLoad = withChildNodes(_toCheck, localGraph);
60474               _loaded = {};
60475               _toLoadCount = 0;
60476               _toLoadTotal = _toLoad.length;
60477
60478               if (_toCheck.length) {
60479                   showProgress(_toLoadCount, _toLoadTotal);
60480                   _toLoad.forEach(function(id) { _loaded[id] = false; });
60481                   osm.loadMultiple(_toLoad, loaded);
60482               } else {
60483                   upload(changeset);
60484               }
60485           }
60486
60487           return;
60488
60489
60490           function withChildNodes(ids, graph) {
60491               return uniq(reduce(ids, function(result, id) {
60492                   var entity = graph.entity(id);
60493                   if (entity.type === 'way') {
60494                       try {
60495                           var children = graph.childNodes(entity);
60496                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
60497                       } catch (err) {
60498                           /* eslint-disable no-console */
60499                           if (typeof console !== 'undefined') console.error(err);
60500                           /* eslint-enable no-console */
60501                       }
60502                   }
60503                   return result;
60504               }, clone(ids)));
60505           }
60506
60507
60508           // Reload modified entities into an alternate graph and check for conflicts..
60509           function loaded(err, result) {
60510               if (_errors.length) return;
60511
60512               if (err) {
60513                   _errors.push({
60514                       msg: err.message || err.responseText,
60515                       details: [ t('save.status_code', { code: err.status }) ]
60516                   });
60517                   showErrors();
60518
60519               } else {
60520                   var loadMore = [];
60521
60522                   result.data.forEach(function(entity) {
60523                       remoteGraph.replace(entity);
60524                       _loaded[entity.id] = true;
60525                       _toLoad = without(_toLoad, entity.id);
60526
60527                       if (!entity.visible) return;
60528
60529                       // Because loadMultiple doesn't download /full like loadEntity,
60530                       // need to also load children that aren't already being checked..
60531                       var i, id;
60532                       if (entity.type === 'way') {
60533                           for (i = 0; i < entity.nodes.length; i++) {
60534                               id = entity.nodes[i];
60535                               if (_loaded[id] === undefined) {
60536                                   _loaded[id] = false;
60537                                   loadMore.push(id);
60538                               }
60539                           }
60540                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
60541                           for (i = 0; i < entity.members.length; i++) {
60542                               id = entity.members[i].id;
60543                               if (_loaded[id] === undefined) {
60544                                   _loaded[id] = false;
60545                                   loadMore.push(id);
60546                               }
60547                           }
60548                       }
60549                   });
60550
60551                   _toLoadCount += result.data.length;
60552                   _toLoadTotal += loadMore.length;
60553                   showProgress(_toLoadCount, _toLoadTotal);
60554
60555                   if (loadMore.length) {
60556                       _toLoad.push.apply(_toLoad, loadMore);
60557                       osm.loadMultiple(loadMore, loaded);
60558                   }
60559
60560                   if (!_toLoad.length) {
60561                       detectConflicts();
60562                   }
60563               }
60564           }
60565
60566
60567           function detectConflicts() {
60568               function choice(id, text, action) {
60569                   return { id: id, text: text, action: function() { history.replace(action); } };
60570               }
60571               function formatUser(d) {
60572                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
60573               }
60574               function entityName(entity) {
60575                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
60576               }
60577
60578               function sameVersions(local, remote) {
60579                   if (local.version !== remote.version) return false;
60580
60581                   if (local.type === 'way') {
60582                       var children = union(local.nodes, remote.nodes);
60583                       for (var i = 0; i < children.length; i++) {
60584                           var a = localGraph.hasEntity(children[i]);
60585                           var b = remoteGraph.hasEntity(children[i]);
60586                           if (a && b && a.version !== b.version) return false;
60587                       }
60588                   }
60589
60590                   return true;
60591               }
60592
60593               _toCheck.forEach(function(id) {
60594                   var local = localGraph.entity(id);
60595                   var remote = remoteGraph.entity(id);
60596
60597                   if (sameVersions(local, remote)) return;
60598
60599                   var action = actionMergeRemoteChanges;
60600                   var merge = action(id, localGraph, remoteGraph, formatUser);
60601
60602                   history.replace(merge);
60603
60604                   var mergeConflicts = merge.conflicts();
60605                   if (!mergeConflicts.length) return;  // merged safely
60606
60607                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
60608                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
60609                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
60610                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
60611
60612                   _conflicts.push({
60613                       id: id,
60614                       name: entityName(local),
60615                       details: mergeConflicts,
60616                       chosen: 1,
60617                       choices: [
60618                           choice(id, keepMine, forceLocal),
60619                           choice(id, keepTheirs, forceRemote)
60620                       ]
60621                   });
60622               });
60623
60624               upload(changeset);
60625           }
60626       }
60627
60628
60629       function upload(changeset) {
60630           var osm = context.connection();
60631           if (!osm) {
60632               _errors.push({ msg: 'No OSM Service' });
60633           }
60634
60635           if (_conflicts.length) {
60636               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
60637               showConflicts(changeset);
60638
60639           } else if (_errors.length) {
60640               showErrors();
60641
60642           } else {
60643               var history = context.history();
60644               var changes = history.changes(actionDiscardTags(history.difference()));
60645               if (changes.modified.length || changes.created.length || changes.deleted.length) {
60646                   loadLocation();  // so it is ready when we display the save screen
60647                   osm.putChangeset(changeset, changes, uploadCallback);
60648               } else {        // changes were insignificant or reverted by user
60649                   select('.inspector-wrap *').remove();
60650                   loading.close();
60651                   _isSaving = false;
60652                   context.flush();
60653                   cancel();
60654               }
60655           }
60656       }
60657
60658
60659       function uploadCallback(err, changeset) {
60660           if (err) {
60661               if (err.status === 409) {          // 409 Conflict
60662                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
60663               } else {
60664                   _errors.push({
60665                       msg: err.message || err.responseText,
60666                       details: [ t('save.status_code', { code: err.status }) ]
60667                   });
60668                   showErrors();
60669               }
60670
60671           } else {
60672               context.history().clearSaved();
60673               success(changeset);
60674               // Add delay to allow for postgres replication #1646 #2678
60675               window.setTimeout(function() {
60676                   select('.inspector-wrap *').remove();
60677                   loading.close();
60678                   _isSaving = false;
60679                   context.flush();
60680               }, 2500);
60681           }
60682       }
60683
60684
60685       function showProgress(num, total) {
60686           var modal = context.container().select('.loading-modal .modal-section');
60687           var progress = modal.selectAll('.progress')
60688               .data([0]);
60689
60690           // enter/update
60691           progress.enter()
60692               .append('div')
60693               .attr('class', 'progress')
60694               .merge(progress)
60695               .text(t('save.conflict_progress', { num: num, total: total }));
60696       }
60697
60698
60699       function showConflicts(changeset) {
60700           var history = context.history();
60701           var selection = context.container()
60702               .select('#sidebar')
60703               .append('div')
60704               .attr('class','sidebar-component');
60705
60706           loading.close();
60707           _isSaving = false;
60708
60709           var ui = uiConflicts(context)
60710               .conflictList(_conflicts)
60711               .origChanges(_origChanges)
60712               .on('cancel', function() {
60713                   history.pop();
60714                   selection.remove();
60715                   keybindingOn();
60716               })
60717               .on('save', function() {
60718                   for (var i = 0; i < _conflicts.length; i++) {
60719                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
60720                           var entity = context.hasEntity(_conflicts[i].id);
60721                           if (entity && entity.type === 'way') {
60722                               var children = uniq(entity.nodes);
60723                               for (var j = 0; j < children.length; j++) {
60724                                   history.replace(actionRevert(children[j]));
60725                               }
60726                           }
60727                           history.replace(actionRevert(_conflicts[i].id));
60728                       }
60729                   }
60730
60731                   selection.remove();
60732                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
60733               });
60734
60735           selection.call(ui);
60736       }
60737
60738
60739       function showErrors() {
60740           keybindingOn();
60741           context.history().pop();
60742           loading.close();
60743           _isSaving = false;
60744
60745           var selection = uiConfirm(context.container());
60746           selection
60747               .select('.modal-section.header')
60748               .append('h3')
60749               .text(t('save.error'));
60750
60751           addErrors(selection, _errors);
60752           selection.okButton();
60753       }
60754
60755
60756       function addErrors(selection, data) {
60757           var message = selection
60758               .select('.modal-section.message-text');
60759
60760           var items = message
60761               .selectAll('.error-container')
60762               .data(data);
60763
60764           var enter = items.enter()
60765               .append('div')
60766               .attr('class', 'error-container');
60767
60768           enter
60769               .append('a')
60770               .attr('class', 'error-description')
60771               .attr('href', '#')
60772               .classed('hide-toggle', true)
60773               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
60774               .on('click', function() {
60775                   event.preventDefault();
60776
60777                   var error = select(this);
60778                   var detail = select(this.nextElementSibling);
60779                   var exp = error.classed('expanded');
60780
60781                   detail.style('display', exp ? 'none' : 'block');
60782                   error.classed('expanded', !exp);
60783               });
60784
60785           var details = enter
60786               .append('div')
60787               .attr('class', 'error-detail-container')
60788               .style('display', 'none');
60789
60790           details
60791               .append('ul')
60792               .attr('class', 'error-detail-list')
60793               .selectAll('li')
60794               .data(function(d) { return d.details || []; })
60795               .enter()
60796               .append('li')
60797               .attr('class', 'error-detail-item')
60798               .text(function(d) { return d; });
60799
60800           items.exit()
60801               .remove();
60802       }
60803
60804
60805       function success(changeset) {
60806           commit.reset();
60807
60808           var ui = uiSuccess(context)
60809               .changeset(changeset)
60810               .location(_location)
60811               .on('cancel', function() { context.ui().sidebar.hide(); });
60812
60813           context.enter(modeBrowse(context).sidebar(ui));
60814       }
60815
60816
60817       function keybindingOn() {
60818           select(document)
60819               .call(keybinding.on('⎋', cancel, true));
60820       }
60821
60822
60823       function keybindingOff() {
60824           select(document)
60825               .call(keybinding.unbind);
60826       }
60827
60828
60829       // Reverse geocode current map location so we can display a message on
60830       // the success screen like "Thank you for editing around city, state."
60831       function loadLocation() {
60832           _location = null;
60833           if (!services.geocoder) return;
60834
60835           services.geocoder.reverse(context.map().center(), function(err, result) {
60836               if (err || !result || !result.address) return;
60837
60838               var parts = [];
60839               var addr = result.address;
60840               var city = addr && (addr.town || addr.city || addr.county);
60841               if (city) parts.push(city);
60842               var region = addr && (addr.state || addr.country);
60843               if (region) parts.push(region);
60844
60845               _location = parts.join(', ');
60846           });
60847       }
60848
60849
60850       mode.enter = function() {
60851           // Show sidebar
60852           context.ui().sidebar.expand();
60853
60854           function done() {
60855               context.ui().sidebar.show(commit);
60856           }
60857
60858           keybindingOn();
60859
60860           context.container().selectAll('#content')
60861               .attr('class', 'inactive');
60862
60863           var osm = context.connection();
60864           if (!osm) {
60865               cancel();
60866               return;
60867           }
60868
60869           if (osm.authenticated()) {
60870               done();
60871           } else {
60872               osm.authenticate(function(err) {
60873                   if (err) {
60874                       cancel();
60875                   } else {
60876                       done();
60877                   }
60878               });
60879           }
60880       };
60881
60882
60883       mode.exit = function() {
60884           _isSaving = false;
60885
60886           keybindingOff();
60887
60888           context.container().selectAll('#content')
60889               .attr('class', 'active');
60890
60891           context.ui().sidebar.hide();
60892       };
60893
60894       return mode;
60895   }
60896
60897   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
60898   // For example, ⌘Z -> Ctrl+Z
60899   var uiCmd = function (code) {
60900       var detected = utilDetect();
60901
60902       if (detected.os === 'mac') {
60903           return code;
60904       }
60905
60906       if (detected.os === 'win') {
60907           if (code === '⌘⇧Z') return 'Ctrl+Y';
60908       }
60909
60910       var result = '',
60911           replacements = {
60912               '⌘': 'Ctrl',
60913               '⇧': 'Shift',
60914               '⌥': 'Alt',
60915               '⌫': 'Backspace',
60916               '⌦': 'Delete'
60917           };
60918
60919       for (var i = 0; i < code.length; i++) {
60920           if (code[i] in replacements) {
60921               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
60922           } else {
60923               result += code[i];
60924           }
60925       }
60926
60927       return result;
60928   };
60929
60930
60931   // return a display-focused string for a given keyboard code
60932   uiCmd.display = function(code) {
60933       if (code.length !== 1) return code;
60934
60935       var detected = utilDetect();
60936       var mac = (detected.os === 'mac');
60937       var replacements = {
60938           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
60939           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
60940           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
60941           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
60942           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
60943           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
60944           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
60945           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
60946           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
60947           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
60948           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
60949           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
60950       };
60951
60952       return replacements[code] || code;
60953   };
60954
60955   var _relatedParent;
60956
60957
60958   function modeSelect(context, selectedIDs) {
60959       var mode = {
60960           id: 'select',
60961           button: 'browse'
60962       };
60963
60964       var keybinding = utilKeybinding('select');
60965       var timeout = null;
60966       var behaviors = [
60967           behaviorCopy(context),
60968           behaviorPaste(context),
60969           behaviorBreathe(context),
60970           behaviorHover(context),
60971           behaviorSelect(context),
60972           behaviorLasso(context),
60973           modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
60974           modeDragNote(context).behavior
60975       ];
60976       var editMenu;
60977       var newFeature = false;
60978       var suppressMenu = true;
60979       var follow = false;
60980
60981
60982       var wrap = context.container()
60983           .select('.inspector-wrap');
60984
60985
60986       function singular() {
60987           if (selectedIDs.length === 1) {
60988               return context.hasEntity(selectedIDs[0]);
60989           }
60990       }
60991
60992
60993       function checkSelectedIDs() {
60994           var ids = [];
60995           if (Array.isArray(selectedIDs)) {
60996               ids = selectedIDs.filter(function(id) {
60997                   return context.hasEntity(id);
60998               });
60999           }
61000
61001           if (ids.length) {
61002               selectedIDs = ids;
61003           } else {
61004               context.enter(modeBrowse(context));
61005           }
61006           return !!ids.length;
61007       }
61008
61009
61010       // find the common parent ways for nextVertex, previousVertex
61011       function commonParents() {
61012           var graph = context.graph();
61013           var commonParents = [];
61014
61015           for (var i = 0; i < selectedIDs.length; i++) {
61016               var entity = context.hasEntity(selectedIDs[i]);
61017               if (!entity || entity.geometry(graph) !== 'vertex') {
61018                   return [];  // selection includes some not vertexes
61019               }
61020
61021               var currParents = map$3(graph.parentWays(entity), 'id');
61022               if (!commonParents.length) {
61023                   commonParents = currParents;
61024                   continue;
61025               }
61026
61027               commonParents = intersection(commonParents, currParents);
61028               if (!commonParents.length) {
61029                   return [];
61030               }
61031           }
61032
61033           return commonParents;
61034       }
61035
61036
61037       function singularParent() {
61038           var parents = commonParents();
61039           if (!parents || parents.length === 0) {
61040               _relatedParent = null;
61041               return null;
61042           }
61043
61044           // relatedParent is used when we visit a vertex with multiple
61045           // parents, and we want to remember which parent line we started on.
61046
61047           if (parents.length === 1) {
61048               _relatedParent = parents[0];  // remember this parent for later
61049               return _relatedParent;
61050           }
61051
61052           if (parents.indexOf(_relatedParent) !== -1) {
61053               return _relatedParent;   // prefer the previously seen parent
61054           }
61055
61056           return parents[0];
61057       }
61058
61059
61060       function closeMenu() {
61061           if (editMenu) {
61062               context.surface().call(editMenu.close);
61063           }
61064       }
61065
61066
61067       function positionMenu() {
61068           if (!editMenu) { return; }
61069
61070           var entity = singular();
61071           if (entity && context.geometry(entity.id) === 'relation') {
61072               suppressMenu = true;
61073           } else {
61074               var point = context.mouse();
61075               var viewport = geoExtent(context.projection.clipExtent()).polygon();
61076
61077               if (point && geoPointInPolygon(point, viewport)) {
61078                   editMenu.center(point);
61079               } else {
61080                   suppressMenu = true;
61081               }
61082           }
61083       }
61084
61085
61086       function showMenu() {
61087           closeMenu();
61088           if (editMenu) {
61089               context.surface().call(editMenu);
61090           }
61091       }
61092
61093
61094       function toggleMenu() {
61095           // deprecation warning - Radial Menu to be removed in iD v3
61096           if (select('.edit-menu, .radial-menu').empty()) {
61097               positionMenu();
61098               showMenu();
61099           } else {
61100               closeMenu();
61101           }
61102       }
61103
61104
61105       mode.selectedIDs = function() {
61106           return selectedIDs;
61107       };
61108
61109
61110       mode.zoomToSelected = function() {
61111           var entity = singular();
61112           if (entity) {
61113               context.map().zoomToEase(entity);
61114           }
61115       };
61116
61117
61118       mode.reselect = function() {
61119           if (!checkSelectedIDs()) return;
61120
61121           var surfaceNode = context.surface().node();
61122           if (surfaceNode.focus) {   // FF doesn't support it
61123               surfaceNode.focus();
61124           }
61125
61126           positionMenu();
61127           if (!suppressMenu) {
61128               showMenu();
61129           }
61130       };
61131
61132
61133       mode.newFeature = function(_) {
61134           if (!arguments.length) return newFeature;
61135           newFeature = _;
61136           return mode;
61137       };
61138
61139
61140       mode.suppressMenu = function(_) {
61141           if (!arguments.length) return suppressMenu;
61142           suppressMenu = _;
61143           return mode;
61144       };
61145
61146
61147       mode.follow = function(_) {
61148           if (!arguments.length) return follow;
61149           follow = _;
61150           return mode;
61151       };
61152
61153
61154       mode.enter = function() {
61155           if (!checkSelectedIDs()) return;
61156
61157           context.features().forceVisible(selectedIDs);
61158
61159           var operations = without(values$1(Operations), operationDelete)
61160               .map(function(o) { return o(selectedIDs, context); })
61161               .filter(function(o) { return o.available(); });
61162
61163           // deprecation warning - Radial Menu to be removed in iD v3
61164           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
61165           if (isRadialMenu) {
61166               operations = operations.slice(0,7);
61167               operations.unshift(operationDelete(selectedIDs, context));
61168           } else {
61169               operations.push(operationDelete(selectedIDs, context));
61170           }
61171
61172           operations.forEach(function(operation) {
61173               if (operation.behavior) {
61174                   behaviors.push(operation.behavior);
61175               }
61176           });
61177
61178           behaviors.forEach(context.install);
61179
61180           keybinding
61181               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61182               .on(['[', 'pgup'], previousVertex)
61183               .on([']', 'pgdown'], nextVertex)
61184               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
61185               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
61186               .on(['\\', 'pause'], nextParent)
61187               .on('⎋', esc, true)
61188               .on('space', toggleMenu);
61189
61190           select(document)
61191               .call(keybinding);
61192
61193
61194           // deprecation warning - Radial Menu to be removed in iD v3
61195           editMenu = isRadialMenu
61196               ? uiRadialMenu(context, operations)
61197               : uiEditMenu(context, operations);
61198
61199           context.ui().sidebar
61200               .select(singular() ? singular().id : null, newFeature);
61201
61202           context.history()
61203               .on('undone.select', update)
61204               .on('redone.select', update);
61205
61206           context.map()
61207               .on('move.select', closeMenu)
61208               .on('drawn.select', selectElements);
61209
61210           context.surface()
61211               .on('dblclick.select', dblclick);
61212
61213
61214           selectElements();
61215
61216           if (selectedIDs.length > 1) {
61217               var entities = uiSelectionList(context, selectedIDs);
61218               context.ui().sidebar.show(entities);
61219           }
61220
61221           if (follow) {
61222               var extent = geoExtent();
61223               var graph = context.graph();
61224               selectedIDs.forEach(function(id) {
61225                   var entity = context.entity(id);
61226                   extent._extend(entity.extent(graph));
61227               });
61228
61229               var loc = extent.center();
61230               context.map().centerEase(loc);
61231           } else if (singular() && singular().type === 'way') {
61232               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
61233           }
61234
61235           timeout = window.setTimeout(function() {
61236               positionMenu();
61237               if (!suppressMenu) {
61238                   showMenu();
61239               }
61240           }, 270);  /* after any centerEase completes */
61241
61242
61243           function update() {
61244               closeMenu();
61245               checkSelectedIDs();
61246           }
61247
61248
61249           function dblclick() {
61250               var target = select(event.target);
61251
61252               var datum = target.datum();
61253               var entity = datum && datum.properties && datum.properties.entity;
61254               if (!entity) return;
61255
61256               if (entity instanceof osmWay && target.classed('target')) {
61257                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
61258                   var prev = entity.nodes[choice.index - 1];
61259                   var next = entity.nodes[choice.index];
61260
61261                   context.perform(
61262                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
61263                       t('operations.add.annotation.vertex')
61264                   );
61265
61266                   event.preventDefault();
61267                   event.stopPropagation();
61268
61269               } else if (entity.type === 'midpoint') {
61270                   context.perform(
61271                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
61272                       t('operations.add.annotation.vertex'));
61273
61274                   event.preventDefault();
61275                   event.stopPropagation();
61276               }
61277           }
61278
61279
61280           function selectElements(drawn) {
61281               if (!checkSelectedIDs()) return;
61282
61283               var surface = context.surface();
61284               var entity = singular();
61285
61286               if (entity && context.geometry(entity.id) === 'relation') {
61287                   suppressMenu = true;
61288                   return;
61289               }
61290
61291               surface.selectAll('.related')
61292                   .classed('related', false);
61293
61294               singularParent();
61295               if (_relatedParent) {
61296                   surface.selectAll(utilEntitySelector([_relatedParent]))
61297                       .classed('related', true);
61298               }
61299
61300               var selection = context.surface()
61301                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
61302
61303               if (selection.empty()) {
61304                   // Return to browse mode if selected DOM elements have
61305                   // disappeared because the user moved them out of view..
61306                   var source = event && event.type === 'zoom' && event.sourceEvent;
61307                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61308                       context.enter(modeBrowse(context));
61309                   }
61310               } else {
61311                   selection
61312                       .classed('selected', true);
61313               }
61314           }
61315
61316
61317           function esc() {
61318               if (select('.combobox').size()) return;
61319               context.enter(modeBrowse(context));
61320           }
61321
61322
61323           function firstVertex() {
61324               event.preventDefault();
61325               var entity = singular();
61326               var parent = singularParent();
61327               var way;
61328
61329               if (entity && entity.type === 'way') {
61330                   way = entity;
61331               } else if (parent) {
61332                   way = context.entity(parent);
61333               }
61334
61335               if (way) {
61336                   context.enter(
61337                       modeSelect(context, [way.first()]).follow(true)
61338                   );
61339               }
61340           }
61341
61342
61343           function lastVertex() {
61344               event.preventDefault();
61345               var entity = singular();
61346               var parent = singularParent();
61347               var way;
61348
61349               if (entity && entity.type === 'way') {
61350                   way = entity;
61351               } else if (parent) {
61352                   way = context.entity(parent);
61353               }
61354
61355               if (way) {
61356                   context.enter(
61357                       modeSelect(context, [way.last()]).follow(true)
61358                   );
61359               }
61360           }
61361
61362
61363           function previousVertex() {
61364               event.preventDefault();
61365               var parent = singularParent();
61366               if (!parent) return;
61367
61368               var way = context.entity(parent);
61369               var length = way.nodes.length;
61370               var curr = way.nodes.indexOf(selectedIDs[0]);
61371               var index = -1;
61372
61373               if (curr > 0) {
61374                   index = curr - 1;
61375               } else if (way.isClosed()) {
61376                   index = length - 2;
61377               }
61378
61379               if (index !== -1) {
61380                   context.enter(
61381                       modeSelect(context, [way.nodes[index]]).follow(true)
61382                   );
61383               }
61384           }
61385
61386
61387           function nextVertex() {
61388               event.preventDefault();
61389               var parent = singularParent();
61390               if (!parent) return;
61391
61392               var way = context.entity(parent);
61393               var length = way.nodes.length;
61394               var curr = way.nodes.indexOf(selectedIDs[0]);
61395               var index = -1;
61396
61397               if (curr < length - 1) {
61398                   index = curr + 1;
61399               } else if (way.isClosed()) {
61400                   index = 0;
61401               }
61402
61403               if (index !== -1) {
61404                   context.enter(
61405                       modeSelect(context, [way.nodes[index]]).follow(true)
61406                   );
61407               }
61408           }
61409
61410
61411           function nextParent() {
61412               event.preventDefault();
61413               var parents = uniq(commonParents());
61414               if (!parents || parents.length < 2) return;
61415
61416               var index = parents.indexOf(_relatedParent);
61417               if (index < 0 || index > parents.length - 2) {
61418                   _relatedParent = parents[0];
61419               } else {
61420                   _relatedParent = parents[index + 1];
61421               }
61422
61423               var surface = context.surface();
61424               surface.selectAll('.related')
61425                   .classed('related', false);
61426
61427               if (_relatedParent) {
61428                   surface.selectAll(utilEntitySelector([_relatedParent]))
61429                       .classed('related', true);
61430               }
61431           }
61432       };
61433
61434
61435       mode.exit = function() {
61436           if (timeout) window.clearTimeout(timeout);
61437
61438           behaviors.forEach(context.uninstall);
61439
61440           select(document)
61441               .call(keybinding.unbind);
61442
61443           closeMenu();
61444           editMenu = undefined;
61445
61446           context.history()
61447               .on('undone.select', null)
61448               .on('redone.select', null);
61449
61450           var surface = context.surface();
61451
61452           surface
61453               .on('dblclick.select', null);
61454
61455           surface
61456               .selectAll('.selected')
61457               .classed('selected', false);
61458
61459           surface
61460               .selectAll('.related')
61461               .classed('related', false);
61462
61463           context.map().on('drawn.select', null);
61464           context.ui().sidebar.hide();
61465           context.features().forceVisible([]);
61466       };
61467
61468
61469       return mode;
61470   }
61471
61472   function modeSelectData(context, selectedDatum) {
61473       var mode = {
61474           id: 'select-data',
61475           button: 'browse'
61476       };
61477
61478       var keybinding = utilKeybinding('select-data');
61479       var dataEditor = uiDataEditor(context);
61480
61481       var behaviors = [
61482           behaviorBreathe(context),
61483           behaviorHover(context),
61484           behaviorSelect(context),
61485           behaviorLasso(context),
61486           modeDragNode(context).behavior,
61487           modeDragNote(context).behavior
61488       ];
61489
61490
61491       // class the data as selected, or return to browse mode if the data is gone
61492       function selectData(drawn) {
61493           var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
61494
61495           if (selection.empty()) {
61496               // Return to browse mode if selected DOM elements have
61497               // disappeared because the user moved them out of view..
61498               var source = event && event.type === 'zoom' && event.sourceEvent;
61499               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61500                   context.enter(modeBrowse(context));
61501               }
61502           } else {
61503               selection.classed('selected', true);
61504           }
61505       }
61506
61507
61508       function esc() {
61509           if (select('.combobox').size()) return;
61510           context.enter(modeBrowse(context));
61511       }
61512
61513
61514       mode.zoomToSelected = function() {
61515           var extent = geoExtent(d3_geoBounds(selectedDatum));
61516           context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
61517       };
61518
61519
61520       mode.enter = function() {
61521           behaviors.forEach(context.install);
61522
61523           keybinding
61524               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61525               .on('⎋', esc, true);
61526
61527           select(document)
61528               .call(keybinding);
61529
61530           selectData();
61531
61532           var sidebar = context.ui().sidebar;
61533           sidebar.show(dataEditor.datum(selectedDatum));
61534
61535           // expand the sidebar, avoid obscuring the data if needed
61536           var extent = geoExtent(d3_geoBounds(selectedDatum));
61537           sidebar.expand(sidebar.intersects(extent));
61538
61539           context.map()
61540               .on('drawn.select-data', selectData);
61541       };
61542
61543
61544       mode.exit = function() {
61545           behaviors.forEach(context.uninstall);
61546
61547           select(document)
61548               .call(keybinding.unbind);
61549
61550           context.surface()
61551               .selectAll('.layer-mapdata .selected')
61552               .classed('selected hover', false);
61553
61554           context.map()
61555               .on('drawn.select-data', null);
61556
61557           context.ui().sidebar
61558               .hide();
61559       };
61560
61561
61562       return mode;
61563   }
61564
61565   function modeSelectError(context, selectedErrorID, selectedErrorService) {
61566       var mode = {
61567           id: 'select-error',
61568           button: 'browse'
61569       };
61570
61571       var keybinding = utilKeybinding('select-error');
61572
61573       var errorService = services[selectedErrorService];
61574       var errorEditor;
61575       switch (selectedErrorService) {
61576           case 'improveOSM':
61577               errorEditor = uiImproveOsmEditor(context)
61578               .on('change', function() {
61579                   context.map().pan([0,0]);  // trigger a redraw
61580                   var error = checkSelectedID();
61581                   if (!error) return;
61582                   context.ui().sidebar
61583                       .show(errorEditor.error(error));
61584               });
61585               break;
61586           case 'keepRight':
61587               errorEditor = uiKeepRightEditor(context)
61588               .on('change', function() {
61589                   context.map().pan([0,0]);  // trigger a redraw
61590                   var error = checkSelectedID();
61591                   if (!error) return;
61592                   context.ui().sidebar
61593                       .show(errorEditor.error(error));
61594               });
61595               break;
61596       }
61597
61598
61599       var behaviors = [
61600           behaviorBreathe(context),
61601           behaviorHover(context),
61602           behaviorSelect(context),
61603           behaviorLasso(context),
61604           modeDragNode(context).behavior,
61605           modeDragNote(context).behavior
61606       ];
61607
61608
61609       function checkSelectedID() {
61610           if (!errorService) return;
61611           var error = errorService.getError(selectedErrorID);
61612           if (!error) {
61613               context.enter(modeBrowse(context));
61614           }
61615           return error;
61616       }
61617
61618
61619       mode.zoomToSelected = function() {
61620           if (!errorService) return;
61621           var error = errorService.getError(selectedErrorID);
61622           if (error) {
61623               context.map().centerZoomEase(error.loc, 20);
61624           }
61625       };
61626
61627
61628       mode.enter = function() {
61629           var error = checkSelectedID();
61630           if (!error) return;
61631
61632           behaviors.forEach(context.install);
61633           keybinding
61634               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61635               .on('⎋', esc, true);
61636
61637           select(document)
61638               .call(keybinding);
61639
61640           selectError();
61641
61642           var sidebar = context.ui().sidebar;
61643           sidebar.show(errorEditor.error(error));
61644
61645           context.map()
61646               .on('drawn.select-error', selectError);
61647
61648
61649           // class the error as selected, or return to browse mode if the error is gone
61650           function selectError(drawn) {
61651               if (!checkSelectedID()) return;
61652
61653               var selection = context.surface()
61654                   .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
61655
61656               if (selection.empty()) {
61657                   // Return to browse mode if selected DOM elements have
61658                   // disappeared because the user moved them out of view..
61659                   var source = event && event.type === 'zoom' && event.sourceEvent;
61660                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61661                       context.enter(modeBrowse(context));
61662                   }
61663
61664               } else {
61665                   selection
61666                       .classed('selected', true);
61667
61668                   context.selectedErrorID(selectedErrorID);
61669               }
61670           }
61671
61672           function esc() {
61673               if (select('.combobox').size()) return;
61674               context.enter(modeBrowse(context));
61675           }
61676       };
61677
61678
61679       mode.exit = function() {
61680           behaviors.forEach(context.uninstall);
61681
61682           select(document)
61683               .call(keybinding.unbind);
61684
61685           context.surface()
61686               .selectAll('.qa_error.selected')
61687               .classed('selected hover', false);
61688
61689           context.map()
61690               .on('drawn.select-error', null);
61691
61692           context.ui().sidebar
61693               .hide();
61694
61695           context.selectedErrorID(null);
61696           context.features().forceVisible([]);
61697       };
61698
61699
61700       return mode;
61701   }
61702
61703   function modeSelectNote(context, selectedNoteID) {
61704       var mode = {
61705           id: 'select-note',
61706           button: 'browse'
61707       };
61708
61709       var osm = services.osm;
61710       var keybinding = utilKeybinding('select-note');
61711       var noteEditor = uiNoteEditor(context)
61712           .on('change', function() {
61713               context.map().pan([0,0]);  // trigger a redraw
61714               var note = checkSelectedID();
61715               if (!note) return;
61716               context.ui().sidebar
61717                   .show(noteEditor.note(note));
61718           });
61719
61720       var behaviors = [
61721           behaviorBreathe(context),
61722           behaviorHover(context),
61723           behaviorSelect(context),
61724           behaviorLasso(context),
61725           modeDragNode(context).behavior,
61726           modeDragNote(context).behavior
61727       ];
61728
61729       var newFeature = false;
61730
61731
61732       function checkSelectedID() {
61733           if (!osm) return;
61734           var note = osm.getNote(selectedNoteID);
61735           if (!note) {
61736               context.enter(modeBrowse(context));
61737           }
61738           return note;
61739       }
61740
61741
61742       // class the note as selected, or return to browse mode if the note is gone
61743       function selectNote(drawn) {
61744           if (!checkSelectedID()) return;
61745
61746           var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
61747
61748           if (selection.empty()) {
61749               // Return to browse mode if selected DOM elements have
61750               // disappeared because the user moved them out of view..
61751               var source = event && event.type === 'zoom' && event.sourceEvent;
61752               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
61753                   context.enter(modeBrowse(context));
61754               }
61755
61756           } else {
61757               selection
61758                   .classed('selected', true);
61759
61760               context.selectedNoteID(selectedNoteID);
61761           }
61762       }
61763
61764
61765       function esc() {
61766           if (select('.combobox').size()) return;
61767           context.enter(modeBrowse(context));
61768       }
61769
61770
61771       mode.zoomToSelected = function() {
61772           if (!osm) return;
61773           var note = osm.getNote(selectedNoteID);
61774           if (note) {
61775               context.map().centerZoomEase(note.loc, 20);
61776           }
61777       };
61778
61779
61780       mode.newFeature = function(val) {
61781           if (!arguments.length) return newFeature;
61782           newFeature = val;
61783           return mode;
61784       };
61785
61786
61787       mode.enter = function() {
61788           var note = checkSelectedID();
61789           if (!note) return;
61790
61791           behaviors.forEach(context.install);
61792
61793           keybinding
61794               .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61795               .on('⎋', esc, true);
61796
61797           select(document)
61798               .call(keybinding);
61799
61800           selectNote();
61801
61802           var sidebar = context.ui().sidebar;
61803           sidebar.show(noteEditor.note(note));
61804
61805           // expand the sidebar, avoid obscuring the note if needed
61806           sidebar.expand(sidebar.intersects(note.extent()));
61807
61808           context.map()
61809               .on('drawn.select', selectNote);
61810       };
61811
61812
61813       mode.exit = function() {
61814           behaviors.forEach(context.uninstall);
61815
61816           select(document)
61817               .call(keybinding.unbind);
61818
61819           context.surface()
61820               .selectAll('.layer-notes .selected')
61821               .classed('selected hover', false);
61822
61823           context.map()
61824               .on('drawn.select', null);
61825
61826           context.ui().sidebar
61827               .hide();
61828
61829           context.selectedNoteID(null);
61830       };
61831
61832
61833       return mode;
61834   }
61835
61836   function behaviorAddWay(context) {
61837       var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
61838       var draw = behaviorDraw(context);
61839
61840       function behavior(surface) {
61841           draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
61842               .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
61843               .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
61844               .on('cancel', behavior.cancel)
61845               .on('finish', behavior.cancel);
61846
61847           context.map()
61848               .dblclickEnable(false);
61849
61850           surface.call(draw);
61851       }
61852
61853
61854       behavior.off = function(surface) {
61855           surface.call(draw.off);
61856       };
61857
61858
61859       behavior.cancel = function() {
61860           window.setTimeout(function() {
61861               context.map().dblclickEnable(true);
61862           }, 1000);
61863
61864           context.enter(modeBrowse(context));
61865       };
61866
61867
61868       behavior.tail = function(text) {
61869           draw.tail(text);
61870           return behavior;
61871       };
61872
61873
61874       return utilRebind(behavior, dispatch$1, 'on');
61875   }
61876
61877   function behaviorBreathe() {
61878       var duration = 800;
61879       var steps = 4;
61880       var selector = '.selected.shadow, .selected .shadow';
61881       var _selected = select(null);
61882       var _classed = '';
61883       var _params = {};
61884       var _done = false;
61885       var _timer;
61886
61887
61888       function ratchetyInterpolator(a, b, steps, units) {
61889           a = parseFloat(a);
61890           b = parseFloat(b);
61891           var sample = quantize()
61892               .domain([0, 1])
61893               .range(d3_quantize(interpolateNumber(a, b), steps));
61894
61895           return function(t) {
61896               return String(sample(t)) + (units || '');
61897           };
61898       }
61899
61900
61901       function reset(selection) {
61902           selection
61903               .style('stroke-opacity', null)
61904               .style('stroke-width', null)
61905               .style('fill-opacity', null)
61906               .style('r', null);
61907       }
61908
61909
61910       function setAnimationParams(transition, fromTo) {
61911           var toFrom = (fromTo === 'from' ? 'to' : 'from');
61912
61913           transition
61914               .styleTween('stroke-opacity', function(d) {
61915                   return ratchetyInterpolator(
61916                       _params[d.id][toFrom].opacity,
61917                       _params[d.id][fromTo].opacity,
61918                       steps
61919                   );
61920               })
61921               .styleTween('stroke-width', function(d) {
61922                   return ratchetyInterpolator(
61923                       _params[d.id][toFrom].width,
61924                       _params[d.id][fromTo].width,
61925                       steps,
61926                       'px'
61927                   );
61928               })
61929               .styleTween('fill-opacity', function(d) {
61930                   return ratchetyInterpolator(
61931                       _params[d.id][toFrom].opacity,
61932                       _params[d.id][fromTo].opacity,
61933                       steps
61934                   );
61935               })
61936               .styleTween('r', function(d) {
61937                   return ratchetyInterpolator(
61938                       _params[d.id][toFrom].width,
61939                       _params[d.id][fromTo].width,
61940                       steps,
61941                       'px'
61942                   );
61943               });
61944       }
61945
61946
61947       function calcAnimationParams(selection) {
61948           selection
61949               .call(reset)
61950               .each(function(d) {
61951                   var s = select(this);
61952                   var tag = s.node().tagName;
61953                   var p = {'from': {}, 'to': {}};
61954                   var opacity;
61955                   var width;
61956
61957                   // determine base opacity and width
61958                   if (tag === 'circle') {
61959                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
61960                       width = parseFloat(s.style('r') || 15.5);
61961                   } else {
61962                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
61963                       width = parseFloat(s.style('stroke-width') || 10);
61964                   }
61965
61966                   // calculate from/to interpolation params..
61967                   p.tag = tag;
61968                   p.from.opacity = opacity * 0.6;
61969                   p.to.opacity = opacity * 1.25;
61970                   p.from.width = width * 0.7;
61971                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
61972                   _params[d.id] = p;
61973               });
61974       }
61975
61976
61977       function run(surface, fromTo) {
61978           var toFrom = (fromTo === 'from' ? 'to' : 'from');
61979           var currSelected = surface.selectAll(selector);
61980           var currClassed = surface.attr('class');
61981
61982           if (_done || currSelected.empty()) {
61983               _selected.call(reset);
61984               return;
61985           }
61986
61987           if (!isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
61988               _selected.call(reset);
61989               _classed = currClassed;
61990               _selected = currSelected.call(calcAnimationParams);
61991           }
61992
61993           _selected
61994               .transition()
61995               .duration(duration)
61996               .call(setAnimationParams, fromTo)
61997               .on('end', function() {
61998                   surface.call(run, toFrom);
61999               });
62000       }
62001
62002
62003       function behavior(surface) {
62004           _done = false;
62005           _timer = timer(function() {
62006               // wait for elements to actually become selected
62007               if (surface.selectAll(selector).empty()) {
62008                   return false;
62009               }
62010
62011               surface.call(run, 'from');
62012               _timer.stop();
62013               return true;
62014           }, 20);
62015       }
62016
62017
62018       behavior.off = function() {
62019           _done = true;
62020           if (_timer) {
62021               _timer.stop();
62022           }
62023           _selected
62024               .interrupt()
62025               .call(reset);
62026       };
62027
62028
62029       return behavior;
62030   }
62031
62032   function behaviorCopy(context) {
62033
62034       function groupEntities(ids, graph) {
62035           var entities = ids.map(function (id) { return graph.entity(id); });
62036           return assignIn({relation: [], way: [], node: []},
62037               groupBy(entities, function(entity) { return entity.type; }));
62038       }
62039
62040
62041       function getDescendants(id, graph, descendants) {
62042           var entity = graph.entity(id);
62043           var children;
62044
62045           descendants = descendants || {};
62046
62047           if (entity.type === 'relation') {
62048               children = map$3(entity.members, 'id');
62049           } else if (entity.type === 'way') {
62050               children = entity.nodes;
62051           } else {
62052               children = [];
62053           }
62054
62055           for (var i = 0; i < children.length; i++) {
62056               if (!descendants[children[i]]) {
62057                   descendants[children[i]] = true;
62058                   descendants = getDescendants(children[i], graph, descendants);
62059               }
62060           }
62061
62062           return descendants;
62063       }
62064
62065
62066       function getSelectionText() {
62067           return window.getSelection().toString();
62068       }
62069
62070
62071       function doCopy() {
62072           if (!getSelectionText()) {
62073               event.preventDefault();
62074           }
62075
62076           var graph = context.graph();
62077           var selected = groupEntities(context.selectedIDs(), graph);
62078           var canCopy = [];
62079           var skip = {};
62080           var entity;
62081           var i;
62082
62083           for (i = 0; i < selected.relation.length; i++) {
62084               entity = selected.relation[i];
62085               if (!skip[entity.id] && entity.isComplete(graph)) {
62086                   canCopy.push(entity.id);
62087                   skip = getDescendants(entity.id, graph, skip);
62088               }
62089           }
62090           for (i = 0; i < selected.way.length; i++) {
62091               entity = selected.way[i];
62092               if (!skip[entity.id]) {
62093                   canCopy.push(entity.id);
62094                   skip = getDescendants(entity.id, graph, skip);
62095               }
62096           }
62097           for (i = 0; i < selected.node.length; i++) {
62098               entity = selected.node[i];
62099               if (!skip[entity.id]) {
62100                   canCopy.push(entity.id);
62101               }
62102           }
62103
62104           context.copyIDs(canCopy);
62105       }
62106
62107
62108       function behavior() {
62109           context.keybinding().on(uiCmd('⌘C'), doCopy);
62110           return behavior;
62111       }
62112
62113       behavior.off = function() {
62114           context.keybinding().off(uiCmd('⌘C'));
62115       };
62116
62117
62118       return behavior;
62119   }
62120
62121   /*
62122       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
62123
62124       * The `origin` function is expected to return an [x, y] tuple rather than an
62125         {x, y} object.
62126       * The events are `start`, `move`, and `end`.
62127         (https://github.com/mbostock/d3/issues/563)
62128       * The `start` event is not dispatched until the first cursor movement occurs.
62129         (https://github.com/mbostock/d3/pull/368)
62130       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
62131         than `x`, `y`, `dx`, and `dy` properties.
62132       * The `end` event is not dispatched if no movement occurs.
62133       * An `off` function is available that unbinds the drag's internal event handlers.
62134    */
62135
62136   function behaviorDrag() {
62137       var dispatch$1 = dispatch('start', 'move', 'end');
62138       var _origin = null;
62139       var _selector = '';
62140       var _event;
62141       var _target;
62142       var _surface;
62143
62144
62145       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
62146       var d3_event_userSelectSuppress = function() {
62147               var selection$1 = selection();
62148               var select = selection$1.style(d3_event_userSelectProperty);
62149               selection$1.style(d3_event_userSelectProperty, 'none');
62150               return function() {
62151                   selection$1.style(d3_event_userSelectProperty, select);
62152               };
62153           };
62154
62155
62156       function d3_eventCancel() {
62157           event.stopPropagation();
62158           event.preventDefault();
62159       }
62160
62161
62162       function eventOf(thiz, argumentz) {
62163           return function(e1) {
62164               e1.target = behavior;
62165               customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
62166           };
62167       }
62168
62169
62170       function dragstart() {
62171           _target = this;
62172           _event = eventOf(_target, arguments);
62173
62174           var eventTarget = event.target;
62175           var touchId = event.touches ? event.changedTouches[0].identifier : null;
62176           var offset;
62177           var startOrigin = point();
62178           var started = false;
62179           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
62180
62181           select(window)
62182               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
62183               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
62184
62185           if (_origin) {
62186               offset = _origin.apply(_target, arguments);
62187               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
62188           } else {
62189               offset = [0, 0];
62190           }
62191
62192           if (touchId === null) {
62193               event.stopPropagation();
62194           }
62195
62196
62197           function point() {
62198               var p = _surface || _target.parentNode;
62199               return touchId !== null ? d3_touches(p).filter(function(p) {
62200                   return p.identifier === touchId;
62201               })[0] : mouse(p);
62202           }
62203
62204
62205           function dragmove() {
62206               var p = point();
62207               var dx = p[0] - startOrigin[0];
62208               var dy = p[1] - startOrigin[1];
62209
62210               if (dx === 0 && dy === 0)
62211                   return;
62212
62213               startOrigin = p;
62214               d3_eventCancel();
62215
62216               if (!started) {
62217                   started = true;
62218                   _event({ type: 'start' });
62219               } else {
62220                   _event({
62221                       type: 'move',
62222                       point: [p[0] + offset[0],  p[1] + offset[1]],
62223                       delta: [dx, dy]
62224                   });
62225               }
62226           }
62227
62228
62229           function dragend() {
62230               if (started) {
62231                   _event({ type: 'end' });
62232
62233                   d3_eventCancel();
62234                   if (event.target === eventTarget) {
62235                       select(window)
62236                           .on('click.drag', click, true);
62237                   }
62238               }
62239
62240               select(window)
62241                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
62242                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
62243
62244               selectEnable();
62245           }
62246
62247
62248           function click() {
62249               d3_eventCancel();
62250               select(window)
62251                   .on('click.drag', null);
62252           }
62253       }
62254
62255
62256       function behavior(selection) {
62257           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
62258           var delegate = dragstart;
62259
62260           if (_selector) {
62261               delegate = function() {
62262                   var root = this;
62263                   var target = event.target;
62264                   for (; target && target !== root; target = target.parentNode) {
62265                       var datum = target.__data__;
62266
62267                       var entity = datum instanceof osmNote ? datum
62268                           : datum && datum.properties && datum.properties.entity;
62269
62270                       if (entity && target[matchesSelector](_selector)) {
62271                           return dragstart.call(target, entity);
62272                       }
62273                   }
62274               };
62275           }
62276
62277           selection
62278               .on('mousedown.drag' + _selector, delegate)
62279               .on('touchstart.drag' + _selector, delegate);
62280       }
62281
62282
62283       behavior.off = function(selection) {
62284           selection
62285               .on('mousedown.drag' + _selector, null)
62286               .on('touchstart.drag' + _selector, null);
62287       };
62288
62289
62290       behavior.selector = function(_) {
62291           if (!arguments.length) return _selector;
62292           _selector = _;
62293           return behavior;
62294       };
62295
62296
62297       behavior.origin = function(_) {
62298           if (!arguments.length) return _origin;
62299           _origin = _;
62300           return behavior;
62301       };
62302
62303
62304       behavior.cancel = function() {
62305           select(window)
62306               .on('mousemove.drag', null)
62307               .on('mouseup.drag', null);
62308           return behavior;
62309       };
62310
62311
62312       behavior.target = function() {
62313           if (!arguments.length) return _target;
62314           _target = arguments[0];
62315           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
62316           return behavior;
62317       };
62318
62319
62320       behavior.surface = function() {
62321           if (!arguments.length) return _surface;
62322           _surface = arguments[0];
62323           return behavior;
62324       };
62325
62326
62327       return utilRebind(behavior, dispatch$1, 'on');
62328   }
62329
62330   function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
62331
62332       var origWay = context.entity(wayID);
62333
62334       var annotation = t((origWay.isDegenerate() ?
62335           'operations.start.annotation.' :
62336           'operations.continue.annotation.') + context.geometry(wayID)
62337       );
62338
62339       var behavior = behaviorDraw(context);
62340       behavior.hover().initialNodeID(index ? origWay.nodes[index] :
62341           (origWay.isClosed() ? origWay.nodes[origWay.nodes.length - 2] : origWay.nodes[origWay.nodes.length - 1]));
62342
62343       var _tempEdits = 0;
62344
62345       var end = osmNode({ loc: context.map().mouseCoordinates() });
62346
62347       // Push an annotated state for undo to return back to.
62348       // We must make sure to remove this edit later.
62349       context.perform(actionNoop(), annotation);
62350       _tempEdits++;
62351
62352       // Add the drawing node to the graph.
62353       // We must make sure to remove this edit later.
62354       context.perform(_actionAddDrawNode());
62355       _tempEdits++;
62356
62357
62358       function keydown() {
62359           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
62360               if (context.surface().classed('nope')) {
62361                   context.surface()
62362                       .classed('nope-suppressed', true);
62363               }
62364               context.surface()
62365                   .classed('nope', false)
62366                   .classed('nope-disabled', true);
62367           }
62368       }
62369
62370
62371       function keyup() {
62372           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
62373               if (context.surface().classed('nope-suppressed')) {
62374                   context.surface()
62375                       .classed('nope', true);
62376               }
62377               context.surface()
62378                   .classed('nope-suppressed', false)
62379                   .classed('nope-disabled', false);
62380           }
62381       }
62382
62383
62384       function allowsVertex(d) {
62385           return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
62386       }
62387
62388
62389       // related code
62390       // - `mode/drag_node.js`     `doMode()`
62391       // - `behavior/draw.js`      `click()`
62392       // - `behavior/draw_way.js`  `move()`
62393       function move(datum) {
62394           context.surface().classed('nope-disabled', event.altKey);
62395
62396           var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
62397           var targetNodes = datum && datum.properties && datum.properties.nodes;
62398           var loc = context.map().mouseCoordinates();
62399
62400           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
62401               loc = targetLoc;
62402
62403           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
62404               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
62405               if (choice) {
62406                   loc = choice.loc;
62407               }
62408           }
62409
62410           context.replace(actionMoveNode(end.id, loc));
62411           end = context.entity(end.id);
62412           checkGeometry(false);
62413       }
62414
62415
62416       // Check whether this edit causes the geometry to break.
62417       // If so, class the surface with a nope cursor.
62418       // `finishDraw` - Only checks the relevant line segments if finishing drawing
62419       function checkGeometry(finishDraw) {
62420           var nopeDisabled = context.surface().classed('nope-disabled');
62421           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
62422
62423           if (nopeDisabled) {
62424               context.surface()
62425                   .classed('nope', false)
62426                   .classed('nope-suppressed', isInvalid);
62427           } else {
62428               context.surface()
62429                   .classed('nope', isInvalid)
62430                   .classed('nope-suppressed', false);
62431           }
62432       }
62433
62434
62435       function isInvalidGeometry(entity, graph, finishDraw) {
62436           var parents = graph.parentWays(entity);
62437
62438           for (var i = 0; i < parents.length; i++) {
62439               var parent = parents[i];
62440
62441               var nodes = graph.childNodes(parent);
62442
62443               if (origWay.isClosed()) { // Check if Area
62444                   if (finishDraw) {
62445                       if (nodes.length < 3) return false;
62446
62447                       nodes.splice(-2, 1);
62448                       entity = nodes[nodes.length-2];
62449                   } else {
62450                       nodes.pop();
62451                   }
62452               } else { // Line
62453                   if (finishDraw) {
62454                       nodes.pop();
62455                   }
62456               }
62457
62458               if (geoHasSelfIntersections(nodes, entity.id)) {
62459                   return true;
62460               }
62461           }
62462
62463           return false;
62464       }
62465
62466
62467       function undone() {
62468           // Undo popped the history back to the initial annotated no-op edit.
62469           _tempEdits = 0;     // We will deal with the temp edits here
62470           context.pop(1);     // Remove initial no-op edit
62471
62472           if (context.graph() === baselineGraph) {    // We've undone back to the beginning
62473               // baselineGraph may be behind startGraph if this way was added rather than continued
62474               resetContextGraphToStartGraph();
62475               context.enter(modeSelect(context, [wayID]));
62476           } else {
62477               // Remove whatever segment was drawn previously and continue drawing
62478               context.pop(1);
62479               context.enter(mode);
62480           }
62481       }
62482
62483
62484       function setActiveElements() {
62485           context.surface().selectAll('.' + end.id)
62486               .classed('active', true);
62487       }
62488
62489
62490       var drawWay = function(surface) {
62491           behavior
62492               .on('move', move)
62493               .on('click', drawWay.add)
62494               .on('clickWay', drawWay.addWay)
62495               .on('clickNode', drawWay.addNode)
62496               .on('undo', context.undo)
62497               .on('cancel', drawWay.cancel)
62498               .on('finish', drawWay.finish);
62499
62500           select(window)
62501               .on('keydown.drawWay', keydown)
62502               .on('keyup.drawWay', keyup);
62503
62504           context.map()
62505               .dblclickEnable(false)
62506               .on('drawn.draw', setActiveElements);
62507
62508           setActiveElements();
62509
62510           surface.call(behavior);
62511
62512           context.history()
62513               .on('undone.draw', undone);
62514       };
62515
62516       function resetContextGraphToStartGraph() {
62517           while (context.graph() !== startGraph) {
62518               context.pop();
62519           }
62520       }
62521
62522       drawWay.off = function(surface) {
62523           // Drawing was interrupted unexpectedly.
62524           // This can happen if the user changes modes,
62525           // clicks geolocate button, a hashchange event occurs, etc.
62526           if (_tempEdits) {
62527               context.pop(_tempEdits);
62528               resetContextGraphToStartGraph();
62529           }
62530
62531           context.map()
62532               .on('drawn.draw', null);
62533
62534           surface.call(behavior.off)
62535               .selectAll('.active')
62536               .classed('active', false);
62537
62538           surface
62539               .classed('nope', false)
62540               .classed('nope-suppressed', false)
62541               .classed('nope-disabled', false);
62542
62543           select(window)
62544               .on('keydown.hover', null)
62545               .on('keyup.hover', null);
62546
62547           context.history()
62548               .on('undone.draw', null);
62549       };
62550
62551
62552       function _actionAddDrawNode() {
62553           return function(graph) {
62554               return graph
62555                   .replace(end)
62556                   .replace(origWay.addNode(end.id, index));
62557           };
62558       }
62559
62560
62561       function _actionReplaceDrawNode(newNode) {
62562           return function(graph) {
62563               return graph
62564                   .replace(origWay.addNode(newNode.id, index))
62565                   .remove(end);
62566           };
62567       }
62568
62569
62570       // Accept the current position of the drawing node and continue drawing.
62571       drawWay.add = function(loc, d) {
62572           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62573               return;   // can't click here
62574           }
62575
62576           context.pop(_tempEdits);
62577           _tempEdits = 0;
62578
62579           context.perform(
62580               _actionAddDrawNode(),
62581               annotation
62582           );
62583
62584           checkGeometry(false);   // finishDraw = false
62585           context.enter(mode);
62586       };
62587
62588
62589       // Connect the way to an existing way.
62590       drawWay.addWay = function(loc, edge, d) {
62591           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62592               return;   // can't click here
62593           }
62594
62595           context.pop(_tempEdits);
62596           _tempEdits = 0;
62597
62598           context.perform(
62599               _actionAddDrawNode(),
62600               actionAddMidpoint({ loc: loc, edge: edge }, end),
62601               annotation
62602           );
62603
62604           checkGeometry(false);   // finishDraw = false
62605           context.enter(mode);
62606       };
62607
62608
62609       // Connect the way to an existing node and continue drawing.
62610       drawWay.addNode = function(node, d) {
62611           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
62612               return;   // can't click here
62613           }
62614
62615           context.pop(_tempEdits);
62616           _tempEdits = 0;
62617
62618           context.perform(
62619               _actionReplaceDrawNode(node),
62620               annotation
62621           );
62622
62623           checkGeometry(false);   // finishDraw = false
62624           context.enter(mode);
62625       };
62626
62627
62628       // Finish the draw operation, removing the temporary edits.
62629       // If the way has enough nodes to be valid, it's selected.
62630       // Otherwise, delete everything and return to browse mode.
62631       drawWay.finish = function() {
62632           checkGeometry(true);   // finishDraw = true
62633           if (context.surface().classed('nope')) {
62634               return;   // can't click here
62635           }
62636
62637           context.pop(_tempEdits);
62638           _tempEdits = 0;
62639
62640           var way = context.hasEntity(wayID);
62641           if (!way || way.isDegenerate()) {
62642               drawWay.cancel();
62643               return;
62644           }
62645
62646           window.setTimeout(function() {
62647               context.map().dblclickEnable(true);
62648           }, 1000);
62649           var isNewFeature = !mode.isContinuing;
62650           context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
62651           if (isNewFeature) {
62652               context.validator().validate();
62653           }
62654       };
62655
62656
62657       // Cancel the draw operation, delete everything, and return to browse mode.
62658       drawWay.cancel = function() {
62659           context.pop(_tempEdits);
62660           _tempEdits = 0;
62661
62662           resetContextGraphToStartGraph();
62663
62664           window.setTimeout(function() {
62665               context.map().dblclickEnable(true);
62666           }, 1000);
62667
62668           context.surface()
62669               .classed('nope', false)
62670               .classed('nope-disabled', false)
62671               .classed('nope-suppressed', false);
62672
62673           context.enter(modeBrowse(context));
62674       };
62675
62676
62677       drawWay.activeID = function() {
62678           if (!arguments.length) return end.id;
62679           // no assign
62680           return drawWay;
62681       };
62682
62683
62684       drawWay.tail = function(text) {
62685           behavior.tail(text);
62686           return drawWay;
62687       };
62688
62689
62690       return drawWay;
62691   }
62692
62693   function behaviorHash(context) {
62694       var s0 = null; // cached window.location.hash
62695       var lat = 90 - 1e-8; // allowable latitude range
62696
62697
62698       var parser = function(map, s) {
62699           var q = utilStringQs(s);
62700           var args = (q.map || '').split('/').map(Number);
62701
62702           if (args.length < 3 || args.some(isNaN)) {
62703               return true; // replace bogus hash
62704
62705           } else if (s !== formatter(map).slice(1)) {   // hash has changed
62706               var mode = context.mode(),
62707                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
62708                   maxdist = 500;
62709
62710               // Don't allow the hash location to change too much while drawing
62711               // This can happen if the user accidently hit the back button.  #3996
62712               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62713                   context.enter(modeBrowse(context));
62714               }
62715
62716               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62717           }
62718       };
62719
62720
62721       var formatter = function(map) {
62722           var center = map.center();
62723           var zoom = map.zoom();
62724           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62725           var q = omit(utilStringQs(window.location.hash.substring(1)),
62726               ['comment', 'source', 'hashtags', 'walkthrough']
62727           );
62728           var newParams = {};
62729
62730           delete q.id;
62731           var selected = context.selectedIDs().filter(function(id) {
62732               return !context.entity(id).isNew();
62733           });
62734           if (selected.length) {
62735               newParams.id = selected.join(',');
62736           }
62737
62738           newParams.map = zoom.toFixed(2) +
62739               '/' + center[1].toFixed(precision) +
62740               '/' + center[0].toFixed(precision);
62741
62742           return '#' + utilQsString(assign(q, newParams), true);
62743       };
62744
62745
62746       function update() {
62747           if (context.inIntro()) return;
62748           var s1 = formatter(context.map());
62749           if (s0 !== s1) {
62750               window.location.replace(s0 = s1);  // don't recenter the map!
62751           }
62752       }
62753
62754
62755       var throttledUpdate = throttle(update, 500);
62756
62757
62758       function hashchange() {
62759           if (window.location.hash === s0) return;  // ignore spurious hashchange events
62760           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62761               update(); // replace bogus hash
62762           }
62763       }
62764
62765
62766       function behavior() {
62767           context.map()
62768               .on('move.hash', throttledUpdate);
62769
62770           context
62771               .on('enter.hash', throttledUpdate);
62772
62773           select(window)
62774               .on('hashchange.hash', hashchange);
62775
62776           if (window.location.hash) {
62777               var q = utilStringQs(window.location.hash.substring(1));
62778
62779               if (q.id) {
62780                   context.zoomToEntity(q.id.split(',')[0], !q.map);
62781               }
62782
62783               if (q.comment) {
62784                   context.storage('comment', q.comment);
62785                   context.storage('commentDate', Date.now());
62786               }
62787
62788               if (q.source) {
62789                   context.storage('source', q.source);
62790                   context.storage('commentDate', Date.now());
62791               }
62792
62793               if (q.hashtags) {
62794                   context.storage('hashtags', q.hashtags);
62795               }
62796
62797               if (q.walkthrough === 'true') {
62798                   behavior.startWalkthrough = true;
62799               }
62800
62801               hashchange();
62802
62803               if (q.map) {
62804                   behavior.hadHash = true;
62805               }
62806           }
62807       }
62808
62809
62810       behavior.off = function() {
62811           throttledUpdate.cancel();
62812
62813           context.map()
62814               .on('move.hash', null);
62815
62816           context
62817               .on('enter.hash', null);
62818
62819           select(window)
62820               .on('hashchange.hash', null);
62821
62822           window.location.hash = '';
62823       };
62824
62825
62826       return behavior;
62827   }
62828
62829   function behaviorLasso(context) {
62830
62831       var behavior = function(selection) {
62832           var lasso;
62833
62834
62835           function mousedown() {
62836               var button = 0;  // left
62837               if (event.button === button && event.shiftKey === true) {
62838                   lasso = null;
62839
62840                   select(window)
62841                       .on('mousemove.lasso', mousemove)
62842                       .on('mouseup.lasso', mouseup);
62843
62844                   event.stopPropagation();
62845               }
62846           }
62847
62848
62849           function mousemove() {
62850               if (!lasso) {
62851                   lasso = uiLasso(context);
62852                   context.surface().call(lasso);
62853               }
62854
62855               lasso.p(context.mouse());
62856           }
62857
62858
62859           function normalize(a, b) {
62860               return [
62861                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62862                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
62863           }
62864
62865
62866           function lassoed() {
62867               if (!lasso) return [];
62868
62869               var graph = context.graph();
62870               var bounds = lasso.extent().map(context.projection.invert);
62871               var extent = geoExtent(normalize(bounds[0], bounds[1]));
62872
62873               return map$3(context.intersects(extent).filter(function(entity) {
62874                   return entity.type === 'node' &&
62875                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62876                       !context.features().isHidden(entity, graph, entity.geometry(graph));
62877               }), 'id');
62878           }
62879
62880
62881           function mouseup() {
62882               select(window)
62883                   .on('mousemove.lasso', null)
62884                   .on('mouseup.lasso', null);
62885
62886               if (!lasso) return;
62887
62888               var ids = lassoed();
62889               lasso.close();
62890
62891               if (ids.length) {
62892                   context.enter(modeSelect(context, ids));
62893               }
62894           }
62895
62896           selection
62897               .on('mousedown.lasso', mousedown);
62898       };
62899
62900
62901       behavior.off = function(selection) {
62902           selection.on('mousedown.lasso', null);
62903       };
62904
62905
62906       return behavior;
62907   }
62908
62909   /* Creates a keybinding behavior for an operation */
62910   function behaviorOperation(context) {
62911       var _operation;
62912
62913       function keypress() {
62914           event.preventDefault();
62915           var disabled = _operation.disabled();
62916           var flash;
62917
62918           if (disabled) {
62919               flash = uiFlash()
62920                   .duration(4000)
62921                   .iconName('#iD-operation-' + _operation.id)
62922                   .iconClass('operation disabled')
62923                   .text(_operation.tooltip);
62924
62925               flash();
62926
62927           } else {
62928               flash = uiFlash()
62929                   .duration(2000)
62930                   .iconName('#iD-operation-' + _operation.id)
62931                   .iconClass('operation')
62932                   .text(_operation.annotation() || _operation.title);
62933
62934               flash();
62935               _operation();
62936           }
62937       }
62938
62939
62940       function behavior() {
62941           if (_operation && _operation.available()) {
62942               context.keybinding()
62943                   .on(_operation.keys, keypress);
62944           }
62945
62946           return behavior;
62947       }
62948
62949
62950       behavior.off = function() {
62951           context.keybinding()
62952               .off(_operation.keys);
62953       };
62954
62955
62956       behavior.which = function (_) {
62957           if (!arguments.length) return _operation;
62958           _operation = _;
62959           return behavior;
62960       };
62961
62962
62963       return behavior;
62964   }
62965
62966   /**
62967    * The base implementation of `_.invert` and `_.invertBy` which inverts
62968    * `object` with values transformed by `iteratee` and set by `setter`.
62969    *
62970    * @private
62971    * @param {Object} object The object to iterate over.
62972    * @param {Function} setter The function to set `accumulator` values.
62973    * @param {Function} iteratee The iteratee to transform values.
62974    * @param {Object} accumulator The initial inverted object.
62975    * @returns {Function} Returns `accumulator`.
62976    */
62977   function baseInverter(object, setter, iteratee, accumulator) {
62978     baseForOwn(object, function(value, key, object) {
62979       setter(accumulator, iteratee(value), key, object);
62980     });
62981     return accumulator;
62982   }
62983
62984   /**
62985    * Creates a function like `_.invertBy`.
62986    *
62987    * @private
62988    * @param {Function} setter The function to set accumulator values.
62989    * @param {Function} toIteratee The function to resolve iteratees.
62990    * @returns {Function} Returns the new inverter function.
62991    */
62992   function createInverter(setter, toIteratee) {
62993     return function(object, iteratee) {
62994       return baseInverter(object, setter, toIteratee(iteratee), {});
62995     };
62996   }
62997
62998   /** Used for built-in method references. */
62999   var objectProto$j = Object.prototype;
63000
63001   /**
63002    * Used to resolve the
63003    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
63004    * of values.
63005    */
63006   var nativeObjectToString$2 = objectProto$j.toString;
63007
63008   /**
63009    * Creates an object composed of the inverted keys and values of `object`.
63010    * If `object` contains duplicate values, subsequent values overwrite
63011    * property assignments of previous values.
63012    *
63013    * @static
63014    * @memberOf _
63015    * @since 0.7.0
63016    * @category Object
63017    * @param {Object} object The object to invert.
63018    * @returns {Object} Returns the new inverted object.
63019    * @example
63020    *
63021    * var object = { 'a': 1, 'b': 2, 'c': 1 };
63022    *
63023    * _.invert(object);
63024    * // => { '1': 'c', '2': 'b' }
63025    */
63026   var invert = createInverter(function(result, value, key) {
63027     if (value != null &&
63028         typeof value.toString != 'function') {
63029       value = nativeObjectToString$2.call(value);
63030     }
63031
63032     result[value] = key;
63033   }, constant$d(identity$8));
63034
63035   /**
63036    * Creates an object with the same keys as `object` and values generated
63037    * by running each own enumerable string keyed property of `object` thru
63038    * `iteratee`. The iteratee is invoked with three arguments:
63039    * (value, key, object).
63040    *
63041    * @static
63042    * @memberOf _
63043    * @since 2.4.0
63044    * @category Object
63045    * @param {Object} object The object to iterate over.
63046    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
63047    * @returns {Object} Returns the new mapped object.
63048    * @see _.mapKeys
63049    * @example
63050    *
63051    * var users = {
63052    *   'fred':    { 'user': 'fred',    'age': 40 },
63053    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
63054    * };
63055    *
63056    * _.mapValues(users, function(o) { return o.age; });
63057    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
63058    *
63059    * // The `_.property` iteratee shorthand.
63060    * _.mapValues(users, 'age');
63061    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
63062    */
63063   function mapValues(object, iteratee) {
63064     var result = {};
63065     iteratee = baseIteratee(iteratee, 3);
63066
63067     baseForOwn(object, function(value, key, object) {
63068       baseAssignValue(result, key, iteratee(value, key, object));
63069     });
63070     return result;
63071   }
63072
63073   function behaviorPaste(context) {
63074
63075       function doPaste() {
63076           event.preventDefault();
63077
63078           var baseGraph = context.graph();
63079           var mouse = context.mouse();
63080           var projection = context.projection;
63081           var viewport = geoExtent(projection.clipExtent()).polygon();
63082
63083           if (!geoPointInPolygon(mouse, viewport)) return;
63084
63085           var extent = geoExtent();
63086           var oldIDs = context.copyIDs();
63087           var oldGraph = context.copyGraph();
63088           var newIDs = [];
63089
63090           if (!oldIDs.length) return;
63091
63092           var action = actionCopyEntities(oldIDs, oldGraph);
63093           context.perform(action);
63094
63095           var copies = action.copies();
63096           var originals = invert(mapValues(copies, 'id'));
63097           for (var id in copies) {
63098               var oldEntity = oldGraph.entity(id);
63099               var newEntity = copies[id];
63100
63101               extent._extend(oldEntity.extent(oldGraph));
63102
63103               // Exclude child nodes from newIDs if their parent way was also copied.
63104               var parents = context.graph().parentWays(newEntity);
63105               var parentCopied = false;
63106               for (var i = 0; i < parents.length; i++) {
63107                   if (originals[parents[i].id]) {
63108                       parentCopied = true;
63109                       break;
63110                   }
63111               }
63112
63113               if (!parentCopied) {
63114                   newIDs.push(newEntity.id);
63115               }
63116           }
63117
63118           // Put pasted objects where mouse pointer is..
63119           var center = projection(extent.center());
63120           var delta = geoVecSubtract(mouse, center);
63121
63122           context.perform(actionMove(newIDs, delta, projection));
63123           context.enter(modeMove(context, newIDs, baseGraph));
63124       }
63125
63126
63127       function behavior() {
63128           context.keybinding().on(uiCmd('⌘V'), doPaste);
63129           return behavior;
63130       }
63131
63132
63133       behavior.off = function() {
63134           context.keybinding().off(uiCmd('⌘V'));
63135       };
63136
63137
63138       return behavior;
63139   }
63140
63141   function behaviorSelect(context) {
63142       var lastMouse = null;
63143       var suppressMenu = true;
63144       var tolerance = 4;
63145       var p1 = null;
63146
63147
63148       function point() {
63149           return mouse(context.container().node());
63150       }
63151
63152
63153       function keydown() {
63154           var e = event;
63155           if (e && e.shiftKey) {
63156               context.surface()
63157                   .classed('behavior-multiselect', true);
63158           }
63159
63160           if (e && e.keyCode === 93) {  // context menu
63161               e.preventDefault();
63162               e.stopPropagation();
63163           }
63164       }
63165
63166
63167       function keyup() {
63168           var e = event;
63169           if (!e || !e.shiftKey) {
63170               context.surface()
63171                   .classed('behavior-multiselect', false);
63172           }
63173
63174
63175           if (e && e.keyCode === 93) {  // context menu
63176               e.preventDefault();
63177               e.stopPropagation();
63178               contextmenu();
63179           }
63180       }
63181
63182
63183       function mousedown() {
63184           if (!p1) p1 = point();
63185           select(window)
63186               .on('mouseup.select', mouseup, true);
63187
63188           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
63189           suppressMenu = !isShowAlways;
63190       }
63191
63192
63193       function mousemove() {
63194           if (event) lastMouse = event;
63195       }
63196
63197
63198       function mouseup() {
63199           click();
63200       }
63201
63202
63203       function contextmenu() {
63204           var e = event;
63205           e.preventDefault();
63206           e.stopPropagation();
63207
63208           if (!+e.clientX && !+e.clientY) {
63209               if (lastMouse) {
63210                   e.sourceEvent = lastMouse;
63211               } else {
63212                   return;
63213               }
63214           }
63215
63216           if (!p1) p1 = point();
63217           suppressMenu = false;
63218           click();
63219       }
63220
63221
63222       function click() {
63223           select(window)
63224               .on('mouseup.select', null, true);
63225
63226           if (!p1) return;
63227           var p2 = point();
63228           var dist = geoVecLength(p1, p2);
63229
63230           p1 = null;
63231           if (dist > tolerance) {
63232               return;
63233           }
63234
63235           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
63236           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
63237           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
63238           var mode = context.mode();
63239
63240           var entity = datum && datum.properties && datum.properties.entity;
63241           if (entity) datum = entity;
63242
63243           if (datum && datum.type === 'midpoint') {
63244               datum = datum.parents[0];
63245           }
63246
63247           if (datum instanceof osmEntity) {    // clicked an entity..
63248               var selectedIDs = context.selectedIDs();
63249               context.selectedNoteID(null);
63250               context.selectedErrorID(null);
63251
63252               if (!isMultiselect) {
63253                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
63254                       // multiple things already selected, just show the menu...
63255                       mode.suppressMenu(false).reselect();
63256                   } else {
63257                       // select a single thing..
63258                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
63259                   }
63260
63261               } else {
63262                   if (selectedIDs.indexOf(datum.id) !== -1) {
63263                       // clicked entity is already in the selectedIDs list..
63264                       if (!suppressMenu && !isShowAlways) {
63265                           // don't deselect clicked entity, just show the menu.
63266                           mode.suppressMenu(false).reselect();
63267                       } else {
63268                           // deselect clicked entity, then reenter select mode or return to browse mode..
63269                           selectedIDs = without(selectedIDs, datum.id);
63270                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
63271                       }
63272                   } else {
63273                       // clicked entity is not in the selected list, add it..
63274                       selectedIDs = selectedIDs.concat([datum.id]);
63275                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
63276                   }
63277               }
63278
63279           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
63280               context
63281                   .selectedNoteID(null)
63282                   .enter(modeSelectData(context, datum));
63283
63284           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
63285               context
63286                   .selectedNoteID(datum.id)
63287                   .enter(modeSelectNote(context, datum.id));
63288           } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
63289               context
63290                   .selectedErrorID(datum.id)
63291                   .enter(modeSelectError(context, datum.id, datum.service));
63292           } else {    // clicked nothing..
63293               context.selectedNoteID(null);
63294               context.selectedErrorID(null);
63295               if (!isMultiselect && mode.id !== 'browse') {
63296                   context.enter(modeBrowse(context));
63297               }
63298           }
63299
63300           // reset for next time..
63301           suppressMenu = true;
63302       }
63303
63304
63305       function behavior(selection) {
63306           lastMouse = null;
63307           suppressMenu = true;
63308           p1 = null;
63309
63310           select(window)
63311               .on('keydown.select', keydown)
63312               .on('keyup.select', keyup)
63313               .on('contextmenu.select-window', function() {
63314                   // Edge and IE really like to show the contextmenu on the
63315                   // menubar when user presses a keyboard menu button
63316                   // even after we've already preventdefaulted the key event.
63317                   var e = event;
63318                   if (+e.clientX === 0 && +e.clientY === 0) {
63319                       event.preventDefault();
63320                       event.stopPropagation();
63321                   }
63322               });
63323
63324           selection
63325               .on('mousedown.select', mousedown)
63326               .on('mousemove.select', mousemove)
63327               .on('contextmenu.select', contextmenu);
63328
63329           if (event && event.shiftKey) {
63330               context.surface()
63331                   .classed('behavior-multiselect', true);
63332           }
63333       }
63334
63335
63336       behavior.off = function(selection) {
63337           select(window)
63338               .on('keydown.select', null)
63339               .on('keyup.select', null)
63340               .on('contextmenu.select-window', null)
63341               .on('mouseup.select', null, true);
63342
63343           selection
63344               .on('mousedown.select', null)
63345               .on('mousemove.select', null)
63346               .on('contextmenu.select', null);
63347
63348           context.surface()
63349               .classed('behavior-multiselect', false);
63350       };
63351
63352
63353       return behavior;
63354   }
63355
63356   function uiAccount(context) {
63357       var osm = context.connection();
63358
63359
63360       function update(selection) {
63361           if (!osm) return;
63362
63363           if (!osm.authenticated()) {
63364               selection.selectAll('#userLink, #logoutLink')
63365                   .classed('hide', true);
63366               return;
63367           }
63368
63369           osm.userDetails(function(err, details) {
63370               var userLink = selection.select('#userLink'),
63371                   logoutLink = selection.select('#logoutLink');
63372
63373               userLink.html('');
63374               logoutLink.html('');
63375
63376               if (err) return;
63377
63378               selection.selectAll('#userLink, #logoutLink')
63379                   .classed('hide', false);
63380
63381               // Link
63382               userLink.append('a')
63383                   .attr('href', osm.userURL(details.display_name))
63384                   .attr('target', '_blank');
63385
63386               // Add thumbnail or dont
63387               if (details.image_url) {
63388                   userLink.append('img')
63389                       .attr('class', 'icon pre-text user-icon')
63390                       .attr('src', details.image_url);
63391               } else {
63392                   userLink
63393                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
63394               }
63395
63396               // Add user name
63397               userLink.append('span')
63398                   .attr('class', 'label')
63399                   .text(details.display_name);
63400
63401               logoutLink.append('a')
63402                   .attr('class', 'logout')
63403                   .attr('href', '#')
63404                   .text(t('logout'))
63405                   .on('click.logout', function() {
63406                       event.preventDefault();
63407                       osm.logout();
63408                   });
63409           });
63410       }
63411
63412
63413       return function(selection) {
63414           selection.append('li')
63415               .attr('id', 'logoutLink')
63416               .classed('hide', true);
63417
63418           selection.append('li')
63419               .attr('id', 'userLink')
63420               .classed('hide', true);
63421
63422           if (osm) {
63423               osm.on('change.account', function() { update(selection); });
63424               update(selection);
63425           }
63426       };
63427   }
63428
63429   function uiAttribution(context) {
63430       var selection;
63431
63432
63433       function attribution(data, klass) {
63434           var div = selection.selectAll('.' + klass)
63435               .data([0]);
63436
63437           div = div.enter()
63438               .append('div')
63439               .attr('class', klass)
63440               .merge(div);
63441
63442
63443           var background = div.selectAll('.attribution')
63444               .data(data, function(d) { return d.name(); });
63445
63446           background.exit()
63447               .remove();
63448
63449           background = background.enter()
63450               .append('span')
63451               .attr('class', 'attribution')
63452               .each(function(d) {
63453                   if (d.terms_html) {
63454                       select(this)
63455                           .html(d.terms_html);
63456                       return;
63457                   }
63458
63459                   var selection;
63460                   if (d.terms_url) {
63461                       selection = select(this)
63462                           .append('a')
63463                           .attr('href', d.terms_url)
63464                           .attr('target', '_blank');
63465                   } else {
63466                       selection = select(this);
63467                   }
63468
63469
63470                   var id_safe = d.id.replace(/\./g, '<TX_DOT>');
63471                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
63472                       { default: d.terms_text || d.id || d.name() }
63473                   );
63474
63475                   if (d.icon && !d.overlay) {
63476                       selection
63477                           .append('img')
63478                           .attr('class', 'source-image')
63479                           .attr('src', d.icon);
63480                   }
63481
63482                   selection
63483                       .append('span')
63484                       .attr('class', 'attribution-text')
63485                       .text(terms_text);
63486               })
63487               .merge(background);
63488
63489
63490           var copyright = background.selectAll('.copyright-notice')
63491               .data(function(d) {
63492                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
63493                   return notice ? [notice] : [];
63494               });
63495
63496           copyright.exit()
63497               .remove();
63498
63499           copyright = copyright.enter()
63500               .append('span')
63501               .attr('class', 'copyright-notice')
63502               .merge(copyright);
63503
63504           copyright
63505               .text(String);
63506       }
63507
63508
63509       function update() {
63510           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
63511           attribution(context.background().overlayLayerSources().filter(function (s) {
63512               return s.validZoom(context.map().zoom());
63513           }), 'overlay-layer-attribution');
63514       }
63515
63516
63517       return function(select) {
63518           selection = select;
63519
63520           context.background()
63521               .on('change.attribution', update);
63522
63523           context.map()
63524               .on('move.attribution', throttle(update, 400, {leading: false}));
63525
63526           update();
63527       };
63528   }
63529
63530   // toggles the visibility of ui elements, using a combination of the
63531   // hide class, which sets display=none, and a d3 transition for opacity.
63532   // this will cause blinking when called repeatedly, so check that the
63533   // value actually changes between calls.
63534   function uiToggle(show, callback) {
63535       return function(selection) {
63536           selection
63537               .style('opacity', show ? 0 : 1)
63538               .classed('hide', false)
63539               .transition()
63540               .style('opacity', show ? 1 : 0)
63541               .on('end', function() {
63542                   select(this)
63543                       .classed('hide', !show)
63544                       .style('opacity', null);
63545                   if (callback) callback.apply(this);
63546               });
63547       };
63548   }
63549
63550   function uiDisclosure(context, key, expandedDefault) {
63551       var dispatch$1 = dispatch('toggled');
63552       var _preference = (context.storage('disclosure.' + key + '.expanded'));
63553       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
63554       var _title;
63555       var _updatePreference = true;
63556       var _content = function () {};
63557
63558
63559       var disclosure = function(selection) {
63560           var hideToggle = selection.selectAll('.hide-toggle-' + key)
63561               .data([0]);
63562
63563           // enter
63564           var hideToggleEnter = hideToggle.enter()
63565               .append('a')
63566               .attr('href', '#')
63567               .attr('class', 'hide-toggle hide-toggle-' + key)
63568               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
63569
63570           hideToggleEnter
63571               .append('span')
63572               .attr('class', 'hide-toggle-text');
63573
63574           // update
63575           hideToggle = hideToggleEnter
63576               .merge(hideToggle);
63577
63578           hideToggle
63579               .on('click', toggle)
63580               .classed('expanded', _expanded);
63581
63582           hideToggle.selectAll('.hide-toggle-text')
63583               .text(_title);
63584
63585           hideToggle.selectAll('.hide-toggle-icon')
63586               .attr('xlink:href', _expanded ? '#iD-icon-down'
63587                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
63588               );
63589
63590
63591           var wrap = selection.selectAll('.disclosure-wrap')
63592               .data([0]);
63593
63594           // enter/update
63595           wrap = wrap.enter()
63596               .append('div')
63597               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
63598               .merge(wrap)
63599               .classed('hide', !_expanded);
63600
63601           if (_expanded) {
63602               wrap
63603                   .call(_content);
63604           }
63605
63606
63607           function toggle() {
63608               event.preventDefault();
63609
63610               _expanded = !_expanded;
63611
63612               if (_updatePreference) {
63613                   context.storage('disclosure.' + key + '.expanded', _expanded);
63614               }
63615
63616               hideToggle
63617                   .classed('expanded', _expanded);
63618
63619               hideToggle.selectAll('.hide-toggle-icon')
63620                   .attr('xlink:href', _expanded ? '#iD-icon-down'
63621                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
63622                   );
63623
63624               if (_expanded) {
63625                   wrap
63626                       .call(_content);
63627               }
63628
63629               wrap
63630                   .call(uiToggle(_expanded));
63631
63632               dispatch$1.call('toggled', this, _expanded);
63633           }
63634       };
63635
63636
63637       disclosure.title = function(val) {
63638           if (!arguments.length) return _title;
63639           _title = val;
63640           return disclosure;
63641       };
63642
63643
63644       disclosure.expanded = function(val) {
63645           if (!arguments.length) return _expanded;
63646           _expanded = val;
63647           return disclosure;
63648       };
63649
63650
63651       disclosure.updatePreference = function(val) {
63652           if (!arguments.length) return _updatePreference;
63653           _updatePreference = val;
63654           return disclosure;
63655       };
63656
63657
63658       disclosure.content = function(val) {
63659           if (!arguments.length) return _content;
63660           _content = val;
63661           return disclosure;
63662       };
63663
63664
63665       return utilRebind(disclosure, dispatch$1, 'on');
63666   }
63667
63668   function uiBackgroundDisplayOptions(context) {
63669       var detected = utilDetect();
63670       var storedOpacity = context.storage('background-opacity');
63671       var minVal = 0.25;
63672       var maxVal = detected.cssfilters ? 2 : 1;
63673
63674       var sliders = detected.cssfilters
63675           ? ['brightness', 'contrast', 'saturation', 'sharpness']
63676           : ['brightness'];
63677
63678       var _options = {
63679           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
63680           contrast: 1,
63681           saturation: 1,
63682           sharpness: 1
63683       };
63684
63685       var _selection = select(null);
63686
63687
63688       function clamp(x, min, max) {
63689           return Math.max(min, Math.min(x, max));
63690       }
63691
63692
63693       function updateValue(d, val) {
63694           if (!val && event && event.target) {
63695               val = event.target.value;
63696           }
63697
63698           val = clamp(val, minVal, maxVal);
63699
63700           _options[d] = val;
63701           context.background()[d](val);
63702
63703           if (d === 'brightness') {
63704               context.storage('background-opacity', val);
63705           }
63706
63707           _selection
63708               .call(render);
63709       }
63710
63711
63712       function render(selection) {
63713           var container = selection.selectAll('.display-options-container')
63714               .data([0]);
63715
63716           var containerEnter = container.enter()
63717               .append('div')
63718               .attr('class', 'display-options-container controls-list');
63719
63720           // add slider controls
63721           var slidersEnter = containerEnter.selectAll('.display-control')
63722               .data(sliders)
63723               .enter()
63724               .append('div')
63725               .attr('class', function(d) { return 'display-control display-control-' + d; });
63726
63727           slidersEnter
63728               .append('h5')
63729               .text(function(d) { return t('background.' + d); })
63730               .append('span')
63731               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
63732
63733           slidersEnter
63734               .append('input')
63735               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
63736               .attr('type', 'range')
63737               .attr('min', minVal)
63738               .attr('max', maxVal)
63739               .attr('step', '0.05')
63740               .on('input', function(d) {
63741                   var val = select(this).property('value');
63742                   updateValue(d, val);
63743               });
63744
63745           slidersEnter
63746               .append('button')
63747               .attr('title', t('background.reset'))
63748               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
63749               .on('click', function(d) {
63750                   if (event.button !== 0) return;
63751                   updateValue(d, 1);
63752               })
63753               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
63754
63755
63756           // update
63757           container = containerEnter
63758               .merge(container);
63759
63760           container.selectAll('.display-option-input')
63761               .property('value', function(d) { return _options[d]; });
63762
63763           container.selectAll('.display-option-value')
63764               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
63765
63766           container.selectAll('.display-option-reset')
63767               .classed('disabled', function(d) { return _options[d] === 1; });
63768
63769           // first time only, set brightness if needed
63770           if (containerEnter.size() && _options.brightness !== 1) {
63771               context.background().brightness(_options.brightness);
63772           }
63773       }
63774
63775
63776       function backgroundDisplayOptions(selection) {
63777           _selection = selection;
63778
63779           selection
63780               .call(uiDisclosure(context, 'background_display_options', true)
63781                   .title(t('background.display_options'))
63782                   .content(render)
63783               );
63784       }
63785
63786
63787       return backgroundDisplayOptions;
63788   }
63789
63790   function uiBackgroundOffset(context) {
63791       var directions = [
63792           ['right', [0.5, 0]],
63793           ['top', [0, -0.5]],
63794           ['left', [-0.5, 0]],
63795           ['bottom', [0, 0.5]]
63796       ];
63797
63798
63799       function d3_eventCancel() {
63800           event.stopPropagation();
63801           event.preventDefault();
63802       }
63803
63804
63805       function updateValue() {
63806           var meters = geoOffsetToMeters(context.background().offset());
63807           var x = +meters[0].toFixed(2);
63808           var y = +meters[1].toFixed(2);
63809
63810           d3_selectAll('.nudge-inner-rect')
63811               .select('input')
63812               .classed('error', false)
63813               .property('value', x + ', ' + y);
63814
63815           d3_selectAll('.nudge-reset')
63816               .classed('disabled', function() {
63817                   return (x === 0 && y === 0);
63818               });
63819       }
63820
63821
63822       function resetOffset() {
63823           context.background().offset([0, 0]);
63824           updateValue();
63825       }
63826
63827
63828       function nudge(d) {
63829           context.background().nudge(d, context.map().zoom());
63830           updateValue();
63831       }
63832
63833
63834       function clickNudgeButton(d) {
63835           var interval;
63836           var timeout = window.setTimeout(function() {
63837                   interval = window.setInterval(nudge.bind(null, d), 100);
63838               }, 500);
63839
63840           function doneNudge() {
63841               window.clearTimeout(timeout);
63842               window.clearInterval(interval);
63843               select(window)
63844                   .on('mouseup.buttonoffset', null, true)
63845                   .on('mousedown.buttonoffset', null, true);
63846           }
63847
63848           select(window)
63849               .on('mouseup.buttonoffset', doneNudge, true)
63850               .on('mousedown.buttonoffset', doneNudge, true);
63851
63852           nudge(d);
63853       }
63854
63855
63856       function inputOffset() {
63857           var input = select(this);
63858           var d = input.node().value;
63859
63860           if (d === '') return resetOffset();
63861
63862           d = d.replace(/;/g, ',').split(',').map(function(n) {
63863               // if n is NaN, it will always get mapped to false.
63864               return !isNaN(n) && n;
63865           });
63866
63867           if (d.length !== 2 || !d[0] || !d[1]) {
63868               input.classed('error', true);
63869               return;
63870           }
63871
63872           context.background().offset(geoMetersToOffset(d));
63873           updateValue();
63874       }
63875
63876
63877       function dragOffset() {
63878           event.preventDefault();
63879           if (event.button !== 0) return;
63880
63881           var origin = [event.clientX, event.clientY];
63882
63883           context.container()
63884               .append('div')
63885               .attr('class', 'nudge-surface');
63886
63887           select(window)
63888               .on('mousemove.offset', function() {
63889                   var latest = [event.clientX, event.clientY];
63890                   var d = [
63891                       -(origin[0] - latest[0]) / 4,
63892                       -(origin[1] - latest[1]) / 4
63893                   ];
63894
63895                   origin = latest;
63896                   nudge(d);
63897               })
63898               .on('mouseup.offset', function() {
63899                   if (event.button !== 0) return;
63900                   d3_selectAll('.nudge-surface')
63901                       .remove();
63902
63903                   select(window)
63904                       .on('mousemove.offset', null)
63905                       .on('mouseup.offset', null);
63906               });
63907       }
63908
63909
63910       function render(selection) {
63911           var container = selection.selectAll('.nudge-container')
63912               .data([0]);
63913
63914           var containerEnter = container.enter()
63915               .append('div')
63916               .attr('class', 'nudge-container cf');
63917
63918           containerEnter
63919               .append('div')
63920               .attr('class', 'nudge-instructions')
63921               .text(t('background.offset'));
63922
63923           var nudgeEnter = containerEnter
63924               .append('div')
63925               .attr('class', 'nudge-outer-rect')
63926               .on('mousedown', dragOffset);
63927
63928           nudgeEnter
63929               .append('div')
63930               .attr('class', 'nudge-inner-rect')
63931               .append('input')
63932               .on('change', inputOffset);
63933
63934           containerEnter
63935               .append('div')
63936               .selectAll('button')
63937               .data(directions).enter()
63938               .append('button')
63939               .attr('class', function(d) { return d[0] + ' nudge'; })
63940               .on('contextmenu', d3_eventCancel)
63941               .on('mousedown', function(d) {
63942                   if (event.button !== 0) return;
63943                   clickNudgeButton(d[1]);
63944               });
63945
63946           containerEnter
63947               .append('button')
63948               .attr('title', t('background.reset'))
63949               .attr('class', 'nudge-reset disabled')
63950               .on('contextmenu', d3_eventCancel)
63951               .on('click', function() {
63952                   if (event.button !== 0) return;
63953                   resetOffset();
63954               })
63955               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
63956
63957           updateValue();
63958       }
63959
63960
63961       function backgroundOffset(selection) {
63962           selection
63963               .call(uiDisclosure(context, 'background_offset', false)
63964                   .title(t('background.fix_misalignment'))
63965                   .content(render)
63966               );
63967       }
63968
63969
63970       context.background()
63971           .on('change.backgroundOffset-update', updateValue);
63972
63973       return backgroundOffset;
63974   }
63975
63976   var marked = createCommonjsModule(function (module, exports) {
63977   (function(root) {
63978
63979   /**
63980    * Block-Level Grammar
63981    */
63982
63983   var block = {
63984     newline: /^\n+/,
63985     code: /^( {4}[^\n]+\n*)+/,
63986     fences: noop,
63987     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
63988     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
63989     nptable: noop,
63990     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
63991     list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
63992     html: '^ {0,3}(?:' // optional indentation
63993       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
63994       + '|comment[^\\n]*(\\n+|$)' // (2)
63995       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
63996       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
63997       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
63998       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
63999       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
64000       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
64001       + ')',
64002     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
64003     table: noop,
64004     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
64005     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
64006     text: /^[^\n]+/
64007   };
64008
64009   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
64010   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
64011   block.def = edit(block.def)
64012     .replace('label', block._label)
64013     .replace('title', block._title)
64014     .getRegex();
64015
64016   block.bullet = /(?:[*+-]|\d{1,9}\.)/;
64017   block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
64018   block.item = edit(block.item, 'gm')
64019     .replace(/bull/g, block.bullet)
64020     .getRegex();
64021
64022   block.list = edit(block.list)
64023     .replace(/bull/g, block.bullet)
64024     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
64025     .replace('def', '\\n+(?=' + block.def.source + ')')
64026     .getRegex();
64027
64028   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
64029     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
64030     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
64031     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
64032     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
64033     + '|track|ul';
64034   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
64035   block.html = edit(block.html, 'i')
64036     .replace('comment', block._comment)
64037     .replace('tag', block._tag)
64038     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
64039     .getRegex();
64040
64041   block.paragraph = edit(block.paragraph)
64042     .replace('hr', block.hr)
64043     .replace('heading', block.heading)
64044     .replace('lheading', block.lheading)
64045     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
64046     .getRegex();
64047
64048   block.blockquote = edit(block.blockquote)
64049     .replace('paragraph', block.paragraph)
64050     .getRegex();
64051
64052   /**
64053    * Normal Block Grammar
64054    */
64055
64056   block.normal = merge({}, block);
64057
64058   /**
64059    * GFM Block Grammar
64060    */
64061
64062   block.gfm = merge({}, block.normal, {
64063     fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
64064     paragraph: /^/,
64065     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
64066   });
64067
64068   block.gfm.paragraph = edit(block.paragraph)
64069     .replace('(?!', '(?!'
64070       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
64071       + block.list.source.replace('\\1', '\\3') + '|')
64072     .getRegex();
64073
64074   /**
64075    * GFM + Tables Block Grammar
64076    */
64077
64078   block.tables = merge({}, block.gfm, {
64079     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
64080     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
64081   });
64082
64083   /**
64084    * Pedantic grammar
64085    */
64086
64087   block.pedantic = merge({}, block.normal, {
64088     html: edit(
64089       '^ *(?:comment *(?:\\n|\\s*$)'
64090       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
64091       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
64092       .replace('comment', block._comment)
64093       .replace(/tag/g, '(?!(?:'
64094         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
64095         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
64096         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
64097       .getRegex(),
64098     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
64099   });
64100
64101   /**
64102    * Block Lexer
64103    */
64104
64105   function Lexer(options) {
64106     this.tokens = [];
64107     this.tokens.links = Object.create(null);
64108     this.options = options || marked.defaults;
64109     this.rules = block.normal;
64110
64111     if (this.options.pedantic) {
64112       this.rules = block.pedantic;
64113     } else if (this.options.gfm) {
64114       if (this.options.tables) {
64115         this.rules = block.tables;
64116       } else {
64117         this.rules = block.gfm;
64118       }
64119     }
64120   }
64121
64122   /**
64123    * Expose Block Rules
64124    */
64125
64126   Lexer.rules = block;
64127
64128   /**
64129    * Static Lex Method
64130    */
64131
64132   Lexer.lex = function(src, options) {
64133     var lexer = new Lexer(options);
64134     return lexer.lex(src);
64135   };
64136
64137   /**
64138    * Preprocessing
64139    */
64140
64141   Lexer.prototype.lex = function(src) {
64142     src = src
64143       .replace(/\r\n|\r/g, '\n')
64144       .replace(/\t/g, '    ')
64145       .replace(/\u00a0/g, ' ')
64146       .replace(/\u2424/g, '\n');
64147
64148     return this.token(src, true);
64149   };
64150
64151   /**
64152    * Lexing
64153    */
64154
64155   Lexer.prototype.token = function(src, top) {
64156     src = src.replace(/^ +$/gm, '');
64157     var next,
64158         loose,
64159         cap,
64160         bull,
64161         b,
64162         item,
64163         listStart,
64164         listItems,
64165         t,
64166         space,
64167         i,
64168         tag,
64169         l,
64170         isordered,
64171         istask,
64172         ischecked;
64173
64174     while (src) {
64175       // newline
64176       if (cap = this.rules.newline.exec(src)) {
64177         src = src.substring(cap[0].length);
64178         if (cap[0].length > 1) {
64179           this.tokens.push({
64180             type: 'space'
64181           });
64182         }
64183       }
64184
64185       // code
64186       if (cap = this.rules.code.exec(src)) {
64187         src = src.substring(cap[0].length);
64188         cap = cap[0].replace(/^ {4}/gm, '');
64189         this.tokens.push({
64190           type: 'code',
64191           text: !this.options.pedantic
64192             ? rtrim(cap, '\n')
64193             : cap
64194         });
64195         continue;
64196       }
64197
64198       // fences (gfm)
64199       if (cap = this.rules.fences.exec(src)) {
64200         src = src.substring(cap[0].length);
64201         this.tokens.push({
64202           type: 'code',
64203           lang: cap[2] ? cap[2].trim() : cap[2],
64204           text: cap[3] || ''
64205         });
64206         continue;
64207       }
64208
64209       // heading
64210       if (cap = this.rules.heading.exec(src)) {
64211         src = src.substring(cap[0].length);
64212         this.tokens.push({
64213           type: 'heading',
64214           depth: cap[1].length,
64215           text: cap[2]
64216         });
64217         continue;
64218       }
64219
64220       // table no leading pipe (gfm)
64221       if (top && (cap = this.rules.nptable.exec(src))) {
64222         item = {
64223           type: 'table',
64224           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
64225           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
64226           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
64227         };
64228
64229         if (item.header.length === item.align.length) {
64230           src = src.substring(cap[0].length);
64231
64232           for (i = 0; i < item.align.length; i++) {
64233             if (/^ *-+: *$/.test(item.align[i])) {
64234               item.align[i] = 'right';
64235             } else if (/^ *:-+: *$/.test(item.align[i])) {
64236               item.align[i] = 'center';
64237             } else if (/^ *:-+ *$/.test(item.align[i])) {
64238               item.align[i] = 'left';
64239             } else {
64240               item.align[i] = null;
64241             }
64242           }
64243
64244           for (i = 0; i < item.cells.length; i++) {
64245             item.cells[i] = splitCells(item.cells[i], item.header.length);
64246           }
64247
64248           this.tokens.push(item);
64249
64250           continue;
64251         }
64252       }
64253
64254       // hr
64255       if (cap = this.rules.hr.exec(src)) {
64256         src = src.substring(cap[0].length);
64257         this.tokens.push({
64258           type: 'hr'
64259         });
64260         continue;
64261       }
64262
64263       // blockquote
64264       if (cap = this.rules.blockquote.exec(src)) {
64265         src = src.substring(cap[0].length);
64266
64267         this.tokens.push({
64268           type: 'blockquote_start'
64269         });
64270
64271         cap = cap[0].replace(/^ *> ?/gm, '');
64272
64273         // Pass `top` to keep the current
64274         // "toplevel" state. This is exactly
64275         // how markdown.pl works.
64276         this.token(cap, top);
64277
64278         this.tokens.push({
64279           type: 'blockquote_end'
64280         });
64281
64282         continue;
64283       }
64284
64285       // list
64286       if (cap = this.rules.list.exec(src)) {
64287         src = src.substring(cap[0].length);
64288         bull = cap[2];
64289         isordered = bull.length > 1;
64290
64291         listStart = {
64292           type: 'list_start',
64293           ordered: isordered,
64294           start: isordered ? +bull : '',
64295           loose: false
64296         };
64297
64298         this.tokens.push(listStart);
64299
64300         // Get each top-level item.
64301         cap = cap[0].match(this.rules.item);
64302
64303         listItems = [];
64304         next = false;
64305         l = cap.length;
64306         i = 0;
64307
64308         for (; i < l; i++) {
64309           item = cap[i];
64310
64311           // Remove the list item's bullet
64312           // so it is seen as the next token.
64313           space = item.length;
64314           item = item.replace(/^ *([*+-]|\d+\.) */, '');
64315
64316           // Outdent whatever the
64317           // list item contains. Hacky.
64318           if (~item.indexOf('\n ')) {
64319             space -= item.length;
64320             item = !this.options.pedantic
64321               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
64322               : item.replace(/^ {1,4}/gm, '');
64323           }
64324
64325           // Determine whether the next list item belongs here.
64326           // Backpedal if it does not belong in this list.
64327           if (i !== l - 1) {
64328             b = block.bullet.exec(cap[i + 1])[0];
64329             if (bull.length > 1 ? b.length === 1
64330               : (b.length > 1 || (this.options.smartLists && b !== bull))) {
64331               src = cap.slice(i + 1).join('\n') + src;
64332               i = l - 1;
64333             }
64334           }
64335
64336           // Determine whether item is loose or not.
64337           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
64338           // for discount behavior.
64339           loose = next || /\n\n(?!\s*$)/.test(item);
64340           if (i !== l - 1) {
64341             next = item.charAt(item.length - 1) === '\n';
64342             if (!loose) loose = next;
64343           }
64344
64345           if (loose) {
64346             listStart.loose = true;
64347           }
64348
64349           // Check for task list items
64350           istask = /^\[[ xX]\] /.test(item);
64351           ischecked = undefined;
64352           if (istask) {
64353             ischecked = item[1] !== ' ';
64354             item = item.replace(/^\[[ xX]\] +/, '');
64355           }
64356
64357           t = {
64358             type: 'list_item_start',
64359             task: istask,
64360             checked: ischecked,
64361             loose: loose
64362           };
64363
64364           listItems.push(t);
64365           this.tokens.push(t);
64366
64367           // Recurse.
64368           this.token(item, false);
64369
64370           this.tokens.push({
64371             type: 'list_item_end'
64372           });
64373         }
64374
64375         if (listStart.loose) {
64376           l = listItems.length;
64377           i = 0;
64378           for (; i < l; i++) {
64379             listItems[i].loose = true;
64380           }
64381         }
64382
64383         this.tokens.push({
64384           type: 'list_end'
64385         });
64386
64387         continue;
64388       }
64389
64390       // html
64391       if (cap = this.rules.html.exec(src)) {
64392         src = src.substring(cap[0].length);
64393         this.tokens.push({
64394           type: this.options.sanitize
64395             ? 'paragraph'
64396             : 'html',
64397           pre: !this.options.sanitizer
64398             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
64399           text: cap[0]
64400         });
64401         continue;
64402       }
64403
64404       // def
64405       if (top && (cap = this.rules.def.exec(src))) {
64406         src = src.substring(cap[0].length);
64407         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
64408         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
64409         if (!this.tokens.links[tag]) {
64410           this.tokens.links[tag] = {
64411             href: cap[2],
64412             title: cap[3]
64413           };
64414         }
64415         continue;
64416       }
64417
64418       // table (gfm)
64419       if (top && (cap = this.rules.table.exec(src))) {
64420         item = {
64421           type: 'table',
64422           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
64423           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
64424           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
64425         };
64426
64427         if (item.header.length === item.align.length) {
64428           src = src.substring(cap[0].length);
64429
64430           for (i = 0; i < item.align.length; i++) {
64431             if (/^ *-+: *$/.test(item.align[i])) {
64432               item.align[i] = 'right';
64433             } else if (/^ *:-+: *$/.test(item.align[i])) {
64434               item.align[i] = 'center';
64435             } else if (/^ *:-+ *$/.test(item.align[i])) {
64436               item.align[i] = 'left';
64437             } else {
64438               item.align[i] = null;
64439             }
64440           }
64441
64442           for (i = 0; i < item.cells.length; i++) {
64443             item.cells[i] = splitCells(
64444               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
64445               item.header.length);
64446           }
64447
64448           this.tokens.push(item);
64449
64450           continue;
64451         }
64452       }
64453
64454       // lheading
64455       if (cap = this.rules.lheading.exec(src)) {
64456         src = src.substring(cap[0].length);
64457         this.tokens.push({
64458           type: 'heading',
64459           depth: cap[2] === '=' ? 1 : 2,
64460           text: cap[1]
64461         });
64462         continue;
64463       }
64464
64465       // top-level paragraph
64466       if (top && (cap = this.rules.paragraph.exec(src))) {
64467         src = src.substring(cap[0].length);
64468         this.tokens.push({
64469           type: 'paragraph',
64470           text: cap[1].charAt(cap[1].length - 1) === '\n'
64471             ? cap[1].slice(0, -1)
64472             : cap[1]
64473         });
64474         continue;
64475       }
64476
64477       // text
64478       if (cap = this.rules.text.exec(src)) {
64479         // Top-level should never reach here.
64480         src = src.substring(cap[0].length);
64481         this.tokens.push({
64482           type: 'text',
64483           text: cap[0]
64484         });
64485         continue;
64486       }
64487
64488       if (src) {
64489         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
64490       }
64491     }
64492
64493     return this.tokens;
64494   };
64495
64496   /**
64497    * Inline-Level Grammar
64498    */
64499
64500   var inline = {
64501     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
64502     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
64503     url: noop,
64504     tag: '^comment'
64505       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
64506       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
64507       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
64508       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
64509       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
64510     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
64511     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
64512     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
64513     strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
64514     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
64515     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
64516     br: /^( {2,}|\\)\n(?!\s*$)/,
64517     del: noop,
64518     text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
64519   };
64520
64521   // list of punctuation marks from common mark spec
64522   // without ` and ] to workaround Rule 17 (inline code blocks/links)
64523   inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
64524   inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
64525
64526   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
64527
64528   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
64529   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])?)+(?![-_])/;
64530   inline.autolink = edit(inline.autolink)
64531     .replace('scheme', inline._scheme)
64532     .replace('email', inline._email)
64533     .getRegex();
64534
64535   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
64536
64537   inline.tag = edit(inline.tag)
64538     .replace('comment', block._comment)
64539     .replace('attribute', inline._attribute)
64540     .getRegex();
64541
64542   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
64543   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/;
64544   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
64545
64546   inline.link = edit(inline.link)
64547     .replace('label', inline._label)
64548     .replace('href', inline._href)
64549     .replace('title', inline._title)
64550     .getRegex();
64551
64552   inline.reflink = edit(inline.reflink)
64553     .replace('label', inline._label)
64554     .getRegex();
64555
64556   /**
64557    * Normal Inline Grammar
64558    */
64559
64560   inline.normal = merge({}, inline);
64561
64562   /**
64563    * Pedantic Inline Grammar
64564    */
64565
64566   inline.pedantic = merge({}, inline.normal, {
64567     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
64568     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
64569     link: edit(/^!?\[(label)\]\((.*?)\)/)
64570       .replace('label', inline._label)
64571       .getRegex(),
64572     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
64573       .replace('label', inline._label)
64574       .getRegex()
64575   });
64576
64577   /**
64578    * GFM Inline Grammar
64579    */
64580
64581   inline.gfm = merge({}, inline.normal, {
64582     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
64583     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
64584     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
64585     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
64586     del: /^~+(?=\S)([\s\S]*?\S)~+/,
64587     text: edit(inline.text)
64588       .replace(']|', '~]|')
64589       .replace('|$', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|$')
64590       .getRegex()
64591   });
64592
64593   inline.gfm.url = edit(inline.gfm.url, 'i')
64594     .replace('email', inline.gfm._extended_email)
64595     .getRegex();
64596   /**
64597    * GFM + Line Breaks Inline Grammar
64598    */
64599
64600   inline.breaks = merge({}, inline.gfm, {
64601     br: edit(inline.br).replace('{2,}', '*').getRegex(),
64602     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
64603   });
64604
64605   /**
64606    * Inline Lexer & Compiler
64607    */
64608
64609   function InlineLexer(links, options) {
64610     this.options = options || marked.defaults;
64611     this.links = links;
64612     this.rules = inline.normal;
64613     this.renderer = this.options.renderer || new Renderer();
64614     this.renderer.options = this.options;
64615
64616     if (!this.links) {
64617       throw new Error('Tokens array requires a `links` property.');
64618     }
64619
64620     if (this.options.pedantic) {
64621       this.rules = inline.pedantic;
64622     } else if (this.options.gfm) {
64623       if (this.options.breaks) {
64624         this.rules = inline.breaks;
64625       } else {
64626         this.rules = inline.gfm;
64627       }
64628     }
64629   }
64630
64631   /**
64632    * Expose Inline Rules
64633    */
64634
64635   InlineLexer.rules = inline;
64636
64637   /**
64638    * Static Lexing/Compiling Method
64639    */
64640
64641   InlineLexer.output = function(src, links, options) {
64642     var inline = new InlineLexer(links, options);
64643     return inline.output(src);
64644   };
64645
64646   /**
64647    * Lexing/Compiling
64648    */
64649
64650   InlineLexer.prototype.output = function(src) {
64651     var out = '',
64652         link,
64653         text,
64654         href,
64655         title,
64656         cap,
64657         prevCapZero;
64658
64659     while (src) {
64660       // escape
64661       if (cap = this.rules.escape.exec(src)) {
64662         src = src.substring(cap[0].length);
64663         out += escape(cap[1]);
64664         continue;
64665       }
64666
64667       // tag
64668       if (cap = this.rules.tag.exec(src)) {
64669         if (!this.inLink && /^<a /i.test(cap[0])) {
64670           this.inLink = true;
64671         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
64672           this.inLink = false;
64673         }
64674         if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
64675           this.inRawBlock = true;
64676         } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
64677           this.inRawBlock = false;
64678         }
64679
64680         src = src.substring(cap[0].length);
64681         out += this.options.sanitize
64682           ? this.options.sanitizer
64683             ? this.options.sanitizer(cap[0])
64684             : escape(cap[0])
64685           : cap[0];
64686         continue;
64687       }
64688
64689       // link
64690       if (cap = this.rules.link.exec(src)) {
64691         var lastParenIndex = findClosingBracket(cap[2], '()');
64692         if (lastParenIndex > -1) {
64693           var removeChars = cap[2].length - lastParenIndex;
64694           cap[2] = cap[2].substring(0, lastParenIndex);
64695           cap[0] = cap[0].substring(0, cap[0].length - removeChars);
64696         }
64697         src = src.substring(cap[0].length);
64698         this.inLink = true;
64699         href = cap[2];
64700         if (this.options.pedantic) {
64701           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
64702
64703           if (link) {
64704             href = link[1];
64705             title = link[3];
64706           } else {
64707             title = '';
64708           }
64709         } else {
64710           title = cap[3] ? cap[3].slice(1, -1) : '';
64711         }
64712         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
64713         out += this.outputLink(cap, {
64714           href: InlineLexer.escapes(href),
64715           title: InlineLexer.escapes(title)
64716         });
64717         this.inLink = false;
64718         continue;
64719       }
64720
64721       // reflink, nolink
64722       if ((cap = this.rules.reflink.exec(src))
64723           || (cap = this.rules.nolink.exec(src))) {
64724         src = src.substring(cap[0].length);
64725         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
64726         link = this.links[link.toLowerCase()];
64727         if (!link || !link.href) {
64728           out += cap[0].charAt(0);
64729           src = cap[0].substring(1) + src;
64730           continue;
64731         }
64732         this.inLink = true;
64733         out += this.outputLink(cap, link);
64734         this.inLink = false;
64735         continue;
64736       }
64737
64738       // strong
64739       if (cap = this.rules.strong.exec(src)) {
64740         src = src.substring(cap[0].length);
64741         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
64742         continue;
64743       }
64744
64745       // em
64746       if (cap = this.rules.em.exec(src)) {
64747         src = src.substring(cap[0].length);
64748         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
64749         continue;
64750       }
64751
64752       // code
64753       if (cap = this.rules.code.exec(src)) {
64754         src = src.substring(cap[0].length);
64755         out += this.renderer.codespan(escape(cap[2].trim(), true));
64756         continue;
64757       }
64758
64759       // br
64760       if (cap = this.rules.br.exec(src)) {
64761         src = src.substring(cap[0].length);
64762         out += this.renderer.br();
64763         continue;
64764       }
64765
64766       // del (gfm)
64767       if (cap = this.rules.del.exec(src)) {
64768         src = src.substring(cap[0].length);
64769         out += this.renderer.del(this.output(cap[1]));
64770         continue;
64771       }
64772
64773       // autolink
64774       if (cap = this.rules.autolink.exec(src)) {
64775         src = src.substring(cap[0].length);
64776         if (cap[2] === '@') {
64777           text = escape(this.mangle(cap[1]));
64778           href = 'mailto:' + text;
64779         } else {
64780           text = escape(cap[1]);
64781           href = text;
64782         }
64783         out += this.renderer.link(href, null, text);
64784         continue;
64785       }
64786
64787       // url (gfm)
64788       if (!this.inLink && (cap = this.rules.url.exec(src))) {
64789         if (cap[2] === '@') {
64790           text = escape(cap[0]);
64791           href = 'mailto:' + text;
64792         } else {
64793           // do extended autolink path validation
64794           do {
64795             prevCapZero = cap[0];
64796             cap[0] = this.rules._backpedal.exec(cap[0])[0];
64797           } while (prevCapZero !== cap[0]);
64798           text = escape(cap[0]);
64799           if (cap[1] === 'www.') {
64800             href = 'http://' + text;
64801           } else {
64802             href = text;
64803           }
64804         }
64805         src = src.substring(cap[0].length);
64806         out += this.renderer.link(href, null, text);
64807         continue;
64808       }
64809
64810       // text
64811       if (cap = this.rules.text.exec(src)) {
64812         src = src.substring(cap[0].length);
64813         if (this.inRawBlock) {
64814           out += this.renderer.text(cap[0]);
64815         } else {
64816           out += this.renderer.text(escape(this.smartypants(cap[0])));
64817         }
64818         continue;
64819       }
64820
64821       if (src) {
64822         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
64823       }
64824     }
64825
64826     return out;
64827   };
64828
64829   InlineLexer.escapes = function(text) {
64830     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
64831   };
64832
64833   /**
64834    * Compile Link
64835    */
64836
64837   InlineLexer.prototype.outputLink = function(cap, link) {
64838     var href = link.href,
64839         title = link.title ? escape(link.title) : null;
64840
64841     return cap[0].charAt(0) !== '!'
64842       ? this.renderer.link(href, title, this.output(cap[1]))
64843       : this.renderer.image(href, title, escape(cap[1]));
64844   };
64845
64846   /**
64847    * Smartypants Transformations
64848    */
64849
64850   InlineLexer.prototype.smartypants = function(text) {
64851     if (!this.options.smartypants) return text;
64852     return text
64853       // em-dashes
64854       .replace(/---/g, '\u2014')
64855       // en-dashes
64856       .replace(/--/g, '\u2013')
64857       // opening singles
64858       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
64859       // closing singles & apostrophes
64860       .replace(/'/g, '\u2019')
64861       // opening doubles
64862       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
64863       // closing doubles
64864       .replace(/"/g, '\u201d')
64865       // ellipses
64866       .replace(/\.{3}/g, '\u2026');
64867   };
64868
64869   /**
64870    * Mangle Links
64871    */
64872
64873   InlineLexer.prototype.mangle = function(text) {
64874     if (!this.options.mangle) return text;
64875     var out = '',
64876         l = text.length,
64877         i = 0,
64878         ch;
64879
64880     for (; i < l; i++) {
64881       ch = text.charCodeAt(i);
64882       if (Math.random() > 0.5) {
64883         ch = 'x' + ch.toString(16);
64884       }
64885       out += '&#' + ch + ';';
64886     }
64887
64888     return out;
64889   };
64890
64891   /**
64892    * Renderer
64893    */
64894
64895   function Renderer(options) {
64896     this.options = options || marked.defaults;
64897   }
64898
64899   Renderer.prototype.code = function(code, infostring, escaped) {
64900     var lang = (infostring || '').match(/\S*/)[0];
64901     if (this.options.highlight) {
64902       var out = this.options.highlight(code, lang);
64903       if (out != null && out !== code) {
64904         escaped = true;
64905         code = out;
64906       }
64907     }
64908
64909     if (!lang) {
64910       return '<pre><code>'
64911         + (escaped ? code : escape(code, true))
64912         + '</code></pre>';
64913     }
64914
64915     return '<pre><code class="'
64916       + this.options.langPrefix
64917       + escape(lang, true)
64918       + '">'
64919       + (escaped ? code : escape(code, true))
64920       + '</code></pre>\n';
64921   };
64922
64923   Renderer.prototype.blockquote = function(quote) {
64924     return '<blockquote>\n' + quote + '</blockquote>\n';
64925   };
64926
64927   Renderer.prototype.html = function(html) {
64928     return html;
64929   };
64930
64931   Renderer.prototype.heading = function(text, level, raw, slugger) {
64932     if (this.options.headerIds) {
64933       return '<h'
64934         + level
64935         + ' id="'
64936         + this.options.headerPrefix
64937         + slugger.slug(raw)
64938         + '">'
64939         + text
64940         + '</h'
64941         + level
64942         + '>\n';
64943     }
64944     // ignore IDs
64945     return '<h' + level + '>' + text + '</h' + level + '>\n';
64946   };
64947
64948   Renderer.prototype.hr = function() {
64949     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
64950   };
64951
64952   Renderer.prototype.list = function(body, ordered, start) {
64953     var type = ordered ? 'ol' : 'ul',
64954         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
64955     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
64956   };
64957
64958   Renderer.prototype.listitem = function(text) {
64959     return '<li>' + text + '</li>\n';
64960   };
64961
64962   Renderer.prototype.checkbox = function(checked) {
64963     return '<input '
64964       + (checked ? 'checked="" ' : '')
64965       + 'disabled="" type="checkbox"'
64966       + (this.options.xhtml ? ' /' : '')
64967       + '> ';
64968   };
64969
64970   Renderer.prototype.paragraph = function(text) {
64971     return '<p>' + text + '</p>\n';
64972   };
64973
64974   Renderer.prototype.table = function(header, body) {
64975     if (body) body = '<tbody>' + body + '</tbody>';
64976
64977     return '<table>\n'
64978       + '<thead>\n'
64979       + header
64980       + '</thead>\n'
64981       + body
64982       + '</table>\n';
64983   };
64984
64985   Renderer.prototype.tablerow = function(content) {
64986     return '<tr>\n' + content + '</tr>\n';
64987   };
64988
64989   Renderer.prototype.tablecell = function(content, flags) {
64990     var type = flags.header ? 'th' : 'td';
64991     var tag = flags.align
64992       ? '<' + type + ' align="' + flags.align + '">'
64993       : '<' + type + '>';
64994     return tag + content + '</' + type + '>\n';
64995   };
64996
64997   // span level renderer
64998   Renderer.prototype.strong = function(text) {
64999     return '<strong>' + text + '</strong>';
65000   };
65001
65002   Renderer.prototype.em = function(text) {
65003     return '<em>' + text + '</em>';
65004   };
65005
65006   Renderer.prototype.codespan = function(text) {
65007     return '<code>' + text + '</code>';
65008   };
65009
65010   Renderer.prototype.br = function() {
65011     return this.options.xhtml ? '<br/>' : '<br>';
65012   };
65013
65014   Renderer.prototype.del = function(text) {
65015     return '<del>' + text + '</del>';
65016   };
65017
65018   Renderer.prototype.link = function(href, title, text) {
65019     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
65020     if (href === null) {
65021       return text;
65022     }
65023     var out = '<a href="' + escape(href) + '"';
65024     if (title) {
65025       out += ' title="' + title + '"';
65026     }
65027     out += '>' + text + '</a>';
65028     return out;
65029   };
65030
65031   Renderer.prototype.image = function(href, title, text) {
65032     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
65033     if (href === null) {
65034       return text;
65035     }
65036
65037     var out = '<img src="' + href + '" alt="' + text + '"';
65038     if (title) {
65039       out += ' title="' + title + '"';
65040     }
65041     out += this.options.xhtml ? '/>' : '>';
65042     return out;
65043   };
65044
65045   Renderer.prototype.text = function(text) {
65046     return text;
65047   };
65048
65049   /**
65050    * TextRenderer
65051    * returns only the textual part of the token
65052    */
65053
65054   function TextRenderer() {}
65055
65056   // no need for block level renderers
65057
65058   TextRenderer.prototype.strong =
65059   TextRenderer.prototype.em =
65060   TextRenderer.prototype.codespan =
65061   TextRenderer.prototype.del =
65062   TextRenderer.prototype.text = function (text) {
65063     return text;
65064   };
65065
65066   TextRenderer.prototype.link =
65067   TextRenderer.prototype.image = function(href, title, text) {
65068     return '' + text;
65069   };
65070
65071   TextRenderer.prototype.br = function() {
65072     return '';
65073   };
65074
65075   /**
65076    * Parsing & Compiling
65077    */
65078
65079   function Parser(options) {
65080     this.tokens = [];
65081     this.token = null;
65082     this.options = options || marked.defaults;
65083     this.options.renderer = this.options.renderer || new Renderer();
65084     this.renderer = this.options.renderer;
65085     this.renderer.options = this.options;
65086     this.slugger = new Slugger();
65087   }
65088
65089   /**
65090    * Static Parse Method
65091    */
65092
65093   Parser.parse = function(src, options) {
65094     var parser = new Parser(options);
65095     return parser.parse(src);
65096   };
65097
65098   /**
65099    * Parse Loop
65100    */
65101
65102   Parser.prototype.parse = function(src) {
65103     this.inline = new InlineLexer(src.links, this.options);
65104     // use an InlineLexer with a TextRenderer to extract pure text
65105     this.inlineText = new InlineLexer(
65106       src.links,
65107       merge({}, this.options, {renderer: new TextRenderer()})
65108     );
65109     this.tokens = src.reverse();
65110
65111     var out = '';
65112     while (this.next()) {
65113       out += this.tok();
65114     }
65115
65116     return out;
65117   };
65118
65119   /**
65120    * Next Token
65121    */
65122
65123   Parser.prototype.next = function() {
65124     return this.token = this.tokens.pop();
65125   };
65126
65127   /**
65128    * Preview Next Token
65129    */
65130
65131   Parser.prototype.peek = function() {
65132     return this.tokens[this.tokens.length - 1] || 0;
65133   };
65134
65135   /**
65136    * Parse Text Tokens
65137    */
65138
65139   Parser.prototype.parseText = function() {
65140     var body = this.token.text;
65141
65142     while (this.peek().type === 'text') {
65143       body += '\n' + this.next().text;
65144     }
65145
65146     return this.inline.output(body);
65147   };
65148
65149   /**
65150    * Parse Current Token
65151    */
65152
65153   Parser.prototype.tok = function() {
65154     switch (this.token.type) {
65155       case 'space': {
65156         return '';
65157       }
65158       case 'hr': {
65159         return this.renderer.hr();
65160       }
65161       case 'heading': {
65162         return this.renderer.heading(
65163           this.inline.output(this.token.text),
65164           this.token.depth,
65165           unescape(this.inlineText.output(this.token.text)),
65166           this.slugger);
65167       }
65168       case 'code': {
65169         return this.renderer.code(this.token.text,
65170           this.token.lang,
65171           this.token.escaped);
65172       }
65173       case 'table': {
65174         var header = '',
65175             body = '',
65176             i,
65177             row,
65178             cell,
65179             j;
65180
65181         // header
65182         cell = '';
65183         for (i = 0; i < this.token.header.length; i++) {
65184           cell += this.renderer.tablecell(
65185             this.inline.output(this.token.header[i]),
65186             { header: true, align: this.token.align[i] }
65187           );
65188         }
65189         header += this.renderer.tablerow(cell);
65190
65191         for (i = 0; i < this.token.cells.length; i++) {
65192           row = this.token.cells[i];
65193
65194           cell = '';
65195           for (j = 0; j < row.length; j++) {
65196             cell += this.renderer.tablecell(
65197               this.inline.output(row[j]),
65198               { header: false, align: this.token.align[j] }
65199             );
65200           }
65201
65202           body += this.renderer.tablerow(cell);
65203         }
65204         return this.renderer.table(header, body);
65205       }
65206       case 'blockquote_start': {
65207         body = '';
65208
65209         while (this.next().type !== 'blockquote_end') {
65210           body += this.tok();
65211         }
65212
65213         return this.renderer.blockquote(body);
65214       }
65215       case 'list_start': {
65216         body = '';
65217         var ordered = this.token.ordered,
65218             start = this.token.start;
65219
65220         while (this.next().type !== 'list_end') {
65221           body += this.tok();
65222         }
65223
65224         return this.renderer.list(body, ordered, start);
65225       }
65226       case 'list_item_start': {
65227         body = '';
65228         var loose = this.token.loose;
65229
65230         if (this.token.task) {
65231           body += this.renderer.checkbox(this.token.checked);
65232         }
65233
65234         while (this.next().type !== 'list_item_end') {
65235           body += !loose && this.token.type === 'text'
65236             ? this.parseText()
65237             : this.tok();
65238         }
65239
65240         return this.renderer.listitem(body);
65241       }
65242       case 'html': {
65243         // TODO parse inline content if parameter markdown=1
65244         return this.renderer.html(this.token.text);
65245       }
65246       case 'paragraph': {
65247         return this.renderer.paragraph(this.inline.output(this.token.text));
65248       }
65249       case 'text': {
65250         return this.renderer.paragraph(this.parseText());
65251       }
65252       default: {
65253         var errMsg = 'Token with "' + this.token.type + '" type was not found.';
65254         if (this.options.silent) {
65255           console.log(errMsg);
65256         } else {
65257           throw new Error(errMsg);
65258         }
65259       }
65260     }
65261   };
65262
65263   /**
65264    * Slugger generates header id
65265    */
65266
65267   function Slugger () {
65268     this.seen = {};
65269   }
65270
65271   /**
65272    * Convert string to unique id
65273    */
65274
65275   Slugger.prototype.slug = function (value) {
65276     var slug = value
65277       .toLowerCase()
65278       .trim()
65279       .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
65280       .replace(/\s/g, '-');
65281
65282     if (this.seen.hasOwnProperty(slug)) {
65283       var originalSlug = slug;
65284       do {
65285         this.seen[originalSlug]++;
65286         slug = originalSlug + '-' + this.seen[originalSlug];
65287       } while (this.seen.hasOwnProperty(slug));
65288     }
65289     this.seen[slug] = 0;
65290
65291     return slug;
65292   };
65293
65294   /**
65295    * Helpers
65296    */
65297
65298   function escape(html, encode) {
65299     if (encode) {
65300       if (escape.escapeTest.test(html)) {
65301         return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
65302       }
65303     } else {
65304       if (escape.escapeTestNoEncode.test(html)) {
65305         return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
65306       }
65307     }
65308
65309     return html;
65310   }
65311
65312   escape.escapeTest = /[&<>"']/;
65313   escape.escapeReplace = /[&<>"']/g;
65314   escape.replacements = {
65315     '&': '&amp;',
65316     '<': '&lt;',
65317     '>': '&gt;',
65318     '"': '&quot;',
65319     "'": '&#39;'
65320   };
65321
65322   escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
65323   escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
65324
65325   function unescape(html) {
65326     // explicitly match decimal, hex, and named HTML entities
65327     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
65328       n = n.toLowerCase();
65329       if (n === 'colon') return ':';
65330       if (n.charAt(0) === '#') {
65331         return n.charAt(1) === 'x'
65332           ? String.fromCharCode(parseInt(n.substring(2), 16))
65333           : String.fromCharCode(+n.substring(1));
65334       }
65335       return '';
65336     });
65337   }
65338
65339   function edit(regex, opt) {
65340     regex = regex.source || regex;
65341     opt = opt || '';
65342     return {
65343       replace: function(name, val) {
65344         val = val.source || val;
65345         val = val.replace(/(^|[^\[])\^/g, '$1');
65346         regex = regex.replace(name, val);
65347         return this;
65348       },
65349       getRegex: function() {
65350         return new RegExp(regex, opt);
65351       }
65352     };
65353   }
65354
65355   function cleanUrl(sanitize, base, href) {
65356     if (sanitize) {
65357       try {
65358         var prot = decodeURIComponent(unescape(href))
65359           .replace(/[^\w:]/g, '')
65360           .toLowerCase();
65361       } catch (e) {
65362         return null;
65363       }
65364       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
65365         return null;
65366       }
65367     }
65368     if (base && !originIndependentUrl.test(href)) {
65369       href = resolveUrl(base, href);
65370     }
65371     try {
65372       href = encodeURI(href).replace(/%25/g, '%');
65373     } catch (e) {
65374       return null;
65375     }
65376     return href;
65377   }
65378
65379   function resolveUrl(base, href) {
65380     if (!baseUrls[' ' + base]) {
65381       // we can ignore everything in base after the last slash of its path component,
65382       // but we might need to add _that_
65383       // https://tools.ietf.org/html/rfc3986#section-3
65384       if (/^[^:]+:\/*[^/]*$/.test(base)) {
65385         baseUrls[' ' + base] = base + '/';
65386       } else {
65387         baseUrls[' ' + base] = rtrim(base, '/', true);
65388       }
65389     }
65390     base = baseUrls[' ' + base];
65391
65392     if (href.slice(0, 2) === '//') {
65393       return base.replace(/:[\s\S]*/, ':') + href;
65394     } else if (href.charAt(0) === '/') {
65395       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
65396     } else {
65397       return base + href;
65398     }
65399   }
65400   var baseUrls = {};
65401   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
65402
65403   function noop() {}
65404   noop.exec = noop;
65405
65406   function merge(obj) {
65407     var i = 1,
65408         target,
65409         key;
65410
65411     for (; i < arguments.length; i++) {
65412       target = arguments[i];
65413       for (key in target) {
65414         if (Object.prototype.hasOwnProperty.call(target, key)) {
65415           obj[key] = target[key];
65416         }
65417       }
65418     }
65419
65420     return obj;
65421   }
65422
65423   function splitCells(tableRow, count) {
65424     // ensure that every cell-delimiting pipe has a space
65425     // before it to distinguish it from an escaped pipe
65426     var row = tableRow.replace(/\|/g, function (match, offset, str) {
65427           var escaped = false,
65428               curr = offset;
65429           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
65430           if (escaped) {
65431             // odd number of slashes means | is escaped
65432             // so we leave it alone
65433             return '|';
65434           } else {
65435             // add space before unescaped |
65436             return ' |';
65437           }
65438         }),
65439         cells = row.split(/ \|/),
65440         i = 0;
65441
65442     if (cells.length > count) {
65443       cells.splice(count);
65444     } else {
65445       while (cells.length < count) cells.push('');
65446     }
65447
65448     for (; i < cells.length; i++) {
65449       // leading or trailing whitespace is ignored per the gfm spec
65450       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
65451     }
65452     return cells;
65453   }
65454
65455   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
65456   // /c*$/ is vulnerable to REDOS.
65457   // invert: Remove suffix of non-c chars instead. Default falsey.
65458   function rtrim(str, c, invert) {
65459     if (str.length === 0) {
65460       return '';
65461     }
65462
65463     // Length of suffix matching the invert condition.
65464     var suffLen = 0;
65465
65466     // Step left until we fail to match the invert condition.
65467     while (suffLen < str.length) {
65468       var currChar = str.charAt(str.length - suffLen - 1);
65469       if (currChar === c && !invert) {
65470         suffLen++;
65471       } else if (currChar !== c && invert) {
65472         suffLen++;
65473       } else {
65474         break;
65475       }
65476     }
65477
65478     return str.substr(0, str.length - suffLen);
65479   }
65480
65481   function findClosingBracket(str, b) {
65482     if (str.indexOf(b[1]) === -1) {
65483       return -1;
65484     }
65485     var level = 0;
65486     for (var i = 0; i < str.length; i++) {
65487       if (str[i] === '\\') {
65488         i++;
65489       } else if (str[i] === b[0]) {
65490         level++;
65491       } else if (str[i] === b[1]) {
65492         level--;
65493         if (level < 0) {
65494           return i;
65495         }
65496       }
65497     }
65498     return -1;
65499   }
65500
65501   /**
65502    * Marked
65503    */
65504
65505   function marked(src, opt, callback) {
65506     // throw error in case of non string input
65507     if (typeof src === 'undefined' || src === null) {
65508       throw new Error('marked(): input parameter is undefined or null');
65509     }
65510     if (typeof src !== 'string') {
65511       throw new Error('marked(): input parameter is of type '
65512         + Object.prototype.toString.call(src) + ', string expected');
65513     }
65514
65515     if (callback || typeof opt === 'function') {
65516       if (!callback) {
65517         callback = opt;
65518         opt = null;
65519       }
65520
65521       opt = merge({}, marked.defaults, opt || {});
65522
65523       var highlight = opt.highlight,
65524           tokens,
65525           pending,
65526           i = 0;
65527
65528       try {
65529         tokens = Lexer.lex(src, opt);
65530       } catch (e) {
65531         return callback(e);
65532       }
65533
65534       pending = tokens.length;
65535
65536       var done = function(err) {
65537         if (err) {
65538           opt.highlight = highlight;
65539           return callback(err);
65540         }
65541
65542         var out;
65543
65544         try {
65545           out = Parser.parse(tokens, opt);
65546         } catch (e) {
65547           err = e;
65548         }
65549
65550         opt.highlight = highlight;
65551
65552         return err
65553           ? callback(err)
65554           : callback(null, out);
65555       };
65556
65557       if (!highlight || highlight.length < 3) {
65558         return done();
65559       }
65560
65561       delete opt.highlight;
65562
65563       if (!pending) return done();
65564
65565       for (; i < tokens.length; i++) {
65566         (function(token) {
65567           if (token.type !== 'code') {
65568             return --pending || done();
65569           }
65570           return highlight(token.text, token.lang, function(err, code) {
65571             if (err) return done(err);
65572             if (code == null || code === token.text) {
65573               return --pending || done();
65574             }
65575             token.text = code;
65576             token.escaped = true;
65577             --pending || done();
65578           });
65579         })(tokens[i]);
65580       }
65581
65582       return;
65583     }
65584     try {
65585       if (opt) opt = merge({}, marked.defaults, opt);
65586       return Parser.parse(Lexer.lex(src, opt), opt);
65587     } catch (e) {
65588       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
65589       if ((opt || marked.defaults).silent) {
65590         return '<p>An error occurred:</p><pre>'
65591           + escape(e.message + '', true)
65592           + '</pre>';
65593       }
65594       throw e;
65595     }
65596   }
65597
65598   /**
65599    * Options
65600    */
65601
65602   marked.options =
65603   marked.setOptions = function(opt) {
65604     merge(marked.defaults, opt);
65605     return marked;
65606   };
65607
65608   marked.getDefaults = function () {
65609     return {
65610       baseUrl: null,
65611       breaks: false,
65612       gfm: true,
65613       headerIds: true,
65614       headerPrefix: '',
65615       highlight: null,
65616       langPrefix: 'language-',
65617       mangle: true,
65618       pedantic: false,
65619       renderer: new Renderer(),
65620       sanitize: false,
65621       sanitizer: null,
65622       silent: false,
65623       smartLists: false,
65624       smartypants: false,
65625       tables: true,
65626       xhtml: false
65627     };
65628   };
65629
65630   marked.defaults = marked.getDefaults();
65631
65632   /**
65633    * Expose
65634    */
65635
65636   marked.Parser = Parser;
65637   marked.parser = Parser.parse;
65638
65639   marked.Renderer = Renderer;
65640   marked.TextRenderer = TextRenderer;
65641
65642   marked.Lexer = Lexer;
65643   marked.lexer = Lexer.lex;
65644
65645   marked.InlineLexer = InlineLexer;
65646   marked.inlineLexer = InlineLexer.output;
65647
65648   marked.Slugger = Slugger;
65649
65650   marked.parse = marked;
65651
65652   {
65653     module.exports = marked;
65654   }
65655   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
65656   });
65657
65658   function pointBox(loc, context) {
65659       var rect = context.surfaceRect();
65660       var point = context.curtainProjection(loc);
65661       return {
65662           left: point[0] + rect.left - 40,
65663           top: point[1] + rect.top - 60,
65664           width: 80,
65665           height: 90
65666       };
65667   }
65668
65669
65670   function pad$1(locOrBox, padding, context) {
65671       var box;
65672       if (locOrBox instanceof Array) {
65673           var rect = context.surfaceRect();
65674           var point = context.curtainProjection(locOrBox);
65675           box = {
65676               left: point[0] + rect.left,
65677               top: point[1] + rect.top
65678           };
65679       } else {
65680           box = locOrBox;
65681       }
65682
65683       return {
65684           left: box.left - padding,
65685           top: box.top - padding,
65686           width: (box.width || 0) + 2 * padding,
65687           height: (box.width || 0) + 2 * padding
65688       };
65689   }
65690
65691
65692   function icon(name, svgklass, useklass) {
65693       return '<svg class="icon ' + (svgklass || '') + '">' +
65694            '<use xlink:href="' + name + '"' +
65695            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
65696   }
65697
65698
65699   function slugify(text) {
65700       return text.toString().toLowerCase()
65701           .replace(/\s+/g, '-')           // Replace spaces with -
65702           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
65703           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
65704           .replace(/^-+/, '')             // Trim - from start of text
65705           .replace(/-+$/, '');            // Trim - from end of text
65706   }
65707
65708
65709   // console warning for missing walkthrough names
65710   var missingStrings = {};
65711   function checkKey(key, text) {
65712       if (t(key, { default: undefined}) === undefined) {
65713           if (missingStrings.hasOwnProperty(key)) return;  // warn once
65714           missingStrings[key] = text;
65715           var missing = key + ': ' + text;
65716           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
65717       }
65718   }
65719
65720
65721   function localize(obj) {
65722       var key;
65723
65724       // Assign name if entity has one..
65725       var name = obj.tags && obj.tags.name;
65726       if (name) {
65727           key = 'intro.graph.name.' + slugify(name);
65728           obj.tags.name = t(key, { default: name });
65729           checkKey(key, name);
65730       }
65731
65732       // Assign street name if entity has one..
65733       var street = obj.tags && obj.tags['addr:street'];
65734       if (street) {
65735           key = 'intro.graph.name.' + slugify(street);
65736           obj.tags['addr:street'] = t(key, { default: street });
65737           checkKey(key, street);
65738
65739           // Add address details common across walkthrough..
65740           var addrTags = [
65741               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
65742               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
65743           ];
65744           addrTags.forEach(function(k) {
65745               var key = 'intro.graph.' + k;
65746               var tag = 'addr:' + k;
65747               var val = obj.tags && obj.tags[tag];
65748               var str = t(key, { default: val });
65749
65750               if (str) {
65751                   if (str.match(/^<.*>$/) !== null) {
65752                       delete obj.tags[tag];
65753                   } else {
65754                       obj.tags[tag] = str;
65755                   }
65756               }
65757           });
65758       }
65759
65760       return obj;
65761   }
65762
65763
65764   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
65765   function isMostlySquare(points) {
65766       // note: uses 15 here instead of the 12 from actionOrthogonalize because
65767       // actionOrthogonalize can actually straighten some larger angles as it iterates
65768       var threshold = 15; // degrees within right or straight
65769       var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
65770       var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
65771       var mag;
65772
65773       for (var i = 0; i < points.length; i++) {
65774           mag = Math.abs(normalizedDotProduct(i, points));
65775           if (mag > lowerBound && mag < upperBound) {
65776               return false;
65777           }
65778       }
65779
65780       return true;
65781
65782
65783       function normalizedDotProduct(i, points) {
65784           var a = points[(i - 1 + points.length) % points.length];
65785           var b = points[i];
65786           var c = points[(i + 1) % points.length];
65787           var p = subtractPoints(a, b);
65788           var q = subtractPoints(c, b);
65789
65790           p = normalizePoint(p);
65791           q = normalizePoint(q);
65792
65793           return p[0] * q[0] + p[1] * q[1];
65794
65795
65796           function subtractPoints(a, b) {
65797               return [a[0] - b[0], a[1] - b[1]];
65798           }
65799
65800           function normalizePoint(point) {
65801               var vector = [0, 0];
65802               var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
65803               if (length !== 0) {
65804                   vector[0] = point[0] / length;
65805                   vector[1] = point[1] / length;
65806               }
65807               return vector;
65808           }
65809       }
65810   }
65811
65812
65813   function selectMenuItem(operation) {
65814       var selector = '.edit-menu .edit-menu-item-' + operation +
65815           ', .radial-menu .radial-menu-item-' + operation;
65816       return select(selector);
65817   }
65818
65819
65820   function transitionTime(point1, point2) {
65821       var distance = geoSphericalDistance(point1, point2);
65822       if (distance === 0)
65823           return 0;
65824       else if (distance < 80)
65825           return 500;
65826       else
65827           return 1000;
65828   }
65829
65830   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:"marked",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634767,41.946172]},n1028:{id:"n1028",loc:[-85.634622,41.946175],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635768,41.940051],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"marked",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]}};
65831
65832   // Tooltips and svg mask used to highlight certain features
65833   function uiCurtain() {
65834
65835       var surface = select(null),
65836           tooltip = select(null),
65837           darkness = select(null);
65838
65839       function curtain(selection) {
65840           surface = selection
65841               .append('svg')
65842               .attr('id', 'curtain')
65843               .style('z-index', 1000)
65844               .style('pointer-events', 'none')
65845               .style('position', 'absolute')
65846               .style('top', 0)
65847               .style('left', 0);
65848
65849           darkness = surface.append('path')
65850               .attr('x', 0)
65851               .attr('y', 0)
65852               .attr('class', 'curtain-darkness');
65853
65854           select(window).on('resize.curtain', resize);
65855
65856           tooltip = selection.append('div')
65857               .attr('class', 'tooltip')
65858               .style('z-index', 1002);
65859
65860           tooltip
65861               .append('div')
65862               .attr('class', 'tooltip-arrow');
65863
65864           tooltip
65865               .append('div')
65866               .attr('class', 'tooltip-inner');
65867
65868           resize();
65869
65870
65871           function resize() {
65872               surface
65873                   .attr('width', window.innerWidth)
65874                   .attr('height', window.innerHeight);
65875               curtain.cut(darkness.datum());
65876           }
65877       }
65878
65879
65880       /**
65881        * Reveal cuts the curtain to highlight the given box,
65882        * and shows a tooltip with instructions next to the box.
65883        *
65884        * @param  {String|ClientRect} [box]   box used to cut the curtain
65885        * @param  {String}    [text]          text for a tooltip
65886        * @param  {Object}    [options]
65887        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
65888        * @param  {integer}   [options.duration]        transition time in milliseconds
65889        * @param  {string}    [options.buttonText]      if set, create a button with this text label
65890        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
65891        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
65892        */
65893       curtain.reveal = function(box, text, options) {
65894           if (typeof box === 'string') {
65895               box = select(box).node();
65896           }
65897           if (box && box.getBoundingClientRect) {
65898               box = copyBox(box.getBoundingClientRect());
65899           }
65900
65901           options = options || {};
65902
65903           var tooltipBox;
65904           if (options.tooltipBox) {
65905               tooltipBox = options.tooltipBox;
65906               if (typeof tooltipBox === 'string') {
65907                   tooltipBox = select(tooltipBox).node();
65908               }
65909               if (tooltipBox && tooltipBox.getBoundingClientRect) {
65910                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
65911               }
65912           } else {
65913               tooltipBox = box;
65914           }
65915
65916           if (tooltipBox && text) {
65917               // pseudo markdown bold text for the instruction section..
65918               var parts = text.split('**');
65919               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
65920               if (parts[1]) {
65921                   html += '<span class="instruction">' + parts[1] + '</span>';
65922               }
65923
65924               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
65925               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
65926
65927               if (options.buttonText && options.buttonCallback) {
65928                   html += '<div class="button-section">' +
65929                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
65930               }
65931
65932               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
65933               tooltip
65934                   .classed(classes, true)
65935                   .selectAll('.tooltip-inner')
65936                   .html(html);
65937
65938               if (options.buttonText && options.buttonCallback) {
65939                   var button = tooltip.selectAll('.button-section .button.action');
65940                   button
65941                       .on('click', function() {
65942                           event.preventDefault();
65943                           options.buttonCallback();
65944                       });
65945               }
65946
65947               var tip = copyBox(tooltip.node().getBoundingClientRect()),
65948                   w = window.innerWidth,
65949                   h = window.innerHeight,
65950                   tooltipWidth = 200,
65951                   tooltipArrow = 5,
65952                   side, pos;
65953
65954
65955               // hack: this will have bottom placement,
65956               // so need to reserve extra space for the tooltip illustration.
65957               if (options.tooltipClass === 'intro-mouse') {
65958                   tip.height += 80;
65959               }
65960
65961               // trim box dimensions to just the portion that fits in the window..
65962               if (tooltipBox.top + tooltipBox.height > h) {
65963                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
65964               }
65965               if (tooltipBox.left + tooltipBox.width > w) {
65966                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
65967               }
65968
65969               // determine tooltip placement..
65970
65971               if (tooltipBox.top + tooltipBox.height < 100) {
65972                   // tooltip below box..
65973                   side = 'bottom';
65974                   pos = [
65975                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
65976                       tooltipBox.top + tooltipBox.height
65977                   ];
65978
65979               } else if (tooltipBox.top > h - 140) {
65980                   // tooltip above box..
65981                   side = 'top';
65982                   pos = [
65983                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
65984                       tooltipBox.top - tip.height
65985                   ];
65986
65987               } else {
65988                   // tooltip to the side of the tooltipBox..
65989                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
65990
65991                   if (textDirection === 'rtl') {
65992                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
65993                           side = 'right';
65994                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
65995
65996                       } else {
65997                           side = 'left';
65998                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
65999                       }
66000
66001                   } else {
66002                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
66003                           side = 'left';
66004                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
66005                       }
66006                       else {
66007                           side = 'right';
66008                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
66009                       }
66010                   }
66011               }
66012
66013               if (options.duration !== 0 || !tooltip.classed(side)) {
66014                   tooltip.call(uiToggle(true));
66015               }
66016
66017               tooltip
66018                   .style('top', pos[1] + 'px')
66019                   .style('left', pos[0] + 'px')
66020                   .attr('class', classes + ' ' + side);
66021
66022
66023               // shift tooltip-inner if it is very close to the top or bottom edge
66024               // (doesn't affect the placement of the tooltip-arrow)
66025               var shiftY = 0;
66026               if (side === 'left' || side === 'right') {
66027                   if (pos[1] < 60) {
66028                       shiftY = 60 - pos[1];
66029                   }
66030                   else if (pos[1] + tip.height > h - 100) {
66031                       shiftY = h - pos[1] - tip.height - 100;
66032                   }
66033               }
66034               tooltip.selectAll('.tooltip-inner')
66035                   .style('top', shiftY + 'px');
66036
66037           } else {
66038               tooltip
66039                   .classed('in', false)
66040                   .call(uiToggle(false));
66041           }
66042
66043           curtain.cut(box, options.duration);
66044
66045           return tooltip;
66046       };
66047
66048
66049       curtain.cut = function(datum, duration) {
66050           darkness.datum(datum)
66051               .interrupt();
66052
66053           var selection;
66054           if (duration === 0) {
66055               selection = darkness;
66056           } else {
66057               selection = darkness
66058                   .transition()
66059                   .duration(duration || 600)
66060                   .ease(linear$1);
66061           }
66062
66063           selection
66064               .attr('d', function(d) {
66065                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
66066                       window.innerWidth + ',' + window.innerHeight + 'L' +
66067                       window.innerWidth + ',0 Z';
66068
66069                   if (!d) return string;
66070                   return string + 'M' +
66071                       d.left + ',' + d.top + 'L' +
66072                       d.left + ',' + (d.top + d.height) + 'L' +
66073                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
66074                       (d.left + d.width) + ',' + (d.top) + 'Z';
66075
66076               });
66077       };
66078
66079
66080       curtain.remove = function() {
66081           surface.remove();
66082           tooltip.remove();
66083           select(window).on('resize.curtain', null);
66084       };
66085
66086
66087       // ClientRects are immutable, so copy them to an object,
66088       // in case we need to trim the height/width.
66089       function copyBox(src) {
66090           return {
66091               top: src.top,
66092               right: src.right,
66093               bottom: src.bottom,
66094               left: src.left,
66095               width: src.width,
66096               height: src.height
66097           };
66098       }
66099
66100
66101       return curtain;
66102   }
66103
66104   function uiIntroWelcome(context, reveal) {
66105       var dispatch$1 = dispatch('done');
66106       var listener = clickListener();
66107
66108       var chapter = {
66109           title: 'intro.welcome.title'
66110       };
66111
66112
66113       function welcome() {
66114           context.map().centerZoom([-85.63591, 41.94285], 19);
66115           reveal('.intro-nav-wrap .chapter-welcome',
66116               t('intro.welcome.welcome'),
66117               { buttonText: t('intro.ok'), buttonCallback: practice }
66118           );
66119       }
66120
66121       function practice() {
66122           reveal('.intro-nav-wrap .chapter-welcome',
66123               t('intro.welcome.practice'),
66124               { buttonText: t('intro.ok'), buttonCallback: words }
66125           );
66126       }
66127
66128       function words() {
66129           reveal('.intro-nav-wrap .chapter-welcome',
66130               t('intro.welcome.words'),
66131               { buttonText: t('intro.ok'), buttonCallback: mouse }
66132           );
66133       }
66134
66135
66136       function mouse() {
66137           reveal('.intro-nav-wrap .chapter-welcome',
66138               t('intro.welcome.mouse'),
66139               { buttonText: t('intro.ok'), buttonCallback: leftClick }
66140           );
66141       }
66142
66143
66144       function leftClick() {
66145           var counter = 0;
66146           var times = 5;
66147
66148           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
66149               t('intro.welcome.leftclick', { num: times }),
66150               { tooltipClass: 'intro-mouse' }
66151           );
66152
66153           tooltip.selectAll('.tooltip-inner')
66154               .insert('svg', 'span')
66155               .attr('class', 'tooltip-illustration')
66156               .append('use')
66157               .attr('xlink:href', '#iD-walkthrough-mouse');
66158
66159           tooltip
66160               .append('div')
66161               .attr('class', 'counter');
66162
66163           tooltip.call(listener);
66164
66165           listener.on('click', function(which) {
66166               if (which === 'left') {
66167                   select('.curtain-tooltip.intro-mouse .counter')
66168                       .text(String(++counter));
66169
66170                   if (counter === times) {
66171                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
66172                   }
66173               }
66174           });
66175
66176           function continueTo(nextStep) {
66177               listener.on('click', null);
66178               tooltip.call(listener.off);
66179               tooltip.select('.counter').remove();
66180               nextStep();
66181           }
66182       }
66183
66184
66185       function rightClick() {
66186           var counter = 0;
66187           var times = 5;
66188
66189           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
66190               t('intro.welcome.rightclick', { num: times }),
66191               { tooltipClass: 'intro-mouse' }
66192           );
66193
66194           tooltip.selectAll('.tooltip-inner')
66195               .insert('svg', 'span')
66196               .attr('class', 'tooltip-illustration')
66197               .append('use')
66198               .attr('xlink:href', '#iD-walkthrough-mouse');
66199
66200           tooltip
66201               .append('div')
66202               .attr('class', 'counter');
66203
66204           tooltip.call(listener);
66205
66206           listener.on('click', function(which) {
66207               if (which === 'right') {
66208                   select('.curtain-tooltip.intro-mouse .counter')
66209                       .text(String(++counter));
66210
66211                   if (counter === times) {
66212                       window.setTimeout(function() { continueTo(chapters); }, 1000);
66213                   }
66214               }
66215           });
66216
66217           function continueTo(nextStep) {
66218               listener.on('click', null);
66219               tooltip.call(listener.off);
66220               tooltip.select('.counter').remove();
66221               nextStep();
66222           }
66223       }
66224
66225
66226       function chapters() {
66227           dispatch$1.call('done');
66228           reveal('.intro-nav-wrap .chapter-navigation',
66229               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
66230           );
66231       }
66232
66233
66234       chapter.enter = function() {
66235           welcome();
66236       };
66237
66238
66239       chapter.exit = function() {
66240           listener.off();
66241           select('.curtain-tooltip.intro-mouse')
66242               .selectAll('.counter')
66243               .remove();
66244       };
66245
66246
66247       chapter.restart = function() {
66248           chapter.exit();
66249           chapter.enter();
66250       };
66251
66252
66253       return utilRebind(chapter, dispatch$1, 'on');
66254   }
66255
66256
66257
66258   function clickListener() {
66259       var dispatch$1 = dispatch('click');
66260       var minTime = 120;
66261       var tooltip = select(null);
66262       var down = {};
66263
66264       // `down` keeps track of which buttons/keys are down.
66265       // Setting a property in `down` happens immediately.
66266       // Unsetting a property in `down` is delayed because
66267       //   on Windows a contextmenu event happens after keyup/mouseup
66268
66269       function keydown() {
66270           if (event.keyCode === 93)  {   // context menu
66271               event.preventDefault();
66272               event.stopPropagation();
66273               down.menu = event.timeStamp;
66274               tooltip.classed('rightclick', true);
66275           }
66276       }
66277
66278
66279       function keyup() {
66280           if (event.keyCode === 93)  {   // context menu
66281               event.preventDefault();
66282               event.stopPropagation();
66283               var endTime = event.timeStamp;
66284               var startTime = down.menu || endTime;
66285               var delay = (endTime - startTime < minTime) ? minTime : 0;
66286
66287               window.setTimeout(function() {
66288                   tooltip.classed('rightclick', false);
66289                   down.menu = undefined;  // delayed, for Windows
66290               }, delay);
66291
66292               dispatch$1.call('click', this, 'right');
66293           }
66294       }
66295
66296
66297       function mousedown() {
66298           var button = event.button;
66299           if (button === 0 && !event.ctrlKey) {
66300               tooltip.classed('leftclick', true);
66301           } else if (button === 2) {
66302               tooltip.classed('rightclick', true);
66303           }
66304           down[button] = event.timeStamp;
66305       }
66306
66307
66308       function mouseup() {
66309           var button = event.button;
66310           var endTime = event.timeStamp;
66311           var startTime = down[button] || endTime;
66312           var delay = (endTime - startTime < minTime) ? minTime : 0;
66313
66314           if (button === 0 && !event.ctrlKey) {
66315               window.setTimeout(function() {
66316                   tooltip.classed('leftclick', false);
66317                   down[button] = undefined;  // delayed, for Windows
66318               }, delay);
66319
66320               dispatch$1.call('click', this, 'left');
66321
66322           } else if (button === 2) {
66323               window.setTimeout(function() {
66324                   tooltip.classed('rightclick', false);
66325                   down[button] = undefined;  // delayed, for Windows
66326               }, delay);
66327
66328               dispatch$1.call('click', this, 'right');
66329
66330           } else {
66331               window.setTimeout(function() {
66332                   down[button] = undefined;  // delayed, for Windows
66333               }, delay);
66334           }
66335       }
66336
66337
66338       function contextmenu() {
66339           event.preventDefault();
66340           event.stopPropagation();
66341           if (!down[2] && !down.menu) {
66342               tooltip.classed('rightclick', true);
66343               window.setTimeout(function() {
66344                   tooltip.classed('rightclick', false);
66345               }, minTime);
66346               dispatch$1.call('click', this, 'right');
66347           }
66348       }
66349
66350
66351       var behavior = function(selection) {
66352           tooltip = selection;
66353           down = {};
66354
66355           select(window)
66356               .on('keydown.intro', keydown)
66357               .on('keyup.intro', keyup)
66358               .on('mousedown.intro', mousedown)
66359               .on('mouseup.intro', mouseup)
66360               .on('contextmenu.intro', contextmenu);
66361       };
66362
66363
66364       behavior.off = function() {
66365           select(window)
66366               .on('keydown.intro', null)
66367               .on('keyup.intro', null)
66368               .on('mousedown.intro', null)
66369               .on('mouseup.intro', null)
66370               .on('contextmenu.intro', null);
66371
66372           tooltip
66373               .classed('leftclick', false)
66374               .classed('rightclick', false);
66375       };
66376
66377       return utilRebind(behavior, dispatch$1, 'on');
66378   }
66379
66380   function uiIntroNavigation(context, reveal) {
66381       var dispatch$1 = dispatch('done');
66382       var timeouts = [];
66383       var hallId = 'n2061';
66384       var townHall = [-85.63591, 41.94285];
66385       var springStreetId = 'w397';
66386       var springStreetEndId = 'n1834';
66387       var springStreet = [-85.63582, 41.94255];
66388       var onewayField = context.presets().field('oneway');
66389       var maxspeedField = context.presets().field('maxspeed');
66390
66391
66392       var chapter = {
66393           title: 'intro.navigation.title'
66394       };
66395
66396
66397       function timeout(f, t) {
66398           timeouts.push(window.setTimeout(f, t));
66399       }
66400
66401
66402       function eventCancel() {
66403           event.stopPropagation();
66404           event.preventDefault();
66405       }
66406
66407
66408       function isTownHallSelected() {
66409           var ids = context.selectedIDs();
66410           return ids.length === 1 && ids[0] === hallId;
66411       }
66412
66413
66414       function dragMap() {
66415           context.enter(modeBrowse(context));
66416           context.history().reset('initial');
66417
66418           var msec = transitionTime(townHall, context.map().center());
66419           if (msec) { reveal(null, null, { duration: 0 }); }
66420           context.map().centerZoomEase(townHall, 19, msec);
66421
66422           timeout(function() {
66423               var centerStart = context.map().center();
66424
66425               reveal('#surface', t('intro.navigation.drag'));
66426               context.map().on('drawn.intro', function() {
66427                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
66428               });
66429
66430               context.map().on('move.intro', function() {
66431                   var centerNow = context.map().center();
66432                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
66433                       context.map().on('move.intro', null);
66434                       timeout(function() { continueTo(zoomMap); }, 3000);
66435                   }
66436               });
66437
66438           }, msec + 100);
66439
66440           function continueTo(nextStep) {
66441               context.map().on('move.intro drawn.intro', null);
66442               nextStep();
66443           }
66444       }
66445
66446
66447       function zoomMap() {
66448           var zoomStart = context.map().zoom();
66449
66450           reveal('#surface',
66451               t('intro.navigation.zoom', {
66452                   plus: icon('#iD-icon-plus', 'pre-text'),
66453                   minus: icon('#iD-icon-minus', 'pre-text')
66454               })
66455           );
66456
66457           context.map().on('drawn.intro', function() {
66458               reveal('#surface',
66459                   t('intro.navigation.zoom', {
66460                       plus: icon('#iD-icon-plus', 'pre-text'),
66461                       minus: icon('#iD-icon-minus', 'pre-text')
66462                   }), { duration: 0 }
66463               );
66464           });
66465
66466           context.map().on('move.intro', function() {
66467               if (context.map().zoom() !== zoomStart) {
66468                   context.map().on('move.intro', null);
66469                   timeout(function() { continueTo(features); }, 3000);
66470               }
66471           });
66472
66473           function continueTo(nextStep) {
66474               context.map().on('move.intro drawn.intro', null);
66475               nextStep();
66476           }
66477       }
66478
66479
66480       function features() {
66481           var onClick = function() { continueTo(pointsLinesAreas); };
66482
66483           reveal('#surface', t('intro.navigation.features'),
66484               { buttonText: t('intro.ok'), buttonCallback: onClick }
66485           );
66486
66487           context.map().on('drawn.intro', function() {
66488               reveal('#surface', t('intro.navigation.features'),
66489                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66490               );
66491           });
66492
66493           function continueTo(nextStep) {
66494               context.map().on('drawn.intro', null);
66495               nextStep();
66496           }
66497       }
66498
66499       function pointsLinesAreas() {
66500           var onClick = function() { continueTo(nodesWays); };
66501
66502           reveal('#surface', t('intro.navigation.points_lines_areas'),
66503               { buttonText: t('intro.ok'), buttonCallback: onClick }
66504           );
66505
66506           context.map().on('drawn.intro', function() {
66507               reveal('#surface', t('intro.navigation.points_lines_areas'),
66508                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66509               );
66510           });
66511
66512           function continueTo(nextStep) {
66513               context.map().on('drawn.intro', null);
66514               nextStep();
66515           }
66516       }
66517
66518       function nodesWays() {
66519           var onClick = function() { continueTo(clickTownHall); };
66520
66521           reveal('#surface', t('intro.navigation.nodes_ways'),
66522               { buttonText: t('intro.ok'), buttonCallback: onClick }
66523           );
66524
66525           context.map().on('drawn.intro', function() {
66526               reveal('#surface', t('intro.navigation.nodes_ways'),
66527                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66528               );
66529           });
66530
66531           function continueTo(nextStep) {
66532               context.map().on('drawn.intro', null);
66533               nextStep();
66534           }
66535       }
66536
66537       function clickTownHall() {
66538           context.enter(modeBrowse(context));
66539           context.history().reset('initial');
66540
66541           var entity = context.hasEntity(hallId);
66542           if (!entity) return;
66543           reveal(null, null, { duration: 0 });
66544           context.map().centerZoomEase(entity.loc, 19, 500);
66545
66546           timeout(function() {
66547               var entity = context.hasEntity(hallId);
66548               if (!entity) return;
66549               var box = pointBox(entity.loc, context);
66550               reveal(box, t('intro.navigation.click_townhall'));
66551
66552               context.map().on('move.intro drawn.intro', function() {
66553                   var entity = context.hasEntity(hallId);
66554                   if (!entity) return;
66555                   var box = pointBox(entity.loc, context);
66556                   reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
66557               });
66558
66559               context.on('enter.intro', function() {
66560                   if (isTownHallSelected()) continueTo(selectedTownHall);
66561               });
66562
66563           }, 550);  // after centerZoomEase
66564
66565           context.history().on('change.intro', function() {
66566               if (!context.hasEntity(hallId)) {
66567                   continueTo(clickTownHall);
66568               }
66569           });
66570
66571           function continueTo(nextStep) {
66572               context.on('enter.intro', null);
66573               context.map().on('move.intro drawn.intro', null);
66574               context.history().on('change.intro', null);
66575               nextStep();
66576           }
66577       }
66578
66579
66580       function selectedTownHall() {
66581           if (!isTownHallSelected()) return clickTownHall();
66582
66583           var entity = context.hasEntity(hallId);
66584           if (!entity) return clickTownHall();
66585
66586           var box = pointBox(entity.loc, context);
66587           var onClick = function() { continueTo(editorTownHall); };
66588
66589           reveal(box, t('intro.navigation.selected_townhall'),
66590               { buttonText: t('intro.ok'), buttonCallback: onClick }
66591           );
66592
66593           context.map().on('move.intro drawn.intro', function() {
66594               var entity = context.hasEntity(hallId);
66595               if (!entity) return;
66596               var box = pointBox(entity.loc, context);
66597               reveal(box, t('intro.navigation.selected_townhall'),
66598                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66599               );
66600           });
66601
66602           context.history().on('change.intro', function() {
66603               if (!context.hasEntity(hallId)) {
66604                   continueTo(clickTownHall);
66605               }
66606           });
66607
66608           function continueTo(nextStep) {
66609               context.map().on('move.intro drawn.intro', null);
66610               context.history().on('change.intro', null);
66611               nextStep();
66612           }
66613       }
66614
66615
66616       function editorTownHall() {
66617           if (!isTownHallSelected()) return clickTownHall();
66618
66619           // disallow scrolling
66620           select('.inspector-wrap').on('wheel.intro', eventCancel);
66621
66622           var onClick = function() { continueTo(presetTownHall); };
66623
66624           reveal('.entity-editor-pane',
66625               t('intro.navigation.editor_townhall'),
66626               { buttonText: t('intro.ok'), buttonCallback: onClick }
66627           );
66628
66629           context.on('exit.intro', function() {
66630               continueTo(clickTownHall);
66631           });
66632
66633           context.history().on('change.intro', function() {
66634               if (!context.hasEntity(hallId)) {
66635                   continueTo(clickTownHall);
66636               }
66637           });
66638
66639           function continueTo(nextStep) {
66640               context.on('exit.intro', null);
66641               context.history().on('change.intro', null);
66642               select('.inspector-wrap').on('wheel.intro', null);
66643               nextStep();
66644           }
66645       }
66646
66647
66648       function presetTownHall() {
66649           if (!isTownHallSelected()) return clickTownHall();
66650
66651           // reset pane, in case user happened to change it..
66652           select('.inspector-wrap .panewrap').style('right', '0%');
66653           // disallow scrolling
66654           select('.inspector-wrap').on('wheel.intro', eventCancel);
66655
66656           // preset match, in case the user happened to change it.
66657           var entity = context.entity(context.selectedIDs()[0]);
66658           var preset = context.presets().match(entity, context.graph());
66659
66660           var onClick = function() { continueTo(fieldsTownHall); };
66661
66662           context.on('exit.intro', function() {
66663               continueTo(clickTownHall);
66664           });
66665
66666           context.history().on('change.intro', function() {
66667               if (!context.hasEntity(hallId)) {
66668                   continueTo(clickTownHall);
66669               }
66670           });
66671
66672           reveal('.inspector-body .preset-list-item.inspector-inner',
66673               t('intro.navigation.preset_townhall', { preset: preset.name() }),
66674               { buttonText: t('intro.ok'), buttonCallback: onClick }
66675           );
66676
66677           function continueTo(nextStep) {
66678               context.on('exit.intro', null);
66679               context.history().on('change.intro', null);
66680               select('.inspector-wrap').on('wheel.intro', null);
66681               nextStep();
66682           }
66683       }
66684
66685
66686       function fieldsTownHall() {
66687           if (!isTownHallSelected()) return clickTownHall();
66688
66689           // reset pane, in case user happened to change it..
66690           select('.inspector-wrap .panewrap').style('right', '0%');
66691           // disallow scrolling
66692           select('.inspector-wrap').on('wheel.intro', eventCancel);
66693
66694           var onClick = function() { continueTo(closeTownHall); };
66695
66696           reveal('.inspector-body .preset-editor',
66697               t('intro.navigation.fields_townhall'),
66698               { buttonText: t('intro.ok'), buttonCallback: onClick }
66699           );
66700
66701           context.on('exit.intro', function() {
66702               continueTo(clickTownHall);
66703           });
66704
66705           context.history().on('change.intro', function() {
66706               if (!context.hasEntity(hallId)) {
66707                   continueTo(clickTownHall);
66708               }
66709           });
66710
66711           function continueTo(nextStep) {
66712               context.on('exit.intro', null);
66713               context.history().on('change.intro', null);
66714               select('.inspector-wrap').on('wheel.intro', null);
66715               nextStep();
66716           }
66717       }
66718
66719
66720       function closeTownHall() {
66721           if (!isTownHallSelected()) return clickTownHall();
66722
66723           var selector = '.entity-editor-pane button.preset-close svg use';
66724           var href = select(selector).attr('href') || '#iD-icon-close';
66725
66726           reveal('.entity-editor-pane',
66727               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
66728           );
66729
66730           context.on('exit.intro', function() {
66731               continueTo(searchStreet);
66732           });
66733
66734           context.history().on('change.intro', function() {
66735               // update the close icon in the tooltip if the user edits something.
66736               var selector = '.entity-editor-pane button.preset-close svg use';
66737               var href = select(selector).attr('href') || '#iD-icon-close';
66738
66739               reveal('.entity-editor-pane',
66740                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
66741                   { duration: 0 }
66742               );
66743           });
66744
66745           function continueTo(nextStep) {
66746               context.on('exit.intro', null);
66747               context.history().on('change.intro', null);
66748               nextStep();
66749           }
66750       }
66751
66752
66753       function searchStreet() {
66754           context.enter(modeBrowse(context));
66755           context.history().reset('initial');  // ensure spring street exists
66756
66757           var msec = transitionTime(springStreet, context.map().center());
66758           if (msec) { reveal(null, null, { duration: 0 }); }
66759           context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
66760
66761           timeout(function() {
66762               reveal('.search-header input',
66763                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
66764               );
66765
66766               select('.search-header input')
66767                   .on('keyup.intro', checkSearchResult);
66768           }, msec + 100);
66769       }
66770
66771
66772       function checkSearchResult() {
66773           var first = select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
66774           var firstName = first.select('.entity-name');
66775           var name = t('intro.graph.name.spring-street');
66776
66777           if (!firstName.empty() && firstName.text() === name) {
66778               reveal(first.node(),
66779                   t('intro.navigation.choose_street', { name: name }),
66780                   { duration: 300 }
66781               );
66782
66783               context.on('exit.intro', function() {
66784                   continueTo(selectedStreet);
66785               });
66786
66787               select('.search-header input')
66788                   .on('keydown.intro', eventCancel, true)
66789                   .on('keyup.intro', null);
66790           }
66791
66792           function continueTo(nextStep) {
66793               context.on('exit.intro', null);
66794               select('.search-header input')
66795                   .on('keydown.intro', null)
66796                   .on('keyup.intro', null);
66797               nextStep();
66798           }
66799       }
66800
66801
66802       function selectedStreet() {
66803           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
66804               return searchStreet();
66805           }
66806
66807           var onClick = function() { continueTo(editorStreet); };
66808           var entity = context.entity(springStreetEndId);
66809           var box = pointBox(entity.loc, context);
66810           box.height = 500;
66811
66812           reveal(box,
66813               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
66814               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
66815           );
66816
66817           timeout(function() {
66818               context.map().on('move.intro drawn.intro', function() {
66819                   var entity = context.hasEntity(springStreetEndId);
66820                   if (!entity) return;
66821                   var box = pointBox(entity.loc, context);
66822                   box.height = 500;
66823                   reveal(box,
66824                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
66825                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
66826                   );
66827               });
66828           }, 600);  // after reveal.
66829
66830           context.on('enter.intro', function(mode) {
66831               if (!context.hasEntity(springStreetId)) {
66832                   return continueTo(searchStreet);
66833               }
66834               var ids = context.selectedIDs();
66835               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
66836                   // keep Spring Street selected..
66837                   context.enter(modeSelect(context, [springStreetId]));
66838               }
66839           });
66840
66841           context.history().on('change.intro', function() {
66842               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
66843                   timeout(function() {
66844                       continueTo(searchStreet);
66845                   }, 300);  // after any transition (e.g. if user deleted intersection)
66846               }
66847           });
66848
66849           function continueTo(nextStep) {
66850               context.map().on('move.intro drawn.intro', null);
66851               context.on('enter.intro', null);
66852               context.history().on('change.intro', null);
66853               nextStep();
66854           }
66855       }
66856
66857
66858       function editorStreet() {
66859           var selector = '.entity-editor-pane button.preset-close svg use';
66860           var href = select(selector).attr('href') || '#iD-icon-close';
66861
66862           reveal('.entity-editor-pane',
66863               t('intro.navigation.editor_street', {
66864                   button: icon(href, 'pre-text'),
66865                   field1: onewayField.label(),
66866                   field2: maxspeedField.label()
66867               })
66868           );
66869
66870           context.on('exit.intro', function() {
66871               continueTo(play);
66872           });
66873
66874           context.history().on('change.intro', function() {
66875               // update the close icon in the tooltip if the user edits something.
66876               var selector = '.entity-editor-pane button.preset-close svg use';
66877               var href = select(selector).attr('href') || '#iD-icon-close';
66878
66879               reveal('.entity-editor-pane',
66880                   t('intro.navigation.editor_street', {
66881                       button: icon(href, 'pre-text'),
66882                       field1: onewayField.label().toLowerCase(),
66883                       field2: maxspeedField.label().toLowerCase()
66884                   }), { duration: 0 }
66885               );
66886           });
66887
66888           function continueTo(nextStep) {
66889               context.on('exit.intro', null);
66890               context.history().on('change.intro', null);
66891               nextStep();
66892           }
66893       }
66894
66895
66896       function play() {
66897           dispatch$1.call('done');
66898           reveal('#id-container',
66899               t('intro.navigation.play', { next: t('intro.points.title') }), {
66900                   tooltipBox: '.intro-nav-wrap .chapter-point',
66901                   buttonText: t('intro.ok'),
66902                   buttonCallback: function() { reveal('#id-container'); }
66903               }
66904           );
66905       }
66906
66907
66908       chapter.enter = function() {
66909           dragMap();
66910       };
66911
66912
66913       chapter.exit = function() {
66914           timeouts.forEach(window.clearTimeout);
66915           context.on('enter.intro exit.intro', null);
66916           context.map().on('move.intro drawn.intro', null);
66917           context.history().on('change.intro', null);
66918           select('.inspector-wrap').on('wheel.intro', null);
66919           select('.search-header input').on('keydown.intro keyup.intro', null);
66920       };
66921
66922
66923       chapter.restart = function() {
66924           chapter.exit();
66925           chapter.enter();
66926       };
66927
66928
66929       return utilRebind(chapter, dispatch$1, 'on');
66930   }
66931
66932   function uiIntroPoint(context, reveal) {
66933       var dispatch$1 = dispatch('done');
66934       var timeouts = [];
66935       var intersection = [-85.63279, 41.94394];
66936       var building = [-85.632422, 41.944045];
66937       var cafePreset = context.presets().item('amenity/cafe');
66938       var _pointID = null;
66939
66940
66941       var chapter = {
66942           title: 'intro.points.title'
66943       };
66944
66945
66946       function timeout(f, t) {
66947           timeouts.push(window.setTimeout(f, t));
66948       }
66949
66950
66951       function revealEditMenu(loc, text, options) {
66952           var rect = context.surfaceRect();
66953           var point = context.curtainProjection(loc);
66954           var pad = 40;
66955           var width = 250 + (2 * pad);
66956           var height = 250;
66957           var startX = rect.left + point[0];
66958           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
66959           var box = {
66960               left: left,
66961               top: point[1] + rect.top - 60,
66962               width: width,
66963               height: height
66964           };
66965           reveal(box, text, options);
66966       }
66967
66968
66969       function eventCancel() {
66970           event.stopPropagation();
66971           event.preventDefault();
66972       }
66973
66974
66975       function addPoint() {
66976           context.enter(modeBrowse(context));
66977           context.history().reset('initial');
66978
66979           var msec = transitionTime(intersection, context.map().center());
66980           if (msec) { reveal(null, null, { duration: 0 }); }
66981           context.map().centerZoomEase(intersection, 19, msec);
66982
66983           timeout(function() {
66984               var tooltip = reveal('button.add-point',
66985                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
66986
66987               _pointID = null;
66988
66989               tooltip.selectAll('.tooltip-inner')
66990                   .insert('svg', 'span')
66991                   .attr('class', 'tooltip-illustration')
66992                   .append('use')
66993                   .attr('xlink:href', '#iD-graphic-points');
66994
66995               context.on('enter.intro', function(mode) {
66996                   if (mode.id !== 'add-point') return;
66997                   continueTo(placePoint);
66998               });
66999           }, msec + 100);
67000
67001           function continueTo(nextStep) {
67002               context.on('enter.intro', null);
67003               nextStep();
67004           }
67005       }
67006
67007
67008       function placePoint() {
67009           if (context.mode().id !== 'add-point') {
67010               return chapter.restart();
67011           }
67012
67013           var pointBox = pad$1(building, 150, context);
67014           reveal(pointBox, t('intro.points.place_point'));
67015
67016           context.map().on('move.intro drawn.intro', function() {
67017               pointBox = pad$1(building, 150, context);
67018               reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
67019           });
67020
67021           context.on('enter.intro', function(mode) {
67022               if (mode.id !== 'select') return chapter.restart();
67023               _pointID = context.mode().selectedIDs()[0];
67024               continueTo(searchPreset);
67025           });
67026
67027           function continueTo(nextStep) {
67028               context.map().on('move.intro drawn.intro', null);
67029               context.on('enter.intro', null);
67030               nextStep();
67031           }
67032       }
67033
67034
67035       function searchPreset() {
67036           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67037               return addPoint();
67038           }
67039
67040           // disallow scrolling
67041           select('.inspector-wrap').on('wheel.intro', eventCancel);
67042
67043           select('.preset-search-input')
67044               .on('keydown.intro', null)
67045               .on('keyup.intro', checkPresetSearch);
67046
67047           reveal('.preset-search-input',
67048               t('intro.points.search_cafe', { preset: cafePreset.name() })
67049           );
67050
67051           context.on('enter.intro', function(mode) {
67052               if (!_pointID || !context.hasEntity(_pointID)) {
67053                   return continueTo(addPoint);
67054               }
67055
67056               var ids = context.selectedIDs();
67057               if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
67058                   // keep the user's point selected..
67059                   context.enter(modeSelect(context, [_pointID]));
67060
67061                   // disallow scrolling
67062                   select('.inspector-wrap').on('wheel.intro', eventCancel);
67063
67064                   select('.preset-search-input')
67065                       .on('keydown.intro', null)
67066                       .on('keyup.intro', checkPresetSearch);
67067
67068                   reveal('.preset-search-input',
67069                       t('intro.points.search_cafe', { preset: cafePreset.name() })
67070                   );
67071
67072                   context.history().on('change.intro', null);
67073               }
67074           });
67075
67076
67077           function checkPresetSearch() {
67078               var first = select('.preset-list-item:first-child');
67079
67080               if (first.classed('preset-amenity-cafe')) {
67081                   select('.preset-search-input')
67082                       .on('keydown.intro', eventCancel, true)
67083                       .on('keyup.intro', null);
67084
67085                   reveal(first.select('.preset-list-button').node(),
67086                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
67087                       { duration: 300 }
67088                   );
67089
67090                   context.history().on('change.intro', function() {
67091                       continueTo(aboutFeatureEditor);
67092                   });
67093               }
67094           }
67095
67096           function continueTo(nextStep) {
67097               context.on('enter.intro', null);
67098               context.history().on('change.intro', null);
67099               select('.inspector-wrap').on('wheel.intro', null);
67100               select('.preset-search-input').on('keydown.intro keyup.intro', null);
67101               nextStep();
67102           }
67103       }
67104
67105
67106       function aboutFeatureEditor() {
67107           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67108               return addPoint();
67109           }
67110
67111           timeout(function() {
67112               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
67113                   tooltipClass: 'intro-points-describe',
67114                   buttonText: t('intro.ok'),
67115                   buttonCallback: function() { continueTo(addName); }
67116               });
67117           }, 400);
67118
67119           context.on('exit.intro', function() {
67120               // if user leaves select mode here, just continue with the tutorial.
67121               continueTo(reselectPoint);
67122           });
67123
67124           function continueTo(nextStep) {
67125               context.on('exit.intro', null);
67126               nextStep();
67127           }
67128       }
67129
67130
67131       function addName() {
67132           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67133               return addPoint();
67134           }
67135
67136           // reset pane, in case user happened to change it..
67137           select('.inspector-wrap .panewrap').style('right', '0%');
67138
67139           timeout(function() {
67140               // It's possible for the user to add a name in a previous step..
67141               // If so, don't tell them to add the name in this step.
67142               // Give them an OK button instead.
67143               var entity = context.entity(_pointID);
67144               if (entity.tags.name) {
67145                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
67146                       tooltipClass: 'intro-points-describe',
67147                       buttonText: t('intro.ok'),
67148                       buttonCallback: function() { continueTo(addCloseEditor); }
67149                   });
67150                   tooltip.select('.instruction').style('display', 'none');
67151
67152               } else {
67153                   reveal('.entity-editor-pane', t('intro.points.add_name'),
67154                       { tooltipClass: 'intro-points-describe' }
67155                   );
67156               }
67157           }, 400);
67158
67159           context.history().on('change.intro', function() {
67160               continueTo(addCloseEditor);
67161           });
67162
67163           context.on('exit.intro', function() {
67164               // if user leaves select mode here, just continue with the tutorial.
67165               continueTo(reselectPoint);
67166           });
67167
67168           function continueTo(nextStep) {
67169               context.on('exit.intro', null);
67170               context.history().on('change.intro', null);
67171               nextStep();
67172           }
67173       }
67174
67175
67176       function addCloseEditor() {
67177           // reset pane, in case user happened to change it..
67178           select('.inspector-wrap .panewrap').style('right', '0%');
67179
67180           var selector = '.entity-editor-pane button.preset-close svg use';
67181           var href = select(selector).attr('href') || '#iD-icon-close';
67182
67183           context.on('exit.intro', function() {
67184               continueTo(reselectPoint);
67185           });
67186
67187           reveal('.entity-editor-pane',
67188               t('intro.points.add_close', { button: icon(href, 'pre-text') })
67189           );
67190
67191           function continueTo(nextStep) {
67192               context.on('exit.intro', null);
67193               nextStep();
67194           }
67195       }
67196
67197
67198       function reselectPoint() {
67199           if (!_pointID) return chapter.restart();
67200           var entity = context.hasEntity(_pointID);
67201           if (!entity) return chapter.restart();
67202
67203           // make sure it's still a cafe, in case user somehow changed it..
67204           var oldPreset = context.presets().match(entity, context.graph());
67205           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
67206
67207           context.enter(modeBrowse(context));
67208
67209           var msec = transitionTime(entity.loc, context.map().center());
67210           if (msec) { reveal(null, null, { duration: 0 }); }
67211           context.map().centerEase(entity.loc, msec);
67212
67213           timeout(function() {
67214               var box = pointBox(entity.loc, context);
67215               reveal(box, t('intro.points.reselect'), { duration: 600 });
67216
67217               timeout(function() {
67218                   context.map().on('move.intro drawn.intro', function() {
67219                       var entity = context.hasEntity(_pointID);
67220                       if (!entity) return chapter.restart();
67221                       var box = pointBox(entity.loc, context);
67222                       reveal(box, t('intro.points.reselect'), { duration: 0 });
67223                   });
67224               }, 600); // after reveal..
67225
67226               context.on('enter.intro', function(mode) {
67227                   if (mode.id !== 'select') return;
67228                   continueTo(updatePoint);
67229               });
67230
67231           }, msec + 100);
67232
67233           function continueTo(nextStep) {
67234               context.map().on('move.intro drawn.intro', null);
67235               context.on('enter.intro', null);
67236               nextStep();
67237           }
67238       }
67239
67240
67241       function updatePoint() {
67242           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67243               return continueTo(reselectPoint);
67244           }
67245
67246           // reset pane, in case user happened to untag the point..
67247           select('.inspector-wrap .panewrap').style('right', '0%');
67248
67249           context.on('exit.intro', function() {
67250               continueTo(reselectPoint);
67251           });
67252
67253           context.history().on('change.intro', function() {
67254               continueTo(updateCloseEditor);
67255           });
67256
67257           timeout(function() {
67258               reveal('.entity-editor-pane', t('intro.points.update'),
67259                   { tooltipClass: 'intro-points-describe' }
67260               );
67261           }, 400);
67262
67263           function continueTo(nextStep) {
67264               context.on('exit.intro', null);
67265               context.history().on('change.intro', null);
67266               nextStep();
67267           }
67268       }
67269
67270
67271       function updateCloseEditor() {
67272           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
67273               return continueTo(reselectPoint);
67274           }
67275
67276           // reset pane, in case user happened to change it..
67277           select('.inspector-wrap .panewrap').style('right', '0%');
67278
67279           context.on('exit.intro', function() {
67280               continueTo(rightClickPoint);
67281           });
67282
67283           timeout(function() {
67284               reveal('.entity-editor-pane',
67285                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
67286               );
67287           }, 500);
67288
67289           function continueTo(nextStep) {
67290               context.on('exit.intro', null);
67291               nextStep();
67292           }
67293       }
67294
67295
67296       function rightClickPoint() {
67297           if (!_pointID) return chapter.restart();
67298           var entity = context.hasEntity(_pointID);
67299           if (!entity) return chapter.restart();
67300
67301           context.enter(modeBrowse(context));
67302
67303           var box = pointBox(entity.loc, context);
67304           reveal(box, t('intro.points.rightclick'), { duration: 600 });
67305
67306           timeout(function() {
67307               context.map().on('move.intro drawn.intro', function() {
67308                   var entity = context.hasEntity(_pointID);
67309                   if (!entity) return chapter.restart();
67310                   var box = pointBox(entity.loc, context);
67311                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
67312               });
67313           }, 600); // after reveal
67314
67315           context.on('enter.intro', function(mode) {
67316               if (mode.id !== 'select') return;
67317               var ids = context.selectedIDs();
67318               if (ids.length !== 1 || ids[0] !== _pointID) return;
67319
67320               timeout(function() {
67321                   var node = selectMenuItem('delete').node();
67322                   if (!node) return;
67323                   continueTo(enterDelete);
67324               }, 300);  // after menu visible
67325           });
67326
67327           function continueTo(nextStep) {
67328               context.on('enter.intro', null);
67329               context.map().on('move.intro drawn.intro', null);
67330               nextStep();
67331           }
67332       }
67333
67334
67335       function enterDelete() {
67336           if (!_pointID) return chapter.restart();
67337           var entity = context.hasEntity(_pointID);
67338           if (!entity) return chapter.restart();
67339
67340           var node = selectMenuItem('delete').node();
67341           if (!node) { return continueTo(rightClickPoint); }
67342
67343           revealEditMenu(entity.loc,
67344               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
67345           );
67346
67347           timeout(function() {
67348               context.map().on('move.intro drawn.intro', function() {
67349                   revealEditMenu(entity.loc,
67350                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
67351                       { duration: 0}
67352                   );
67353               });
67354           }, 300); // after menu visible
67355
67356           context.on('exit.intro', function() {
67357               if (!_pointID) return chapter.restart();
67358               var entity = context.hasEntity(_pointID);
67359               if (entity) return continueTo(rightClickPoint);  // point still exists
67360           });
67361
67362           context.history().on('change.intro', function(changed) {
67363               if (changed.deleted().length) {
67364                   continueTo(undo);
67365               }
67366           });
67367
67368           function continueTo(nextStep) {
67369               context.map().on('move.intro drawn.intro', null);
67370               context.history().on('change.intro', null);
67371               context.on('exit.intro', null);
67372               nextStep();
67373           }
67374       }
67375
67376
67377       function undo() {
67378           context.history().on('change.intro', function() {
67379               continueTo(play);
67380           });
67381
67382           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
67383           reveal('#bar button.undo-button',
67384               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
67385           );
67386
67387           function continueTo(nextStep) {
67388               context.history().on('change.intro', null);
67389               nextStep();
67390           }
67391       }
67392
67393
67394       function play() {
67395           dispatch$1.call('done');
67396           reveal('#id-container',
67397               t('intro.points.play', { next: t('intro.areas.title') }), {
67398                   tooltipBox: '.intro-nav-wrap .chapter-area',
67399                   buttonText: t('intro.ok'),
67400                   buttonCallback: function() { reveal('#id-container'); }
67401               }
67402           );
67403       }
67404
67405
67406       chapter.enter = function() {
67407           addPoint();
67408       };
67409
67410
67411       chapter.exit = function() {
67412           timeouts.forEach(window.clearTimeout);
67413           context.on('enter.intro exit.intro', null);
67414           context.map().on('move.intro drawn.intro', null);
67415           context.history().on('change.intro', null);
67416           select('.inspector-wrap').on('wheel.intro', eventCancel);
67417           select('.preset-search-input').on('keydown.intro keyup.intro', null);
67418       };
67419
67420
67421       chapter.restart = function() {
67422           chapter.exit();
67423           chapter.enter();
67424       };
67425
67426
67427       return utilRebind(chapter, dispatch$1, 'on');
67428   }
67429
67430   function uiIntroArea(context, reveal) {
67431       var dispatch$1 = dispatch('done');
67432       var playground = [-85.63552, 41.94159];
67433       var playgroundPreset = context.presets().item('leisure/playground');
67434       var descriptionField = context.presets().field('description');
67435       var timeouts = [];
67436       var _areaID;
67437
67438
67439       var chapter = {
67440           title: 'intro.areas.title'
67441       };
67442
67443
67444       function timeout(f, t) {
67445           timeouts.push(window.setTimeout(f, t));
67446       }
67447
67448
67449       function eventCancel() {
67450           event.stopPropagation();
67451           event.preventDefault();
67452       }
67453
67454
67455       function revealPlayground(center, text, options) {
67456           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
67457           var box = pad$1(center, padding, context);
67458           reveal(box, text, options);
67459       }
67460
67461
67462       function addArea() {
67463           context.enter(modeBrowse(context));
67464           context.history().reset('initial');
67465           _areaID = null;
67466
67467           var msec = transitionTime(playground, context.map().center());
67468           if (msec) { reveal(null, null, { duration: 0 }); }
67469           context.map().centerZoomEase(playground, 19, msec);
67470
67471           timeout(function() {
67472               var tooltip = reveal('button.add-area',
67473                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
67474
67475               tooltip.selectAll('.tooltip-inner')
67476                   .insert('svg', 'span')
67477                   .attr('class', 'tooltip-illustration')
67478                   .append('use')
67479                   .attr('xlink:href', '#iD-graphic-areas');
67480
67481               context.on('enter.intro', function(mode) {
67482                   if (mode.id !== 'add-area') return;
67483                   continueTo(startPlayground);
67484               });
67485           }, msec + 100);
67486
67487           function continueTo(nextStep) {
67488               context.on('enter.intro', null);
67489               nextStep();
67490           }
67491       }
67492
67493
67494       function startPlayground() {
67495           if (context.mode().id !== 'add-area') {
67496               return chapter.restart();
67497           }
67498
67499           _areaID = null;
67500           context.map().zoomEase(19.5, 500);
67501
67502           timeout(function() {
67503               revealPlayground(playground,
67504                   t('intro.areas.start_playground'), { duration: 250 }
67505               );
67506
67507               timeout(function() {
67508                   context.map().on('move.intro drawn.intro', function() {
67509                       revealPlayground(playground,
67510                           t('intro.areas.start_playground'), { duration: 0 }
67511                       );
67512                   });
67513                   context.on('enter.intro', function(mode) {
67514                       if (mode.id !== 'draw-area') return chapter.restart();
67515                       continueTo(continuePlayground);
67516                   });
67517               }, 250);  // after reveal
67518
67519           }, 550);  // after easing
67520
67521           function continueTo(nextStep) {
67522               context.map().on('move.intro drawn.intro', null);
67523               context.on('enter.intro', null);
67524               nextStep();
67525           }
67526       }
67527
67528
67529       function continuePlayground() {
67530           if (context.mode().id !== 'draw-area') {
67531               return chapter.restart();
67532           }
67533
67534           _areaID = null;
67535           revealPlayground(playground,
67536               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
67537               { duration: 250 }
67538           );
67539
67540           timeout(function() {
67541               context.map().on('move.intro drawn.intro', function() {
67542                   revealPlayground(playground,
67543                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
67544                       { duration: 0 }
67545                   );
67546               });
67547           }, 250);  // after reveal
67548
67549           context.on('enter.intro', function(mode) {
67550               if (mode.id === 'draw-area') {
67551                   var entity = context.hasEntity(context.selectedIDs()[0]);
67552                   if (entity && entity.nodes.length >= 6) {
67553                       return continueTo(finishPlayground);
67554                   } else {
67555                       return;
67556                   }
67557               } else if (mode.id === 'select') {
67558                   _areaID = context.selectedIDs()[0];
67559                   return continueTo(searchPresets);
67560               } else {
67561                   return chapter.restart();
67562               }
67563           });
67564
67565           function continueTo(nextStep) {
67566               context.map().on('move.intro drawn.intro', null);
67567               context.on('enter.intro', null);
67568               nextStep();
67569           }
67570       }
67571
67572
67573       function finishPlayground() {
67574           if (context.mode().id !== 'draw-area') {
67575               return chapter.restart();
67576           }
67577
67578           _areaID = null;
67579           revealPlayground(playground,
67580               t('intro.areas.finish_playground'), { duration: 250 }
67581           );
67582
67583           timeout(function() {
67584               context.map().on('move.intro drawn.intro', function() {
67585                   revealPlayground(playground,
67586                       t('intro.areas.finish_playground'), { duration: 0 }
67587                   );
67588               });
67589           }, 250);  // after reveal
67590
67591           context.on('enter.intro', function(mode) {
67592               if (mode.id === 'draw-area') {
67593                   return;
67594               } else if (mode.id === 'select') {
67595                   _areaID = context.selectedIDs()[0];
67596                   return continueTo(searchPresets);
67597               } else {
67598                   return chapter.restart();
67599               }
67600           });
67601
67602           function continueTo(nextStep) {
67603               context.map().on('move.intro drawn.intro', null);
67604               context.on('enter.intro', null);
67605               nextStep();
67606           }
67607       }
67608
67609
67610       function searchPresets() {
67611           if (!_areaID || !context.hasEntity(_areaID)) {
67612               return addArea();
67613           }
67614           var ids = context.selectedIDs();
67615           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67616               context.enter(modeSelect(context, [_areaID]));
67617           }
67618
67619           // disallow scrolling
67620           select('.inspector-wrap').on('wheel.intro', eventCancel);
67621
67622           timeout(function() {
67623               // reset pane, in case user somehow happened to change it..
67624               select('.inspector-wrap .panewrap').style('right', '-100%');
67625
67626               select('.preset-search-input')
67627                   .on('keydown.intro', null)
67628                   .on('keyup.intro', checkPresetSearch);
67629
67630               reveal('.preset-search-input',
67631                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
67632               );
67633           }, 400);  // after preset list pane visible..
67634
67635           context.on('enter.intro', function(mode) {
67636               if (!_areaID || !context.hasEntity(_areaID)) {
67637                   return continueTo(addArea);
67638               }
67639
67640               var ids = context.selectedIDs();
67641               if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
67642                   // keep the user's area selected..
67643                   context.enter(modeSelect(context, [_areaID]));
67644
67645                   // reset pane, in case user somehow happened to change it..
67646                   select('.inspector-wrap .panewrap').style('right', '-100%');
67647                   // disallow scrolling
67648                   select('.inspector-wrap').on('wheel.intro', eventCancel);
67649
67650                   select('.preset-search-input')
67651                       .on('keydown.intro', null)
67652                       .on('keyup.intro', checkPresetSearch);
67653
67654                   reveal('.preset-search-input',
67655                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
67656                   );
67657
67658                   context.history().on('change.intro', null);
67659               }
67660           });
67661
67662           function checkPresetSearch() {
67663               var first = select('.preset-list-item:first-child');
67664
67665               if (first.classed('preset-leisure-playground')) {
67666                   reveal(first.select('.preset-list-button').node(),
67667                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
67668                       { duration: 300 }
67669                   );
67670
67671                   select('.preset-search-input')
67672                       .on('keydown.intro', eventCancel, true)
67673                       .on('keyup.intro', null);
67674
67675                   context.history().on('change.intro', function() {
67676                       continueTo(clickAddField);
67677                   });
67678               }
67679           }
67680
67681           function continueTo(nextStep) {
67682               select('.inspector-wrap').on('wheel.intro', null);
67683               context.on('enter.intro', null);
67684               context.history().on('change.intro', null);
67685               select('.preset-search-input').on('keydown.intro keyup.intro', null);
67686               nextStep();
67687           }
67688       }
67689
67690
67691       function clickAddField() {
67692           if (!_areaID || !context.hasEntity(_areaID)) {
67693               return addArea();
67694           }
67695           var ids = context.selectedIDs();
67696           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67697               return searchPresets();
67698           }
67699
67700           if (!select('.form-field-description').empty()) {
67701               return continueTo(describePlayground);
67702           }
67703
67704           // disallow scrolling
67705           select('.inspector-wrap').on('wheel.intro', eventCancel);
67706
67707           timeout(function() {
67708               // reset pane, in case user somehow happened to change it..
67709               select('.inspector-wrap .panewrap').style('right', '0%');
67710
67711               // It's possible for the user to add a description in a previous step..
67712               // If they did this already, just continue to next step.
67713               var entity = context.entity(_areaID);
67714               if (entity.tags.description) {
67715                   return continueTo(play);
67716               }
67717
67718               // scroll "Add field" into view
67719               var box = select('.more-fields').node().getBoundingClientRect();
67720               if (box.top > 300) {
67721                   var pane = select('.entity-editor-pane .inspector-body');
67722                   var start = pane.node().scrollTop;
67723                   var end = start + (box.top - 300);
67724
67725                   pane
67726                       .transition()
67727                       .duration(250)
67728                       .tween('scroll.inspector', function() {
67729                           var node = this;
67730                           var i = interpolateNumber(start, end);
67731                           return function(t) {
67732                               node.scrollTop = i(t);
67733                           };
67734                       });
67735               }
67736
67737               timeout(function() {
67738                   reveal('.more-fields .combobox-input',
67739                       t('intro.areas.add_field'),
67740                       { duration: 300 }
67741                   );
67742
67743                   select('.more-fields .combobox-input')
67744                       .on('click.intro', function() {
67745                           // Watch for the combobox to appear...
67746                           var watcher;
67747                           watcher = window.setInterval(function() {
67748                               if (!select('div.combobox').empty()) {
67749                                   window.clearInterval(watcher);
67750                                   continueTo(chooseDescriptionField);
67751                               }
67752                           }, 300);
67753                       });
67754               }, 300);  // after "Add Field" visible
67755
67756           }, 400);  // after editor pane visible
67757
67758           context.on('exit.intro', function() {
67759               return continueTo(searchPresets);
67760           });
67761
67762           function continueTo(nextStep) {
67763               select('.inspector-wrap').on('wheel.intro', null);
67764               select('.more-fields .combobox-input').on('click.intro', null);
67765               context.on('exit.intro', null);
67766               nextStep();
67767           }
67768       }
67769
67770
67771       function chooseDescriptionField() {
67772           if (!_areaID || !context.hasEntity(_areaID)) {
67773               return addArea();
67774           }
67775           var ids = context.selectedIDs();
67776           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67777               return searchPresets();
67778           }
67779
67780           if (!select('.form-field-description').empty()) {
67781               return continueTo(describePlayground);
67782           }
67783
67784           // Make sure combobox is ready..
67785           if (select('div.combobox').empty()) {
67786               return continueTo(clickAddField);
67787           }
67788           // Watch for the combobox to go away..
67789           var watcher;
67790           watcher = window.setInterval(function() {
67791               if (select('div.combobox').empty()) {
67792                   window.clearInterval(watcher);
67793                   timeout(function() {
67794                       if (select('.form-field-description').empty()) {
67795                           continueTo(retryChooseDescription);
67796                       } else {
67797                           continueTo(describePlayground);
67798                       }
67799                   }, 300);  // after description field added.
67800               }
67801           }, 300);
67802
67803           reveal('div.combobox',
67804               t('intro.areas.choose_field', { field: descriptionField.label() }),
67805               { duration: 300 }
67806           );
67807
67808           context.on('exit.intro', function() {
67809               return continueTo(searchPresets);
67810           });
67811
67812           function continueTo(nextStep) {
67813               if (watcher) window.clearInterval(watcher);
67814               context.on('exit.intro', null);
67815               nextStep();
67816           }
67817       }
67818
67819
67820       function describePlayground() {
67821           if (!_areaID || !context.hasEntity(_areaID)) {
67822               return addArea();
67823           }
67824           var ids = context.selectedIDs();
67825           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67826               return searchPresets();
67827           }
67828
67829           // reset pane, in case user happened to change it..
67830           select('.inspector-wrap .panewrap').style('right', '0%');
67831
67832           if (select('.form-field-description').empty()) {
67833               return continueTo(retryChooseDescription);
67834           }
67835
67836           context.on('exit.intro', function() {
67837               continueTo(play);
67838           });
67839
67840           reveal('.entity-editor-pane',
67841               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
67842               { duration: 300 }
67843           );
67844
67845           function continueTo(nextStep) {
67846               context.on('exit.intro', null);
67847               nextStep();
67848           }
67849       }
67850
67851
67852       function retryChooseDescription() {
67853           if (!_areaID || !context.hasEntity(_areaID)) {
67854               return addArea();
67855           }
67856           var ids = context.selectedIDs();
67857           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
67858               return searchPresets();
67859           }
67860
67861           // reset pane, in case user happened to change it..
67862           select('.inspector-wrap .panewrap').style('right', '0%');
67863
67864           reveal('.entity-editor-pane',
67865               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
67866               buttonText: t('intro.ok'),
67867               buttonCallback: function() { continueTo(clickAddField); }
67868           });
67869
67870           context.on('exit.intro', function() {
67871               return continueTo(searchPresets);
67872           });
67873
67874           function continueTo(nextStep) {
67875               context.on('exit.intro', null);
67876               nextStep();
67877           }
67878       }
67879
67880
67881       function play() {
67882           dispatch$1.call('done');
67883           reveal('#id-container',
67884               t('intro.areas.play', { next: t('intro.lines.title') }), {
67885                   tooltipBox: '.intro-nav-wrap .chapter-line',
67886                   buttonText: t('intro.ok'),
67887                   buttonCallback: function() { reveal('#id-container'); }
67888               }
67889           );
67890       }
67891
67892
67893       chapter.enter = function() {
67894           addArea();
67895       };
67896
67897
67898       chapter.exit = function() {
67899           timeouts.forEach(window.clearTimeout);
67900           context.on('enter.intro exit.intro', null);
67901           context.map().on('move.intro drawn.intro', null);
67902           context.history().on('change.intro', null);
67903           select('.inspector-wrap').on('wheel.intro', null);
67904           select('.preset-search-input').on('keydown.intro keyup.intro', null);
67905           select('.more-fields .combobox-input').on('click.intro', null);
67906       };
67907
67908
67909       chapter.restart = function() {
67910           chapter.exit();
67911           chapter.enter();
67912       };
67913
67914
67915       return utilRebind(chapter, dispatch$1, 'on');
67916   }
67917
67918   function uiIntroLine(context, reveal) {
67919       var dispatch$1 = dispatch('done');
67920       var timeouts = [];
67921       var _tulipRoadID = null;
67922       var flowerRoadID = 'w646';
67923       var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
67924       var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
67925       var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
67926       var roadCategory = context.presets().item('category-road');
67927       var residentialPreset = context.presets().item('highway/residential');
67928       var woodRoadID = 'w525';
67929       var woodRoadEndID = 'n2862';
67930       var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
67931       var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
67932       var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
67933       var washingtonStreetID = 'w522';
67934       var twelfthAvenueID = 'w1';
67935       var eleventhAvenueEndID = 'n3550';
67936       var twelfthAvenueEndID = 'n5';
67937       var _washingtonSegmentID = null;
67938       var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
67939       var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
67940       var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
67941       var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
67942
67943
67944       var chapter = {
67945           title: 'intro.lines.title'
67946       };
67947
67948
67949       function timeout(f, t) {
67950           timeouts.push(window.setTimeout(f, t));
67951       }
67952
67953
67954       function eventCancel() {
67955           event.stopPropagation();
67956           event.preventDefault();
67957       }
67958
67959
67960       function revealEditMenu(loc, text, options) {
67961           var rect = context.surfaceRect();
67962           var point = context.curtainProjection(loc);
67963           var pad = 40;
67964           var width = 250 + (2 * pad);
67965           var height = 350;
67966           var startX = rect.left + point[0];
67967           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
67968           var box = {
67969               left: left,
67970               top: point[1] + rect.top - 60,
67971               width: width,
67972               height: height
67973           };
67974           reveal(box, text, options);
67975       }
67976
67977
67978       function addLine() {
67979           context.enter(modeBrowse(context));
67980           context.history().reset('initial');
67981
67982           var msec = transitionTime(tulipRoadStart, context.map().center());
67983           if (msec) { reveal(null, null, { duration: 0 }); }
67984           context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
67985
67986           timeout(function() {
67987               var tooltip = reveal('button.add-line',
67988                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
67989
67990               tooltip.selectAll('.tooltip-inner')
67991                   .insert('svg', 'span')
67992                   .attr('class', 'tooltip-illustration')
67993                   .append('use')
67994                   .attr('xlink:href', '#iD-graphic-lines');
67995
67996               context.on('enter.intro', function(mode) {
67997                   if (mode.id !== 'add-line') return;
67998                   continueTo(startLine);
67999               });
68000           }, msec + 100);
68001
68002           function continueTo(nextStep) {
68003               context.on('enter.intro', null);
68004               nextStep();
68005           }
68006       }
68007
68008
68009       function startLine() {
68010           if (context.mode().id !== 'add-line') return chapter.restart();
68011
68012           _tulipRoadID = null;
68013
68014           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
68015           var box = pad$1(tulipRoadStart, padding, context);
68016           box.height = box.height + 100;
68017           reveal(box, t('intro.lines.start_line'));
68018
68019           context.map().on('move.intro drawn.intro', function() {
68020               padding = 70 * Math.pow(2, context.map().zoom() - 18);
68021               box = pad$1(tulipRoadStart, padding, context);
68022               box.height = box.height + 100;
68023               reveal(box, t('intro.lines.start_line'), { duration: 0 });
68024           });
68025
68026           context.on('enter.intro', function(mode) {
68027               if (mode.id !== 'draw-line') return chapter.restart();
68028               continueTo(drawLine);
68029           });
68030
68031           function continueTo(nextStep) {
68032               context.map().on('move.intro drawn.intro', null);
68033               context.on('enter.intro', null);
68034               nextStep();
68035           }
68036       }
68037
68038
68039       function drawLine() {
68040           if (context.mode().id !== 'draw-line') return chapter.restart();
68041
68042           _tulipRoadID = context.mode().selectedIDs()[0];
68043           context.map().centerEase(tulipRoadMidpoint, 500);
68044
68045           timeout(function() {
68046               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
68047               var box = pad$1(tulipRoadMidpoint, padding, context);
68048               box.height = box.height * 2;
68049               reveal(box,
68050                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
68051               );
68052
68053               context.map().on('move.intro drawn.intro', function() {
68054                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
68055                   box = pad$1(tulipRoadMidpoint, padding, context);
68056                   box.height = box.height * 2;
68057                   reveal(box,
68058                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
68059                       { duration: 0 }
68060                   );
68061               });
68062           }, 550);  // after easing..
68063
68064           context.history().on('change.intro', function() {
68065               if (isLineConnected()) {
68066                   continueTo(continueLine);
68067               }
68068           });
68069
68070           context.on('enter.intro', function(mode) {
68071               if (mode.id === 'draw-line') {
68072                   return;
68073               } else if (mode.id === 'select') {
68074                   continueTo(retryIntersect);
68075                   return;
68076               } else {
68077                   return chapter.restart();
68078               }
68079           });
68080
68081           function continueTo(nextStep) {
68082               context.map().on('move.intro drawn.intro', null);
68083               context.history().on('change.intro', null);
68084               context.on('enter.intro', null);
68085               nextStep();
68086           }
68087       }
68088
68089
68090       function isLineConnected() {
68091           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
68092           if (!entity) return false;
68093
68094           var drawNodes = context.graph().childNodes(entity);
68095           return some(drawNodes, function(node) {
68096               return some(context.graph().parentWays(node), function(parent) {
68097                   return parent.id === flowerRoadID;
68098               });
68099           });
68100       }
68101
68102
68103       function retryIntersect() {
68104           select(window).on('mousedown.intro', eventCancel, true);
68105
68106           var box = pad$1(tulipRoadIntersection, 80, context);
68107           reveal(box,
68108               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
68109           );
68110
68111           timeout(chapter.restart, 3000);
68112       }
68113
68114
68115       function continueLine() {
68116           if (context.mode().id !== 'draw-line') return chapter.restart();
68117           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
68118           if (!entity) return chapter.restart();
68119
68120           context.map().centerEase(tulipRoadIntersection, 500);
68121
68122           reveal('#surface', t('intro.lines.continue_line'));
68123
68124           context.on('enter.intro', function(mode) {
68125               if (mode.id === 'draw-line')
68126                   return;
68127               else if (mode.id === 'select')
68128                   return continueTo(chooseCategoryRoad);
68129               else
68130                   return chapter.restart();
68131           });
68132
68133           function continueTo(nextStep) {
68134               context.on('enter.intro', null);
68135               nextStep();
68136           }
68137       }
68138
68139
68140       function chooseCategoryRoad() {
68141           if (context.mode().id !== 'select') return chapter.restart();
68142
68143           context.on('exit.intro', function() {
68144               return chapter.restart();
68145           });
68146
68147           var button = select('.preset-category-road .preset-list-button');
68148           if (button.empty()) return chapter.restart();
68149
68150           // disallow scrolling
68151           select('.inspector-wrap').on('wheel.intro', eventCancel);
68152
68153           timeout(function() {
68154               // reset pane, in case user somehow happened to change it..
68155               select('.inspector-wrap .panewrap').style('right', '-100%');
68156
68157               reveal(button.node(),
68158                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
68159               );
68160
68161               button.on('click.intro', function() {
68162                   continueTo(choosePresetResidential);
68163               });
68164
68165           }, 400);  // after editor pane visible
68166
68167           function continueTo(nextStep) {
68168               select('.inspector-wrap').on('wheel.intro', null);
68169               select('.preset-list-button').on('click.intro', null);
68170               context.on('exit.intro', null);
68171               nextStep();
68172           }
68173       }
68174
68175
68176       function choosePresetResidential() {
68177           if (context.mode().id !== 'select') return chapter.restart();
68178
68179           context.on('exit.intro', function() {
68180               return chapter.restart();
68181           });
68182
68183           var subgrid = select('.preset-category-road .subgrid');
68184           if (subgrid.empty()) return chapter.restart();
68185
68186           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
68187               .on('click.intro', function() {
68188                   continueTo(retryPresetResidential);
68189               });
68190
68191           subgrid.selectAll('.preset-highway-residential .preset-list-button')
68192               .on('click.intro', function() {
68193                   continueTo(nameRoad);
68194               });
68195
68196           timeout(function() {
68197               reveal(subgrid.node(),
68198                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
68199                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
68200               );
68201           }, 300);
68202
68203           function continueTo(nextStep) {
68204               select('.preset-list-button').on('click.intro', null);
68205               context.on('exit.intro', null);
68206               nextStep();
68207           }
68208       }
68209
68210
68211       // selected wrong road type
68212       function retryPresetResidential() {
68213           if (context.mode().id !== 'select') return chapter.restart();
68214
68215           context.on('exit.intro', function() {
68216               return chapter.restart();
68217           });
68218
68219           // disallow scrolling
68220           select('.inspector-wrap').on('wheel.intro', eventCancel);
68221
68222           timeout(function() {
68223               var button = select('.entity-editor-pane .preset-list-button');
68224
68225               reveal(button.node(),
68226                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
68227               );
68228
68229               button.on('click.intro', function() {
68230                   continueTo(chooseCategoryRoad);
68231               });
68232
68233           }, 500);
68234
68235           function continueTo(nextStep) {
68236               select('.inspector-wrap').on('wheel.intro', null);
68237               select('.preset-list-button').on('click.intro', null);
68238               context.on('exit.intro', null);
68239               nextStep();
68240           }
68241       }
68242
68243
68244       function nameRoad() {
68245           context.on('exit.intro', function() {
68246               continueTo(didNameRoad);
68247           });
68248
68249           timeout(function() {
68250               reveal('.entity-editor-pane',
68251                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
68252                   { tooltipClass: 'intro-lines-name_road' }
68253               );
68254           }, 500);
68255
68256           function continueTo(nextStep) {
68257               context.on('exit.intro', null);
68258               nextStep();
68259           }
68260       }
68261
68262
68263       function didNameRoad() {
68264           context.history().checkpoint('doneAddLine');
68265
68266           timeout(function() {
68267               reveal('#surface', t('intro.lines.did_name_road'), {
68268                   buttonText: t('intro.ok'),
68269                   buttonCallback: function() { continueTo(updateLine); }
68270               });
68271           }, 500);
68272
68273           function continueTo(nextStep) {
68274               nextStep();
68275           }
68276       }
68277
68278
68279       function updateLine() {
68280           context.history().reset('doneAddLine');
68281           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68282               return chapter.restart();
68283           }
68284
68285           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
68286           if (msec) { reveal(null, null, { duration: 0 }); }
68287           context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
68288
68289           timeout(function() {
68290               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
68291               var box = pad$1(woodRoadDragMidpoint, padding, context);
68292               var advance = function() { continueTo(addNode); };
68293
68294               reveal(box, t('intro.lines.update_line'),
68295                   { buttonText: t('intro.ok'), buttonCallback: advance }
68296               );
68297
68298               context.map().on('move.intro drawn.intro', function() {
68299                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
68300                   var box = pad$1(woodRoadDragMidpoint, padding, context);
68301                   reveal(box, t('intro.lines.update_line'),
68302                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68303                   );
68304               });
68305           }, msec + 100);
68306
68307           function continueTo(nextStep) {
68308               context.map().on('move.intro drawn.intro', null);
68309               nextStep();
68310           }
68311       }
68312
68313
68314       function addNode() {
68315           context.history().reset('doneAddLine');
68316           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68317               return chapter.restart();
68318           }
68319
68320           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
68321           var box = pad$1(woodRoadAddNode, padding, context);
68322           reveal(box, t('intro.lines.add_node'));
68323
68324           context.map().on('move.intro drawn.intro', function() {
68325               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
68326               var box = pad$1(woodRoadAddNode, padding, context);
68327               reveal(box, t('intro.lines.add_node'), { duration: 0 });
68328           });
68329
68330           context.history().on('change.intro', function(changed) {
68331               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68332                   return continueTo(updateLine);
68333               }
68334               if (changed.created().length === 1) {
68335                   timeout(function() { continueTo(startDragEndpoint); }, 500);
68336               }
68337           });
68338
68339           context.on('enter.intro', function(mode) {
68340               if (mode.id !== 'select') {
68341                   continueTo(updateLine);
68342               }
68343           });
68344
68345           function continueTo(nextStep) {
68346               context.map().on('move.intro drawn.intro', null);
68347               context.history().on('change.intro', null);
68348               context.on('enter.intro', null);
68349               nextStep();
68350           }
68351       }
68352
68353
68354       function startDragEndpoint() {
68355           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68356               return continueTo(updateLine);
68357           }
68358           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68359           var box = pad$1(woodRoadDragEndpoint, padding, context);
68360           reveal(box, t('intro.lines.start_drag_endpoint'));
68361
68362           context.map().on('move.intro drawn.intro', function() {
68363               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68364                   return continueTo(updateLine);
68365               }
68366               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68367               var box = pad$1(woodRoadDragEndpoint, padding, context);
68368               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
68369
68370               var entity = context.entity(woodRoadEndID);
68371               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
68372                   continueTo(finishDragEndpoint);
68373               }
68374           });
68375
68376           function continueTo(nextStep) {
68377               context.map().on('move.intro drawn.intro', null);
68378               nextStep();
68379           }
68380       }
68381
68382
68383       function finishDragEndpoint() {
68384           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68385               return continueTo(updateLine);
68386           }
68387
68388           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68389           var box = pad$1(woodRoadDragEndpoint, padding, context);
68390           reveal(box, t('intro.lines.finish_drag_endpoint'));
68391
68392           context.map().on('move.intro drawn.intro', function() {
68393               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68394                   return continueTo(updateLine);
68395               }
68396               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68397               var box = pad$1(woodRoadDragEndpoint, padding, context);
68398               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
68399
68400               var entity = context.entity(woodRoadEndID);
68401               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
68402                   continueTo(startDragEndpoint);
68403               }
68404           });
68405
68406           context.on('enter.intro', function() {
68407               continueTo(startDragMidpoint);
68408           });
68409
68410           function continueTo(nextStep) {
68411               context.map().on('move.intro drawn.intro', null);
68412               context.on('enter.intro', null);
68413               nextStep();
68414           }
68415       }
68416
68417
68418       function startDragMidpoint() {
68419           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68420               return continueTo(updateLine);
68421           }
68422           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
68423               context.enter(modeSelect(context, [woodRoadID]));
68424           }
68425
68426           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
68427           var box = pad$1(woodRoadDragMidpoint, padding, context);
68428           reveal(box, t('intro.lines.start_drag_midpoint'));
68429
68430           context.map().on('move.intro drawn.intro', function() {
68431               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68432                   return continueTo(updateLine);
68433               }
68434               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
68435               var box = pad$1(woodRoadDragMidpoint, padding, context);
68436               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
68437           });
68438
68439           context.history().on('change.intro', function(changed) {
68440               if (changed.created().length === 1) {
68441                   continueTo(continueDragMidpoint);
68442               }
68443           });
68444
68445           context.on('enter.intro', function(mode) {
68446               if (mode.id !== 'select') {
68447                   // keep Wood Road selected so midpoint triangles are drawn..
68448                   context.enter(modeSelect(context, [woodRoadID]));
68449               }
68450           });
68451
68452           function continueTo(nextStep) {
68453               context.map().on('move.intro drawn.intro', null);
68454               context.history().on('change.intro', null);
68455               context.on('enter.intro', null);
68456               nextStep();
68457           }
68458       }
68459
68460
68461       function continueDragMidpoint() {
68462           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68463               return continueTo(updateLine);
68464           }
68465
68466           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68467           var box = pad$1(woodRoadDragEndpoint, padding, context);
68468           box.height += 400;
68469
68470           var advance = function() {
68471               context.history().checkpoint('doneUpdateLine');
68472               continueTo(deleteLines);
68473           };
68474
68475           reveal(box, t('intro.lines.continue_drag_midpoint'),
68476               { buttonText: t('intro.ok'), buttonCallback: advance }
68477           );
68478
68479           context.map().on('move.intro drawn.intro', function() {
68480               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
68481                   return continueTo(updateLine);
68482               }
68483               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
68484               var box = pad$1(woodRoadDragEndpoint, padding, context);
68485               box.height += 400;
68486               reveal(box, t('intro.lines.continue_drag_midpoint'),
68487                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68488               );
68489           });
68490
68491           function continueTo(nextStep) {
68492               context.map().on('move.intro drawn.intro', null);
68493               nextStep();
68494           }
68495       }
68496
68497
68498       function deleteLines() {
68499           context.history().reset('doneUpdateLine');
68500           context.enter(modeBrowse(context));
68501
68502           if (!context.hasEntity(washingtonStreetID) ||
68503               !context.hasEntity(twelfthAvenueID) ||
68504               !context.hasEntity(eleventhAvenueEndID)) {
68505               return chapter.restart();
68506           }
68507
68508           var msec = transitionTime(deleteLinesLoc, context.map().center());
68509           if (msec) { reveal(null, null, { duration: 0 }); }
68510           context.map().centerZoomEase(deleteLinesLoc, 18, msec);
68511
68512           timeout(function() {
68513               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68514               var box = pad$1(deleteLinesLoc, padding, context);
68515               box.top -= 200;
68516               box.height += 400;
68517               var advance = function() { continueTo(rightClickIntersection); };
68518
68519               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
68520                   { buttonText: t('intro.ok'), buttonCallback: advance }
68521               );
68522
68523               context.map().on('move.intro drawn.intro', function() {
68524                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68525                   var box = pad$1(deleteLinesLoc, padding, context);
68526                   box.top -= 200;
68527                   box.height += 400;
68528                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
68529                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68530                   );
68531               });
68532
68533               context.history().on('change.intro', function() {
68534                   timeout(function() {
68535                       continueTo(deleteLines);
68536                   }, 500);  // after any transition (e.g. if user deleted intersection)
68537               });
68538
68539           }, msec + 100);
68540
68541           function continueTo(nextStep) {
68542               context.map().on('move.intro drawn.intro', null);
68543               context.history().on('change.intro', null);
68544               nextStep();
68545           }
68546       }
68547
68548
68549       function rightClickIntersection() {
68550           context.history().reset('doneUpdateLine');
68551           context.enter(modeBrowse(context));
68552
68553           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
68554
68555           timeout(function() {
68556               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68557               var box = pad$1(eleventhAvenueEnd, padding, context);
68558               reveal(box, t('intro.lines.rightclick_intersection',
68559                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
68560               );
68561
68562               context.map().on('move.intro drawn.intro', function() {
68563                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68564                   var box = pad$1(eleventhAvenueEnd, padding, context);
68565                   reveal(box, t('intro.lines.rightclick_intersection',
68566                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
68567                       { duration: 0 }
68568                   );
68569               });
68570
68571               context.on('enter.intro', function(mode) {
68572                   if (mode.id !== 'select') return;
68573                   var ids = context.selectedIDs();
68574                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
68575
68576                   timeout(function() {
68577                       var node = selectMenuItem('split').node();
68578                       if (!node) return;
68579                       continueTo(splitIntersection);
68580                   }, 300);  // after menu visible
68581               });
68582
68583               context.history().on('change.intro', function() {
68584                   timeout(function() {
68585                       continueTo(deleteLines);
68586                   }, 300);  // after any transition (e.g. if user deleted intersection)
68587               });
68588
68589           }, 600);
68590
68591           function continueTo(nextStep) {
68592               context.map().on('move.intro drawn.intro', null);
68593               context.on('enter.intro', null);
68594               context.history().on('change.intro', null);
68595               nextStep();
68596           }
68597       }
68598
68599
68600       function splitIntersection() {
68601           if (!context.hasEntity(washingtonStreetID) ||
68602               !context.hasEntity(twelfthAvenueID) ||
68603               !context.hasEntity(eleventhAvenueEndID)) {
68604               return continueTo(deleteLines);
68605           }
68606
68607           var node = selectMenuItem('split').node();
68608           if (!node) { return continueTo(rightClickIntersection); }
68609
68610           var wasChanged = false;
68611           var menuCoords = context.map().mouseCoordinates();
68612           _washingtonSegmentID = null;
68613
68614           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
68615               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
68616           );
68617
68618           context.map().on('move.intro drawn.intro', function() {
68619               var node = selectMenuItem('split').node();
68620               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
68621
68622               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
68623                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
68624                   { duration: 0 }
68625               );
68626           });
68627
68628           context.history().on('change.intro', function(changed) {
68629               wasChanged = true;
68630               timeout(function() {
68631                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
68632                       _washingtonSegmentID = changed.created()[0].id;
68633                       continueTo(didSplit);
68634                   } else {
68635                       _washingtonSegmentID = null;
68636                       continueTo(retrySplit);
68637                   }
68638               }, 300);  // after any transition (e.g. if user deleted intersection)
68639           });
68640
68641           function continueTo(nextStep) {
68642               context.map().on('move.intro drawn.intro', null);
68643               context.history().on('change.intro', null);
68644               nextStep();
68645           }
68646       }
68647
68648
68649       function retrySplit() {
68650           context.enter(modeBrowse(context));
68651           context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
68652           var advance = function() { continueTo(rightClickIntersection); };
68653
68654           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68655           var box = pad$1(eleventhAvenueEnd, padding, context);
68656           reveal(box, t('intro.lines.retry_split'),
68657               { buttonText: t('intro.ok'), buttonCallback: advance }
68658           );
68659
68660           context.map().on('move.intro drawn.intro', function() {
68661               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
68662               var box = pad$1(eleventhAvenueEnd, padding, context);
68663               reveal(box, t('intro.lines.retry_split'),
68664                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
68665               );
68666           });
68667
68668           function continueTo(nextStep) {
68669               context.map().on('move.intro drawn.intro', null);
68670               nextStep();
68671           }
68672       }
68673
68674
68675       function didSplit() {
68676           if (!_washingtonSegmentID ||
68677               !context.hasEntity(_washingtonSegmentID) ||
68678               !context.hasEntity(washingtonStreetID) ||
68679               !context.hasEntity(twelfthAvenueID) ||
68680               !context.hasEntity(eleventhAvenueEndID)) {
68681               return continueTo(rightClickIntersection);
68682           }
68683
68684           var ids = context.selectedIDs();
68685           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
68686           var street = t('intro.graph.name.washington-street');
68687
68688           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68689           var box = pad$1(twelfthAvenue, padding, context);
68690           box.width = box.width / 2;
68691           reveal(box, t(string, { street1: street, street2: street }),
68692               { duration: 500 }
68693           );
68694
68695           timeout(function() {
68696               context.map().centerZoomEase(twelfthAvenue, 18, 500);
68697
68698               context.map().on('move.intro drawn.intro', function() {
68699                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68700                   var box = pad$1(twelfthAvenue, padding, context);
68701                   box.width = box.width / 2;
68702                   reveal(box, t(string, { street1: street, street2: street }),
68703                       { duration: 0 }
68704                   );
68705               });
68706           }, 600);  // after initial reveal and curtain cut
68707
68708           context.on('enter.intro', function() {
68709               var ids = context.selectedIDs();
68710               if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
68711                   continueTo(multiSelect);
68712               }
68713           });
68714
68715           context.history().on('change.intro', function() {
68716               if (!_washingtonSegmentID ||
68717                   !context.hasEntity(_washingtonSegmentID) ||
68718                   !context.hasEntity(washingtonStreetID) ||
68719                   !context.hasEntity(twelfthAvenueID) ||
68720                   !context.hasEntity(eleventhAvenueEndID)) {
68721                   return continueTo(rightClickIntersection);
68722               }
68723           });
68724
68725           function continueTo(nextStep) {
68726               context.map().on('move.intro drawn.intro', null);
68727               context.on('enter.intro', null);
68728               context.history().on('change.intro', null);
68729               nextStep();
68730           }
68731       }
68732
68733
68734       function multiSelect() {
68735           if (!_washingtonSegmentID ||
68736               !context.hasEntity(_washingtonSegmentID) ||
68737               !context.hasEntity(washingtonStreetID) ||
68738               !context.hasEntity(twelfthAvenueID) ||
68739               !context.hasEntity(eleventhAvenueEndID)) {
68740               return continueTo(rightClickIntersection);
68741           }
68742
68743           var ids = context.selectedIDs();
68744           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
68745           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
68746
68747           if (hasWashington && hasTwelfth) {
68748               return continueTo(multiRightClick);
68749           } else if (!hasWashington && !hasTwelfth) {
68750               return continueTo(didSplit);
68751           }
68752
68753           context.map().centerZoomEase(twelfthAvenue, 18, 500);
68754
68755           timeout(function() {
68756               var selected, other, padding, box;
68757               if (hasWashington) {
68758                   selected = t('intro.graph.name.washington-street');
68759                   other = t('intro.graph.name.12th-avenue');
68760                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
68761                   box = pad$1(twelfthAvenueEnd, padding, context);
68762                   box.width *= 3;
68763               } else {
68764                   selected = t('intro.graph.name.12th-avenue');
68765                   other = t('intro.graph.name.washington-street');
68766                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
68767                   box = pad$1(twelfthAvenue, padding, context);
68768                   box.width /= 2;
68769               }
68770
68771               reveal(box,
68772                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
68773               );
68774
68775               context.map().on('move.intro drawn.intro', function() {
68776                   if (hasWashington) {
68777                       selected = t('intro.graph.name.washington-street');
68778                       other = t('intro.graph.name.12th-avenue');
68779                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
68780                       box = pad$1(twelfthAvenueEnd, padding, context);
68781                       box.width *= 3;
68782                   } else {
68783                       selected = t('intro.graph.name.12th-avenue');
68784                       other = t('intro.graph.name.washington-street');
68785                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
68786                       box = pad$1(twelfthAvenue, padding, context);
68787                       box.width /= 2;
68788                   }
68789
68790                   reveal(box,
68791                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
68792                       { duration: 0 }
68793                   );
68794               });
68795
68796               context.on('enter.intro', function() {
68797                   continueTo(multiSelect);
68798               });
68799
68800               context.history().on('change.intro', function() {
68801                   if (!_washingtonSegmentID ||
68802                       !context.hasEntity(_washingtonSegmentID) ||
68803                       !context.hasEntity(washingtonStreetID) ||
68804                       !context.hasEntity(twelfthAvenueID) ||
68805                       !context.hasEntity(eleventhAvenueEndID)) {
68806                       return continueTo(rightClickIntersection);
68807                   }
68808               });
68809           }, 600);
68810
68811           function continueTo(nextStep) {
68812               context.map().on('move.intro drawn.intro', null);
68813               context.on('enter.intro', null);
68814               context.history().on('change.intro', null);
68815               nextStep();
68816           }
68817       }
68818
68819
68820       function multiRightClick() {
68821           if (!_washingtonSegmentID ||
68822               !context.hasEntity(_washingtonSegmentID) ||
68823               !context.hasEntity(washingtonStreetID) ||
68824               !context.hasEntity(twelfthAvenueID) ||
68825               !context.hasEntity(eleventhAvenueEndID)) {
68826               return continueTo(rightClickIntersection);
68827           }
68828
68829           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68830           var box = pad$1(twelfthAvenue, padding, context);
68831           reveal(box, t('intro.lines.multi_rightclick'));
68832
68833           context.map().on('move.intro drawn.intro', function() {
68834               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68835               var box = pad$1(twelfthAvenue, padding, context);
68836               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
68837           });
68838
68839           select(window).on('click.intro contextmenu.intro', function() {
68840               timeout(function() {
68841                   var ids = context.selectedIDs();
68842                   if (ids.length === 2 &&
68843                       ids.indexOf(twelfthAvenueID) !== -1 &&
68844                       ids.indexOf(_washingtonSegmentID) !== -1) {
68845                           var node = selectMenuItem('delete').node();
68846                           if (!node) return;
68847                           continueTo(multiDelete);
68848                   } else if (ids.length === 1 &&
68849                       ids.indexOf(_washingtonSegmentID) !== -1) {
68850                       return continueTo(multiSelect);
68851                   } else {
68852                       return continueTo(didSplit);
68853                   }
68854               }, 300);  // after edit menu visible
68855           }, true);
68856
68857           context.history().on('change.intro', function() {
68858               if (!_washingtonSegmentID ||
68859                   !context.hasEntity(_washingtonSegmentID) ||
68860                   !context.hasEntity(washingtonStreetID) ||
68861                   !context.hasEntity(twelfthAvenueID) ||
68862                   !context.hasEntity(eleventhAvenueEndID)) {
68863                   return continueTo(rightClickIntersection);
68864               }
68865           });
68866
68867           function continueTo(nextStep) {
68868               context.map().on('move.intro drawn.intro', null);
68869               select(window).on('click.intro contextmenu.intro', null, true);
68870               context.history().on('change.intro', null);
68871               nextStep();
68872           }
68873       }
68874
68875
68876       function multiDelete() {
68877           if (!_washingtonSegmentID ||
68878               !context.hasEntity(_washingtonSegmentID) ||
68879               !context.hasEntity(washingtonStreetID) ||
68880               !context.hasEntity(twelfthAvenueID) ||
68881               !context.hasEntity(eleventhAvenueEndID)) {
68882               return continueTo(rightClickIntersection);
68883           }
68884
68885           var node = selectMenuItem('delete').node();
68886           if (!node) return continueTo(multiRightClick);
68887
68888           var menuCoords = context.map().mouseCoordinates();
68889           revealEditMenu(menuCoords,
68890               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
68891           );
68892
68893           context.map().on('move.intro drawn.intro', function() {
68894               revealEditMenu(menuCoords,
68895                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
68896                   { duration: 0 }
68897               );
68898           });
68899
68900           context.on('exit.intro', function() {
68901               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
68902                   return continueTo(multiSelect);  // left select mode but roads still exist
68903               }
68904           });
68905
68906           context.history().on('change.intro', function() {
68907               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
68908                   continueTo(retryDelete);         // changed something but roads still exist
68909               } else {
68910                   continueTo(play);
68911               }
68912           });
68913
68914           function continueTo(nextStep) {
68915               context.map().on('move.intro drawn.intro', null);
68916               context.on('exit.intro', null);
68917               context.history().on('change.intro', null);
68918               nextStep();
68919           }
68920       }
68921
68922
68923       function retryDelete() {
68924           context.enter(modeBrowse(context));
68925
68926           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
68927           var box = pad$1(twelfthAvenue, padding, context);
68928           reveal(box, t('intro.lines.retry_delete'), {
68929               buttonText: t('intro.ok'),
68930               buttonCallback: function() { continueTo(multiSelect); }
68931           });
68932
68933           function continueTo(nextStep) {
68934               nextStep();
68935           }
68936       }
68937
68938
68939       function play() {
68940           dispatch$1.call('done');
68941           reveal('#id-container',
68942               t('intro.lines.play', { next: t('intro.buildings.title') }), {
68943                   tooltipBox: '.intro-nav-wrap .chapter-building',
68944                   buttonText: t('intro.ok'),
68945                   buttonCallback: function() { reveal('#id-container'); }
68946               }
68947           );
68948      }
68949
68950
68951       chapter.enter = function() {
68952           addLine();
68953       };
68954
68955
68956       chapter.exit = function() {
68957           timeouts.forEach(window.clearTimeout);
68958           select(window).on('mousedown.intro', null, true);
68959           context.on('enter.intro exit.intro', null);
68960           context.map().on('move.intro drawn.intro', null);
68961           context.history().on('change.intro', null);
68962           select('.inspector-wrap').on('wheel.intro', null);
68963           select('.preset-list-button').on('click.intro', null);
68964       };
68965
68966
68967       chapter.restart = function() {
68968           chapter.exit();
68969           chapter.enter();
68970       };
68971
68972
68973       return utilRebind(chapter, dispatch$1, 'on');
68974   }
68975
68976   function uiIntroBuilding(context, reveal) {
68977       var dispatch$1 = dispatch('done');
68978       var house = [-85.62815, 41.95638];
68979       var tank = [-85.62732, 41.95347];
68980       var buildingCatetory = context.presets().item('category-building');
68981       var housePreset = context.presets().item('building/house');
68982       var tankPreset = context.presets().item('man_made/storage_tank');
68983       var timeouts = [];
68984       var _houseID = null;
68985       var _tankID = null;
68986
68987
68988       var chapter = {
68989           title: 'intro.buildings.title'
68990       };
68991
68992
68993       function timeout(f, t) {
68994           timeouts.push(window.setTimeout(f, t));
68995       }
68996
68997
68998       function eventCancel() {
68999           event.stopPropagation();
69000           event.preventDefault();
69001       }
69002
69003
69004       function revealHouse(center, text, options) {
69005           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
69006           var box = pad$1(center, padding, context);
69007           reveal(box, text, options);
69008       }
69009
69010
69011       function revealTank(center, text, options) {
69012           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
69013           var box = pad$1(center, padding, context);
69014           reveal(box, text, options);
69015       }
69016
69017
69018       function revealEditMenu(loc, text, options) {
69019           var rect = context.surfaceRect();
69020           var point = context.curtainProjection(loc);
69021           var pad = 40;
69022           var width = 250 + (2 * pad);
69023           var height = 350;
69024           var startX = rect.left + point[0];
69025           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
69026           var box = {
69027               left: left,
69028               top: point[1] + rect.top - 60,
69029               width: width,
69030               height: height
69031           };
69032           reveal(box, text, options);
69033       }
69034
69035
69036       function addHouse() {
69037           context.enter(modeBrowse(context));
69038           context.history().reset('initial');
69039           _houseID = null;
69040
69041           var msec = transitionTime(house, context.map().center());
69042           if (msec) { reveal(null, null, { duration: 0 }); }
69043           context.map().centerZoomEase(house, 19, msec);
69044
69045           timeout(function() {
69046               var tooltip = reveal('button.add-area',
69047                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
69048
69049               tooltip.selectAll('.tooltip-inner')
69050                   .insert('svg', 'span')
69051                   .attr('class', 'tooltip-illustration')
69052                   .append('use')
69053                   .attr('xlink:href', '#iD-graphic-buildings');
69054
69055               context.on('enter.intro', function(mode) {
69056                   if (mode.id !== 'add-area') return;
69057                   continueTo(startHouse);
69058               });
69059           }, msec + 100);
69060
69061           function continueTo(nextStep) {
69062               context.on('enter.intro', null);
69063               nextStep();
69064           }
69065       }
69066
69067
69068       function startHouse() {
69069           if (context.mode().id !== 'add-area') {
69070               return continueTo(addHouse);
69071           }
69072
69073           _houseID = null;
69074           context.map().zoomEase(20, 500);
69075
69076           timeout(function() {
69077               revealHouse(house, t('intro.buildings.start_building'));
69078
69079               context.map().on('move.intro drawn.intro', function() {
69080                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
69081               });
69082
69083               context.on('enter.intro', function(mode) {
69084                   if (mode.id !== 'draw-area') return chapter.restart();
69085                   continueTo(continueHouse);
69086               });
69087
69088           }, 550);  // after easing
69089
69090           function continueTo(nextStep) {
69091               context.map().on('move.intro drawn.intro', null);
69092               context.on('enter.intro', null);
69093               nextStep();
69094           }
69095       }
69096
69097
69098       function continueHouse() {
69099           if (context.mode().id !== 'draw-area') {
69100               return continueTo(addHouse);
69101           }
69102
69103           _houseID = null;
69104
69105           revealHouse(house, t('intro.buildings.continue_building'));
69106
69107           context.map().on('move.intro drawn.intro', function() {
69108               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
69109           });
69110
69111           context.on('enter.intro', function(mode) {
69112               if (mode.id === 'draw-area') {
69113                   return;
69114               } else if (mode.id === 'select') {
69115                   var graph = context.graph();
69116                   var way = context.entity(context.selectedIDs()[0]);
69117                   var nodes = graph.childNodes(way);
69118                   var points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
69119
69120                   if (isMostlySquare(points)) {
69121                       _houseID = way.id;
69122                       return continueTo(chooseCategoryBuilding);
69123                   } else {
69124                       return continueTo(retryHouse);
69125                   }
69126
69127               } else {
69128                   return chapter.restart();
69129               }
69130           });
69131
69132           function continueTo(nextStep) {
69133               context.map().on('move.intro drawn.intro', null);
69134               context.on('enter.intro', null);
69135               nextStep();
69136           }
69137       }
69138
69139
69140       function retryHouse() {
69141           var onClick = function() { continueTo(addHouse); };
69142
69143           revealHouse(house, t('intro.buildings.retry_building'),
69144               { buttonText: t('intro.ok'), buttonCallback: onClick }
69145           );
69146
69147           context.map().on('move.intro drawn.intro', function() {
69148               revealHouse(house, t('intro.buildings.retry_building'),
69149                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
69150               );
69151           });
69152
69153           function continueTo(nextStep) {
69154               context.map().on('move.intro drawn.intro', null);
69155               nextStep();
69156           }
69157       }
69158
69159
69160       function chooseCategoryBuilding() {
69161           if (!_houseID || !context.hasEntity(_houseID)) {
69162               return addHouse();
69163           }
69164           var ids = context.selectedIDs();
69165           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69166               context.enter(modeSelect(context, [_houseID]));
69167           }
69168
69169           // disallow scrolling
69170           select('.inspector-wrap').on('wheel.intro', eventCancel);
69171
69172           timeout(function() {
69173               // reset pane, in case user somehow happened to change it..
69174               select('.inspector-wrap .panewrap').style('right', '-100%');
69175
69176               var button = select('.preset-category-building .preset-list-button');
69177
69178               reveal(button.node(),
69179                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
69180               );
69181
69182               button.on('click.intro', function() {
69183                   button.on('click.intro', null);
69184                   continueTo(choosePresetHouse);
69185               });
69186
69187           }, 400);  // after preset list pane visible..
69188
69189
69190           context.on('enter.intro', function(mode) {
69191               if (!_houseID || !context.hasEntity(_houseID)) {
69192                   return continueTo(addHouse);
69193               }
69194               var ids = context.selectedIDs();
69195               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
69196                   return continueTo(chooseCategoryBuilding);
69197               }
69198           });
69199
69200           function continueTo(nextStep) {
69201               select('.inspector-wrap').on('wheel.intro', null);
69202               select('.preset-list-button').on('click.intro', null);
69203               context.on('enter.intro', null);
69204               nextStep();
69205           }
69206       }
69207
69208
69209       function choosePresetHouse() {
69210           if (!_houseID || !context.hasEntity(_houseID)) {
69211               return addHouse();
69212           }
69213           var ids = context.selectedIDs();
69214           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69215               context.enter(modeSelect(context, [_houseID]));
69216           }
69217
69218           // disallow scrolling
69219           select('.inspector-wrap').on('wheel.intro', eventCancel);
69220
69221           timeout(function() {
69222               // reset pane, in case user somehow happened to change it..
69223               select('.inspector-wrap .panewrap').style('right', '-100%');
69224
69225               var button = select('.preset-building-house .preset-list-button');
69226
69227               reveal(button.node(),
69228                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
69229                   { duration: 300 }
69230               );
69231
69232               button.on('click.intro', function() {
69233                   button.on('click.intro', null);
69234                   continueTo(closeEditorHouse);
69235               });
69236
69237           }, 400);  // after preset list pane visible..
69238
69239           context.on('enter.intro', function(mode) {
69240               if (!_houseID || !context.hasEntity(_houseID)) {
69241                   return continueTo(addHouse);
69242               }
69243               var ids = context.selectedIDs();
69244               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
69245                   return continueTo(chooseCategoryBuilding);
69246               }
69247           });
69248
69249           function continueTo(nextStep) {
69250               select('.inspector-wrap').on('wheel.intro', null);
69251               select('.preset-list-button').on('click.intro', null);
69252               context.on('enter.intro', null);
69253               nextStep();
69254           }
69255       }
69256
69257
69258       function closeEditorHouse() {
69259           if (!_houseID || !context.hasEntity(_houseID)) {
69260               return addHouse();
69261           }
69262           var ids = context.selectedIDs();
69263           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
69264               context.enter(modeSelect(context, [_houseID]));
69265           }
69266
69267           context.history().checkpoint('hasHouse');
69268
69269           context.on('exit.intro', function() {
69270               continueTo(rightClickHouse);
69271           });
69272
69273           timeout(function() {
69274               reveal('.entity-editor-pane',
69275                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
69276               );
69277           }, 500);
69278
69279           function continueTo(nextStep) {
69280               context.on('exit.intro', null);
69281               nextStep();
69282           }
69283       }
69284
69285
69286       function rightClickHouse() {
69287           if (!_houseID) return chapter.restart();
69288
69289           context.enter(modeBrowse(context));
69290           context.history().reset('hasHouse');
69291           var zoom = context.map().zoom();
69292           if (zoom < 20) {
69293               zoom = 20;
69294           }
69295           context.map().centerZoomEase(house, zoom, 500);
69296
69297           context.on('enter.intro', function(mode) {
69298               if (mode.id !== 'select') return;
69299               var ids = context.selectedIDs();
69300               if (ids.length !== 1 || ids[0] !== _houseID) return;
69301
69302               timeout(function() {
69303                   var node = selectMenuItem('orthogonalize').node();
69304                   if (!node) return;
69305                   continueTo(clickSquare);
69306               }, 300);  // after menu visible
69307           });
69308
69309           context.map().on('move.intro drawn.intro', function() {
69310               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
69311           });
69312
69313           context.history().on('change.intro', function() {
69314               continueTo(rightClickHouse);
69315           });
69316
69317           function continueTo(nextStep) {
69318               context.on('enter.intro', null);
69319               context.map().on('move.intro drawn.intro', null);
69320               context.history().on('change.intro', null);
69321               nextStep();
69322           }
69323       }
69324
69325
69326       function clickSquare() {
69327           if (!_houseID) return chapter.restart();
69328           var entity = context.hasEntity(_houseID);
69329           if (!entity) return continueTo(rightClickHouse);
69330
69331           var node = selectMenuItem('orthogonalize').node();
69332           if (!node) { return continueTo(rightClickHouse); }
69333
69334           var wasChanged = false;
69335           var menuCoords = context.map().mouseCoordinates();
69336
69337           revealEditMenu(menuCoords,
69338               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
69339           );
69340
69341           context.on('enter.intro', function(mode) {
69342               if (mode.id === 'browse') {
69343                   continueTo(rightClickHouse);
69344               } else if (mode.id === 'move' || mode.id === 'rotate') {
69345                   continueTo(retryClickSquare);
69346               }
69347           });
69348
69349           context.map().on('move.intro drawn.intro', function() {
69350               var node = selectMenuItem('orthogonalize').node();
69351               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
69352
69353               revealEditMenu(menuCoords,
69354                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
69355                   { duration: 0 }
69356               );
69357           });
69358
69359           context.history().on('change.intro', function() {
69360               wasChanged = true;
69361               context.history().on('change.intro', null);
69362
69363               // Something changed.  Wait for transition to complete and check undo annotation.
69364               timeout(function() {
69365                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
69366                       continueTo(doneSquare);
69367                   } else {
69368                       continueTo(retryClickSquare);
69369                   }
69370               }, 500);  // after transitioned actions
69371           });
69372
69373           function continueTo(nextStep) {
69374               context.on('enter.intro', null);
69375               context.map().on('move.intro drawn.intro', null);
69376               context.history().on('change.intro', null);
69377               nextStep();
69378           }
69379       }
69380
69381
69382       function retryClickSquare() {
69383           context.enter(modeBrowse(context));
69384
69385           revealHouse(house, t('intro.buildings.retry_square'), {
69386               buttonText: t('intro.ok'),
69387               buttonCallback: function() { continueTo(rightClickHouse); }
69388           });
69389
69390           function continueTo(nextStep) {
69391               nextStep();
69392           }
69393       }
69394
69395
69396       function doneSquare() {
69397           context.history().checkpoint('doneSquare');
69398
69399           revealHouse(house, t('intro.buildings.done_square'), {
69400               buttonText: t('intro.ok'),
69401               buttonCallback: function() { continueTo(addTank); }
69402           });
69403
69404           function continueTo(nextStep) {
69405               nextStep();
69406           }
69407       }
69408
69409
69410       function addTank() {
69411           context.enter(modeBrowse(context));
69412           context.history().reset('doneSquare');
69413           _tankID = null;
69414
69415           var msec = transitionTime(tank, context.map().center());
69416           if (msec) { reveal(null, null, { duration: 0 }); }
69417           context.map().centerZoomEase(tank, 19.5, msec);
69418
69419           timeout(function() {
69420               reveal('button.add-area',
69421                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
69422               );
69423
69424               context.on('enter.intro', function(mode) {
69425                   if (mode.id !== 'add-area') return;
69426                   continueTo(startTank);
69427               });
69428           }, msec + 100);
69429
69430           function continueTo(nextStep) {
69431               context.on('enter.intro', null);
69432               nextStep();
69433           }
69434       }
69435
69436
69437       function startTank() {
69438           if (context.mode().id !== 'add-area') {
69439               return continueTo(addTank);
69440           }
69441
69442           _tankID = null;
69443
69444           timeout(function() {
69445               revealTank(tank, t('intro.buildings.start_tank'));
69446
69447               context.map().on('move.intro drawn.intro', function() {
69448                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
69449               });
69450
69451               context.on('enter.intro', function(mode) {
69452                   if (mode.id !== 'draw-area') return chapter.restart();
69453                   continueTo(continueTank);
69454               });
69455
69456           }, 550);  // after easing
69457
69458           function continueTo(nextStep) {
69459               context.map().on('move.intro drawn.intro', null);
69460               context.on('enter.intro', null);
69461               nextStep();
69462           }
69463       }
69464
69465
69466       function continueTank() {
69467           if (context.mode().id !== 'draw-area') {
69468               return continueTo(addTank);
69469           }
69470
69471           _tankID = null;
69472
69473           revealTank(tank, t('intro.buildings.continue_tank'));
69474
69475           context.map().on('move.intro drawn.intro', function() {
69476               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
69477           });
69478
69479           context.on('enter.intro', function(mode) {
69480               if (mode.id === 'draw-area') {
69481                   return;
69482               } else if (mode.id === 'select') {
69483                   _tankID = context.selectedIDs()[0];
69484                   return continueTo(searchPresetTank);
69485               } else {
69486                   return continueTo(addTank);
69487               }
69488           });
69489
69490           function continueTo(nextStep) {
69491               context.map().on('move.intro drawn.intro', null);
69492               context.on('enter.intro', null);
69493               nextStep();
69494           }
69495       }
69496
69497
69498       function searchPresetTank() {
69499           if (!_tankID || !context.hasEntity(_tankID)) {
69500               return addTank();
69501           }
69502           var ids = context.selectedIDs();
69503           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
69504               context.enter(modeSelect(context, [_tankID]));
69505           }
69506
69507           // disallow scrolling
69508           select('.inspector-wrap').on('wheel.intro', eventCancel);
69509
69510           timeout(function() {
69511               // reset pane, in case user somehow happened to change it..
69512               select('.inspector-wrap .panewrap').style('right', '-100%');
69513
69514               select('.preset-search-input')
69515                   .on('keydown.intro', null)
69516                   .on('keyup.intro', checkPresetSearch);
69517
69518               reveal('.preset-search-input',
69519                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
69520               );
69521           }, 400);  // after preset list pane visible..
69522
69523           context.on('enter.intro', function(mode) {
69524               if (!_tankID || !context.hasEntity(_tankID)) {
69525                   return continueTo(addTank);
69526               }
69527
69528               var ids = context.selectedIDs();
69529               if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
69530                   // keep the user's area selected..
69531                   context.enter(modeSelect(context, [_tankID]));
69532
69533                   // reset pane, in case user somehow happened to change it..
69534                   select('.inspector-wrap .panewrap').style('right', '-100%');
69535                   // disallow scrolling
69536                   select('.inspector-wrap').on('wheel.intro', eventCancel);
69537
69538                   select('.preset-search-input')
69539                       .on('keydown.intro', null)
69540                       .on('keyup.intro', checkPresetSearch);
69541
69542                   reveal('.preset-search-input',
69543                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
69544                   );
69545
69546                   context.history().on('change.intro', null);
69547               }
69548           });
69549
69550           function checkPresetSearch() {
69551               var first = select('.preset-list-item:first-child');
69552
69553               if (first.classed('preset-man_made-storage_tank')) {
69554                   reveal(first.select('.preset-list-button').node(),
69555                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
69556                       { duration: 300 }
69557                   );
69558
69559                   select('.preset-search-input')
69560                       .on('keydown.intro', eventCancel, true)
69561                       .on('keyup.intro', null);
69562
69563                   context.history().on('change.intro', function() {
69564                       continueTo(closeEditorTank);
69565                   });
69566               }
69567           }
69568
69569           function continueTo(nextStep) {
69570               select('.inspector-wrap').on('wheel.intro', null);
69571               context.on('enter.intro', null);
69572               context.history().on('change.intro', null);
69573               select('.preset-search-input').on('keydown.intro keyup.intro', null);
69574               nextStep();
69575           }
69576       }
69577
69578
69579       function closeEditorTank() {
69580           if (!_tankID || !context.hasEntity(_tankID)) {
69581               return addTank();
69582           }
69583           var ids = context.selectedIDs();
69584           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
69585               context.enter(modeSelect(context, [_tankID]));
69586           }
69587
69588           context.history().checkpoint('hasTank');
69589
69590           context.on('exit.intro', function() {
69591               continueTo(rightClickTank);
69592           });
69593
69594           timeout(function() {
69595               reveal('.entity-editor-pane',
69596                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
69597               );
69598           }, 500);
69599
69600           function continueTo(nextStep) {
69601               context.on('exit.intro', null);
69602               nextStep();
69603           }
69604       }
69605
69606
69607       function rightClickTank() {
69608           if (!_tankID) return continueTo(addTank);
69609
69610           context.enter(modeBrowse(context));
69611           context.history().reset('hasTank');
69612           context.map().centerEase(tank, 500);
69613
69614           timeout(function() {
69615               context.on('enter.intro', function(mode) {
69616                   if (mode.id !== 'select') return;
69617                   var ids = context.selectedIDs();
69618                   if (ids.length !== 1 || ids[0] !== _tankID) return;
69619
69620                   timeout(function() {
69621                       var node = selectMenuItem('circularize').node();
69622                       if (!node) return;
69623                       continueTo(clickCircle);
69624                   }, 300);  // after menu visible
69625               });
69626
69627               revealTank(tank, t('intro.buildings.rightclick_tank'));
69628
69629               context.map().on('move.intro drawn.intro', function() {
69630                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
69631               });
69632
69633               context.history().on('change.intro', function() {
69634                   continueTo(rightClickTank);
69635               });
69636
69637           }, 600);
69638
69639           function continueTo(nextStep) {
69640               context.on('enter.intro', null);
69641               context.map().on('move.intro drawn.intro', null);
69642               context.history().on('change.intro', null);
69643               nextStep();
69644           }
69645       }
69646
69647
69648       function clickCircle() {
69649           if (!_tankID) return chapter.restart();
69650           var entity = context.hasEntity(_tankID);
69651           if (!entity) return continueTo(rightClickTank);
69652
69653           var node = selectMenuItem('circularize').node();
69654           if (!node) { return continueTo(rightClickTank); }
69655
69656           var wasChanged = false;
69657           var menuCoords = context.map().mouseCoordinates();
69658
69659           revealEditMenu(menuCoords,
69660               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
69661           );
69662
69663           context.on('enter.intro', function(mode) {
69664               if (mode.id === 'browse') {
69665                   continueTo(rightClickTank);
69666               } else if (mode.id === 'move' || mode.id === 'rotate') {
69667                   continueTo(retryClickCircle);
69668               }
69669           });
69670
69671           context.map().on('move.intro drawn.intro', function() {
69672               var node = selectMenuItem('circularize').node();
69673               if (!wasChanged && !node) { return continueTo(rightClickTank); }
69674
69675               revealEditMenu(menuCoords,
69676                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
69677                   { duration: 0 }
69678               );
69679           });
69680
69681           context.history().on('change.intro', function() {
69682               wasChanged = true;
69683               context.history().on('change.intro', null);
69684
69685               // Something changed.  Wait for transition to complete and check undo annotation.
69686               timeout(function() {
69687                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
69688                       continueTo(play);
69689                   } else {
69690                       continueTo(retryClickCircle);
69691                   }
69692               }, 500);  // after transitioned actions
69693           });
69694
69695           function continueTo(nextStep) {
69696               context.on('enter.intro', null);
69697               context.map().on('move.intro drawn.intro', null);
69698               context.history().on('change.intro', null);
69699               nextStep();
69700           }
69701       }
69702
69703
69704       function retryClickCircle() {
69705           context.enter(modeBrowse(context));
69706
69707           revealTank(tank, t('intro.buildings.retry_circle'), {
69708               buttonText: t('intro.ok'),
69709               buttonCallback: function() { continueTo(rightClickTank); }
69710           });
69711
69712           function continueTo(nextStep) {
69713               nextStep();
69714           }
69715       }
69716
69717
69718       function play() {
69719           dispatch$1.call('done');
69720           reveal('#id-container',
69721               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
69722                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
69723                   buttonText: t('intro.ok'),
69724                   buttonCallback: function() { reveal('#id-container'); }
69725               }
69726           );
69727       }
69728
69729
69730       chapter.enter = function() {
69731           addHouse();
69732       };
69733
69734
69735       chapter.exit = function() {
69736           timeouts.forEach(window.clearTimeout);
69737           context.on('enter.intro exit.intro', null);
69738           context.map().on('move.intro drawn.intro', null);
69739           context.history().on('change.intro', null);
69740           select('.inspector-wrap').on('wheel.intro', null);
69741           select('.preset-search-input').on('keydown.intro keyup.intro', null);
69742           select('.more-fields .combobox-input').on('click.intro', null);
69743       };
69744
69745
69746       chapter.restart = function() {
69747           chapter.exit();
69748           chapter.enter();
69749       };
69750
69751
69752       return utilRebind(chapter, dispatch$1, 'on');
69753   }
69754
69755   function uiModal(selection, blocking) {
69756       var keybinding = utilKeybinding('modal');
69757       var previous = selection.select('div.modal');
69758       var animate = previous.empty();
69759
69760       previous.transition()
69761           .duration(200)
69762           .style('opacity', 0)
69763           .remove();
69764
69765       var shaded = selection
69766           .append('div')
69767           .attr('class', 'shaded')
69768           .style('opacity', 0);
69769
69770       shaded.close = function() {
69771           shaded
69772               .transition()
69773               .duration(200)
69774               .style('opacity',0)
69775               .remove();
69776
69777           modal
69778               .transition()
69779               .duration(200)
69780               .style('top','0px');
69781
69782           select(document)
69783               .call(keybinding.unbind);
69784       };
69785
69786
69787       var modal = shaded
69788           .append('div')
69789           .attr('class', 'modal fillL col6');
69790
69791       if (!blocking) {
69792           shaded.on('click.remove-modal', function() {
69793               if (event.target === this) {
69794                   shaded.close();
69795               }
69796           });
69797
69798           modal.append('button')
69799               .attr('class', 'close')
69800               .on('click', shaded.close)
69801               .call(svgIcon('#iD-icon-close'));
69802
69803           keybinding
69804               .on('⌫', shaded.close)
69805               .on('⎋', shaded.close);
69806
69807           select(document)
69808               .call(keybinding);
69809       }
69810
69811       modal
69812           .append('div')
69813           .attr('class', 'content');
69814
69815       if (animate) {
69816           shaded.transition().style('opacity', 1);
69817       } else {
69818           shaded.style('opacity', 1);
69819       }
69820
69821
69822       return shaded;
69823   }
69824
69825   function uiIntroStartEditing(context, reveal) {
69826       var dispatch$1 = dispatch('done', 'startEditing');
69827       var modalSelection = select(null);
69828
69829
69830       var chapter = {
69831           title: 'intro.startediting.title'
69832       };
69833
69834       function showHelp() {
69835           reveal('.map-control.help-control',
69836               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
69837                   buttonText: t('intro.ok'),
69838                   buttonCallback: function() { shortcuts(); }
69839               }
69840           );
69841       }
69842
69843       function shortcuts() {
69844           reveal('.map-control.help-control',
69845               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
69846                   buttonText: t('intro.ok'),
69847                   buttonCallback: function() { showSave(); }
69848               }
69849           );
69850       }
69851
69852       function showSave() {
69853           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69854           reveal('#bar button.save',
69855               t('intro.startediting.save'), {
69856                   buttonText: t('intro.ok'),
69857                   buttonCallback: function() { showStart(); }
69858               }
69859           );
69860       }
69861
69862       function showStart() {
69863           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69864
69865           modalSelection = uiModal(context.container());
69866
69867           modalSelection.select('.modal')
69868               .attr('class', 'modal-splash modal col6');
69869
69870           modalSelection.selectAll('.close').remove();
69871
69872           var startbutton = modalSelection.select('.content')
69873               .attr('class', 'fillL')
69874               .append('button')
69875                   .attr('class', 'modal-section huge-modal-button')
69876                   .on('click', function() {
69877                       modalSelection.remove();
69878                   });
69879
69880               startbutton
69881                   .append('svg')
69882                   .attr('class', 'illustration')
69883                   .append('use')
69884                   .attr('xlink:href', '#iD-logo-walkthrough');
69885
69886               startbutton
69887                   .append('h2')
69888                   .text(t('intro.startediting.start'));
69889
69890           dispatch$1.call('startEditing');
69891       }
69892
69893
69894       chapter.enter = function() {
69895           showHelp();
69896       };
69897
69898
69899       chapter.exit = function() {
69900           modalSelection.remove();
69901           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
69902       };
69903
69904
69905       return utilRebind(chapter, dispatch$1, 'on');
69906   }
69907
69908   var chapterUi = {
69909       welcome: uiIntroWelcome,
69910       navigation: uiIntroNavigation,
69911       point: uiIntroPoint,
69912       area: uiIntroArea,
69913       line: uiIntroLine,
69914       building: uiIntroBuilding,
69915       startEditing: uiIntroStartEditing
69916   };
69917
69918   var chapterFlow = [
69919       'welcome',
69920       'navigation',
69921       'point',
69922       'area',
69923       'line',
69924       'building',
69925       'startEditing'
69926   ];
69927
69928
69929   function uiIntro(context) {
69930       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
69931       var introGraph = {};
69932       var _currChapter;
69933
69934       // create entities for intro graph and localize names
69935       for (var id in dataIntroGraph) {
69936           introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
69937       }
69938
69939
69940       function intro(selection) {
69941           context.enter(modeBrowse(context));
69942
69943           // Save current map state
69944           var osm = context.connection();
69945           var history = context.history().toJSON();
69946           var hash = window.location.hash;
69947           var center = context.map().center();
69948           var zoom = context.map().zoom();
69949           var background = context.background().baseLayerSource();
69950           var overlays = context.background().overlayLayerSources();
69951           var opacity = d3_selectAll('#map .layer-background').style('opacity');
69952           var caches = osm && osm.caches();
69953           var baseEntities = context.history().graph().base().entities;
69954           var countryCode = services.geocoder.countryCode;
69955
69956           // Show sidebar and disable the sidebar resizing button
69957           // (this needs to be before `context.inIntro(true)`)
69958           context.ui().sidebar.expand();
69959           d3_selectAll('button.sidebar-toggle').classed('disabled', true);
69960
69961           // Block saving
69962           context.inIntro(true);
69963
69964           // Load semi-real data used in intro
69965           if (osm) { osm.toggle(false).reset(); }
69966           context.history().reset();
69967           context.history().merge(values$1(coreGraph().load(introGraph).entities));
69968           context.history().checkpoint('initial');
69969
69970           // Setup imagery
69971           var imagery = context.background().findSource(INTRO_IMAGERY);
69972           if (imagery) {
69973               context.background().baseLayerSource(imagery);
69974           } else {
69975               context.background().bing();
69976           }
69977           overlays.forEach(function(d) {
69978               context.background().toggleOverlayLayer(d);
69979           });
69980
69981           // Setup data layers (only OSM)
69982           var layers = context.layers();
69983           layers.all().forEach(function(item) {
69984               // if the layer has the function `enabled`
69985               if (typeof item.layer.enabled === 'function') {
69986                   item.layer.enabled(item.id === 'osm');
69987               }
69988           });
69989
69990           // Mock geocoder
69991           services.geocoder.countryCode = function(location, callback) {
69992               callback(null, t('intro.graph.countrycode'));
69993           };
69994
69995
69996           d3_selectAll('#map .layer-background').style('opacity', 1);
69997
69998           var curtain = uiCurtain();
69999           selection.call(curtain);
70000
70001           // Store that the user started the walkthrough..
70002           context.storage('walkthrough_started', 'yes');
70003
70004           // Restore previous walkthrough progress..
70005           var storedProgress = context.storage('walkthrough_progress') || '';
70006           var progress = storedProgress.split(';').filter(Boolean);
70007
70008           var chapters = chapterFlow.map(function(chapter, i) {
70009               var s = chapterUi[chapter](context, curtain.reveal)
70010                   .on('done', function() {
70011                       context.presets().init();  // clear away "recent" presets
70012
70013                       buttons.filter(function(d) {
70014                           return d.title === s.title;
70015                       }).classed('finished', true);
70016
70017                       if (i < chapterFlow.length - 1) {
70018                           var next = chapterFlow[i + 1];
70019                           select('button.chapter-' + next)
70020                               .classed('next', true);
70021                       }
70022
70023                       // Store walkthrough progress..
70024                       progress.push(chapter);
70025                       context.storage('walkthrough_progress', uniq(progress).join(';'));
70026                   });
70027               return s;
70028           });
70029
70030           chapters[chapters.length - 1].on('startEditing', function() {
70031               // Store walkthrough progress..
70032               progress.push('startEditing');
70033               context.storage('walkthrough_progress', uniq(progress).join(';'));
70034
70035               // Store if walkthrough is completed..
70036               var incomplete = difference(chapterFlow, progress);
70037               if (!incomplete.length) {
70038                   context.storage('walkthrough_completed', 'yes');
70039               }
70040
70041               curtain.remove();
70042               navwrap.remove();
70043               d3_selectAll('#map .layer-background').style('opacity', opacity);
70044               d3_selectAll('button.sidebar-toggle').classed('disabled', false);
70045               if (osm) { osm.toggle(true).reset().caches(caches); }
70046               context.history().reset().merge(values$1(baseEntities));
70047               context.background().baseLayerSource(background);
70048               overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
70049               if (history) { context.history().fromJSON(history, false); }
70050               context.map().centerZoom(center, zoom);
70051               window.location.replace(hash);
70052               services.geocoder.countryCode = countryCode;
70053               context.inIntro(false);
70054           });
70055
70056           var navwrap = selection
70057               .append('div')
70058               .attr('class', 'intro-nav-wrap fillD');
70059
70060           navwrap
70061               .append('svg')
70062               .attr('class', 'intro-nav-wrap-logo')
70063               .append('use')
70064               .attr('xlink:href', '#iD-logo-walkthrough');
70065
70066           var buttonwrap = navwrap
70067               .append('div')
70068               .attr('class', 'joined')
70069               .selectAll('button.chapter');
70070
70071           var buttons = buttonwrap
70072               .data(chapters)
70073               .enter()
70074               .append('button')
70075               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
70076               .on('click', enterChapter);
70077
70078           buttons
70079               .append('span')
70080               .text(function(d) { return t(d.title); });
70081
70082           buttons
70083               .append('span')
70084               .attr('class', 'status')
70085               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
70086
70087           enterChapter(chapters[0]);
70088
70089
70090           function enterChapter(newChapter) {
70091               if (_currChapter) { _currChapter.exit(); }
70092               context.enter(modeBrowse(context));
70093
70094               _currChapter = newChapter;
70095               _currChapter.enter();
70096
70097               buttons
70098                   .classed('next', false)
70099                   .classed('active', function(d) {
70100                       return d.title === _currChapter.title;
70101                   });
70102           }
70103       }
70104
70105
70106       return intro;
70107   }
70108
70109   function uiTooltipHtml(text, key, heading) {
70110       var s = '';
70111
70112       if (heading) {
70113           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
70114       }
70115       if (text) {
70116           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
70117       }
70118       if (key) {
70119           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
70120               '<span class="keyhint">' + key + '</span></div>';
70121       }
70122
70123       return s;
70124   }
70125
70126   function uiIssues(context) {
70127       var key = t('issues.key');
70128       //var _featureApplicabilityList = d3_select(null);
70129       var _errorsList = select(null), _warningsList = select(null);
70130       var _rulesList = select(null);
70131       var _pane = select(null);
70132       var _toggleButton = select(null);
70133       var _shown = false;
70134
70135       context.validator().on('reload.issues_pane', update);
70136
70137       /*function renderIssuesOptions(selection) {
70138           var container = selection.selectAll('.issues-options-container')
70139               .data([0]);
70140
70141           container = container.enter()
70142               .append('div')
70143               .attr('class', 'issues-options-container')
70144               .merge(container);
70145
70146           _featureApplicabilityList = container.selectAll('.feature-applicability-list')
70147               .data([0]);
70148
70149           _featureApplicabilityList = _featureApplicabilityList.enter()
70150               .append('ul')
70151               .attr('class', 'layer-list feature-applicability-list')
70152               .merge(_featureApplicabilityList);
70153
70154           updateFeatureApplicabilityList();
70155       }*/
70156
70157       function addIconBadge(selection) {
70158           var d = 10;
70159           selection.selectAll('svg.icon-badge')
70160               .data([0])
70161               .enter()
70162               .append('svg')
70163               .attr('viewbox', '0 0 ' + d + ' ' + d)
70164               .attr('class', 'icon-badge')
70165               .append('circle')
70166               .attr('cx', d / 2)
70167               .attr('cy', d / 2)
70168               .attr('r', (d / 2) - 1)
70169               .attr('fill', 'currentColor');
70170       }
70171
70172       function renderErrorsList(selection) {
70173           _errorsList = selection.selectAll('.errors-list')
70174               .data([0]);
70175
70176           _errorsList = _errorsList.enter()
70177               .append('ul')
70178               .attr('class', 'layer-list errors-list issues-list')
70179               .merge(_errorsList);
70180
70181           updateErrorsList();
70182       }
70183
70184       function renderWarningsList(selection) {
70185           _warningsList = selection.selectAll('.warnings-list')
70186               .data([0]);
70187
70188           _warningsList = _warningsList.enter()
70189               .append('ul')
70190               .attr('class', 'layer-list warnings-list issues-list')
70191               .merge(_warningsList);
70192
70193           updateWarningsList();
70194       }
70195
70196
70197       function drawIssuesList(selection, issues) {
70198           var items = selection.selectAll('li')
70199               .data(issues, function(d) { return d.id(); });
70200
70201           // Exit
70202           items.exit()
70203               .remove();
70204
70205           // Enter
70206           var itemsEnter = items.enter()
70207               .append('li')
70208               .attr('class', function (d) { return 'issue severity-' + d.severity; })
70209               .on('click', function(d) {
70210                   var extent = d.extent(context.graph());
70211                   if (extent) {
70212                       var msec = 0;
70213                       var view = context.map().trimmedExtent();
70214                       var zoom = context.map().zoom();
70215
70216                       // make sure user can see the issue
70217                       if (!view.contains(extent) || zoom < 19) {
70218                           msec = 250;
70219                           context.map().centerZoomEase(extent.center(), Math.max(zoom, 19), msec);
70220                       }
70221
70222                       // select the first entity
70223                       if (d.entities && d.entities.length) {
70224                           window.setTimeout(function() {
70225                               var ids = d.entities.map(function(e) { return e.id; });
70226                               context.enter(modeSelect(context, [ids[0]]));
70227                               utilHighlightEntities(ids, true, context);
70228                           }, msec);
70229                       }
70230                   }
70231               })
70232               .on('mouseover', function(d) {
70233                   var ids = d.entities.map(function(e) { return e.id; });
70234                   utilHighlightEntities(ids, true, context);
70235               })
70236               .on('mouseout', function(d) {
70237                   var ids = d.entities.map(function(e) { return e.id; });
70238                   utilHighlightEntities(ids, false, context);
70239               });
70240
70241
70242           var messagesEnter = itemsEnter
70243               .append('button')
70244               .attr('class', 'message');
70245
70246           messagesEnter
70247               .call(tooltip()
70248                   .html(true)
70249                   .title(function(d) { return uiTooltipHtml(d.tooltip); })
70250                   .placement('top')
70251               );
70252
70253           messagesEnter
70254               .append('span')
70255               .attr('class', 'issue-icon')
70256               .call(svgIcon('', 'pre-text'));
70257
70258           messagesEnter
70259               .append('span')
70260               .attr('class', 'issue-text');
70261
70262
70263           // Update
70264           items = items
70265               .merge(itemsEnter);
70266
70267           items.select('.issue-icon svg use')     // propagate bound data
70268               .attr('href', function(d) {
70269                   return '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
70270               });
70271
70272           items.select('.issue-text')     // propagate bound data
70273               .text(function(d) { return d.message; });
70274       }
70275
70276
70277       function renderNoIssuesBox(selection) {
70278           selection
70279               .append('div')
70280               .call(svgIcon('#iD-icon-apply', 'pre-text'));
70281
70282           var noIssuesMessage = selection
70283               .append('span');
70284
70285           noIssuesMessage
70286               .append('strong')
70287               .text(t('issues.no_issues.message'));
70288
70289           noIssuesMessage
70290               .append('br');
70291
70292           noIssuesMessage
70293               .append('span')
70294               .text(t('issues.no_issues.info'));
70295       }
70296
70297       function renderRulesList(selection) {
70298           var container = selection.selectAll('.issue-rules-list')
70299               .data([0]);
70300
70301           _rulesList = container.enter()
70302               .append('ul')
70303               .attr('class', 'layer-list issue-rules-list')
70304               .merge(container);
70305
70306           updateRulesList();
70307       }
70308
70309       /*
70310       function showsFeatureApplicability(d) {
70311           return context.validator().getFeatureApplicability() === d;
70312       }
70313
70314       function setFeatureApplicability(d) {
70315           context.validator().setFeatureApplicability(d);
70316           update();
70317       }
70318
70319       function updateFeatureApplicabilityList() {
70320           _featureApplicabilityList
70321               .call(
70322                   drawListItems,
70323                   context.validator().featureApplicabilityOptions,
70324                   'radio',
70325                   'features_to_validate',
70326                   setFeatureApplicability,
70327                   showsFeatureApplicability
70328               );
70329       }*/
70330
70331       function updateErrorsList() {
70332           var errors = context.validator().getErrors();
70333           _errorsList
70334               .call(drawIssuesList, errors);
70335       }
70336
70337
70338       function updateWarningsList() {
70339           var warnings = context.validator().getWarnings();
70340           _warningsList
70341               .call(drawIssuesList, warnings);
70342       }
70343
70344       function updateRulesList() {
70345           var rules = context.validator().getRuleIDs();
70346           _rulesList
70347               .call(drawListItems, rules, 'checkbox', 'rule', toggleRule, ruleIsEnabled);
70348       }
70349
70350       function ruleIsEnabled(d) {
70351           return !context.validator().getDisabledRules()[d];
70352       }
70353
70354       function toggleRule(d) {
70355           context.validator().toggleRule(d);
70356       }
70357
70358
70359       function update() {
70360           var errors = context.validator().getErrors();
70361           var warnings = context.validator().getWarnings();
70362
70363           _toggleButton.selectAll('.icon-badge')
70364               .classed('error', (errors.length > 0))
70365               .classed('warning', (errors.length === 0 && warnings.length > 0))
70366               .classed('hide', (errors.length === 0 && warnings.length === 0));
70367
70368           _pane.select('.issues-errors')
70369               .classed('hide', errors.length === 0);
70370
70371           if (errors.length > 0) {
70372               _pane.select('.hide-toggle-issues_errors .hide-toggle-text')
70373                   .text(t('issues.errors.list_title', { count: errors.length }));
70374               if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
70375                   updateErrorsList();
70376               }
70377           }
70378
70379           _pane.select('.issues-warnings')
70380               .classed('hide', warnings.length === 0);
70381
70382           if (warnings.length > 0) {
70383               _pane.select('.hide-toggle-issues_warnings .hide-toggle-text')
70384                   .text(t('issues.warnings.list_title', { count: warnings.length }));
70385               if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
70386                   updateWarningsList();
70387               }
70388           }
70389
70390           _pane.select('.issues-none')
70391               .classed('hide', warnings.length > 0 || errors.length > 0);
70392
70393           //if (!_pane.select('.disclosure-wrap-issues_options').classed('hide')) {
70394           //    updateFeatureApplicabilityList();
70395           //}
70396
70397           if (!_pane.select('.disclosure-wrap-issues_rules').classed('hide')) {
70398               updateRulesList();
70399           }
70400       }
70401
70402       function drawListItems(selection, data, type, name, change, active) {
70403           var items = selection.selectAll('li')
70404               .data(data);
70405
70406           // Exit
70407           items.exit()
70408               .remove();
70409
70410           // Enter
70411           var enter = items.enter()
70412               .append('li')
70413               .call(tooltip()
70414                   .title(function(d) {
70415                       if (d === 'disconnected_way') {
70416                           d += '.highway';
70417                       } else if (d === 'almost_junction') {
70418                           d += '.highway-highway';
70419                       } else if (d === 'missing_role') {
70420                           d += '.multipolygon';
70421                       }
70422                       return t('issues.' + d + '.tip');
70423                   })
70424                   .placement('top')
70425               );
70426
70427           var label = enter
70428               .append('label');
70429
70430           label
70431               .append('input')
70432               .attr('type', type)
70433               .attr('name', name)
70434               .on('change', change);
70435
70436           label
70437               .append('span')
70438               .text(function(d) { return t('issues.' + d + '.title'); });
70439
70440           // Update
70441           items = items
70442               .merge(enter);
70443
70444           items
70445               .classed('active', active)
70446               .selectAll('input')
70447               .property('checked', active)
70448               .property('indeterminate', false);
70449       }
70450
70451       var paneTooltip = tooltip()
70452           .placement((textDirection === 'rtl') ? 'right' : 'left')
70453           .html(true)
70454           .title(uiTooltipHtml(t('issues.title'), key));
70455
70456       uiIssues.hidePane = function() {
70457           uiIssues.setVisible(false);
70458       };
70459
70460       uiIssues.togglePane = function() {
70461           if (event) event.preventDefault();
70462           paneTooltip.hide(_toggleButton);
70463           uiIssues.setVisible(!_toggleButton.classed('active'));
70464       };
70465
70466       uiIssues.setVisible = function(show) {
70467           if (show !== _shown) {
70468               _toggleButton.classed('active', show);
70469               _shown = show;
70470
70471               if (show) {
70472                   uiBackground.hidePane();
70473                   uiHelp.hidePane();
70474                   uiMapData.hidePane();
70475                   update();
70476
70477                   _pane
70478                       .style('display', 'block')
70479                       .style('right', '-300px')
70480                       .transition()
70481                       .duration(200)
70482                       .style('right', '0px');
70483
70484               } else {
70485                   _pane
70486                       .style('display', 'block')
70487                       .style('right', '0px')
70488                       .transition()
70489                       .duration(200)
70490                       .style('right', '-300px')
70491                       .on('end', function() {
70492                           select(this).style('display', 'none');
70493                       });
70494               }
70495           }
70496       };
70497
70498       uiIssues.renderToggleButton = function(selection) {
70499
70500           _toggleButton = selection
70501               .append('button')
70502               .attr('tabindex', -1)
70503               .on('click', uiIssues.togglePane)
70504               .call(svgIcon('#iD-icon-alert', 'light'))
70505               .call(addIconBadge)
70506               .call(paneTooltip);
70507
70508       };
70509
70510       uiIssues.renderPane = function(selection) {
70511
70512           _pane = selection
70513               .append('div')
70514               .attr('class', 'fillL map-pane issues-pane hide');
70515
70516           var heading = _pane
70517               .append('div')
70518               .attr('class', 'pane-heading');
70519
70520           heading
70521               .append('h2')
70522               .text(t('issues.title'));
70523
70524           heading
70525               .append('button')
70526               .on('click', uiIssues.hidePane)
70527               .call(svgIcon('#iD-icon-close'));
70528
70529           var content = _pane
70530               .append('div')
70531               .attr('class', 'pane-content');
70532
70533           content
70534               .append('div')
70535               .attr('class', 'issues-none')
70536               .call(renderNoIssuesBox);
70537
70538           // errors
70539           content
70540               .append('div')
70541               .attr('class', 'issues-errors')
70542               .call(uiDisclosure(context, 'issues_errors', true)
70543                   .content(renderErrorsList)
70544               );
70545
70546           // warnings
70547           content
70548               .append('div')
70549               .attr('class', 'issues-warnings')
70550               .call(uiDisclosure(context, 'issues_warnings', true)
70551                   .content(renderWarningsList)
70552               );
70553
70554           // rules
70555           content
70556               .append('div')
70557               .attr('class', 'issues-rules')
70558               .call(uiDisclosure(context, 'issues_rules', false)
70559                   .title(t('issues.rules.title'))
70560                   .content(renderRulesList)
70561               );
70562
70563           // options
70564           /*
70565           // add this back to core.yaml when re-enabling the options
70566           options:
70567             title: Options
70568           features_to_validate:
70569             edited:
70570               description: Edited features only
70571               tooltip: Flag issues with features you create and modify
70572             all:
70573               description: All features
70574               tooltip: Flag issues with all nearby features
70575
70576           content
70577               .append('div')
70578               .attr('class', 'issues-options')
70579               .call(uiDisclosure(context, 'issues_options', true)
70580                   .title(t('issues.options.title'))
70581                   .content(renderIssuesOptions)
70582               );
70583           */
70584           update();
70585
70586           context.keybinding()
70587               .on(key, uiIssues.togglePane);
70588       };
70589
70590       return uiIssues;
70591   }
70592
70593   function uiConfirm(selection) {
70594       var modalSelection = uiModal(selection);
70595
70596       modalSelection.select('.modal')
70597           .classed('modal-alert', true);
70598
70599       var section = modalSelection.select('.content');
70600
70601       section.append('div')
70602           .attr('class', 'modal-section header');
70603
70604       section.append('div')
70605           .attr('class', 'modal-section message-text');
70606
70607       var buttons = section.append('div')
70608           .attr('class', 'modal-section buttons cf');
70609
70610
70611       modalSelection.okButton = function() {
70612           buttons
70613               .append('button')
70614               .attr('class', 'button ok-button action')
70615               .on('click.confirm', function() {
70616                   modalSelection.remove();
70617               })
70618               .text(t('confirm.okay'))
70619               .node()
70620               .focus();
70621
70622           return modalSelection;
70623       };
70624
70625
70626       return modalSelection;
70627   }
70628
70629   function uiSettingsCustomData(context) {
70630       var dispatch$1 = dispatch('change');
70631
70632       function render(selection) {
70633           var dataLayer = context.layers().layer('data');
70634           var _origSettings = {
70635               fileList: (dataLayer && dataLayer.fileList()) || null,
70636               url: context.storage('settings-custom-data-url')
70637           };
70638           var _currSettings = cloneDeep(_origSettings);
70639
70640           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
70641           var modal = uiConfirm(selection).okButton();
70642
70643           modal
70644               .classed('settings-modal settings-custom-data', true);
70645
70646           modal.select('.modal-section.header')
70647               .append('h3')
70648               .text(t('settings.custom_data.header'));
70649
70650
70651           var textSection = modal.select('.modal-section.message-text');
70652
70653           textSection
70654               .append('pre')
70655               .attr('class', 'instructions-file')
70656               .text(t('settings.custom_data.file.instructions'));
70657
70658           textSection
70659               .append('input')
70660               .attr('class', 'field-file')
70661               .attr('type', 'file')
70662               .property('files', _currSettings.fileList)  // works for all except IE11
70663               .on('change', function() {
70664                   var files = event.target.files;
70665                   if (files && files.length) {
70666                       _currSettings.url = '';
70667                       textSection.select('.field-url').property('value', '');
70668                       _currSettings.fileList = files;
70669                   } else {
70670                       _currSettings.fileList = null;
70671                   }
70672               });
70673
70674           textSection
70675               .append('h4')
70676               .text(t('settings.custom_data.or'));
70677
70678           textSection
70679               .append('pre')
70680               .attr('class', 'instructions-url')
70681               .text(t('settings.custom_data.url.instructions'));
70682
70683           textSection
70684               .append('textarea')
70685               .attr('class', 'field-url')
70686               .attr('placeholder', t('settings.custom_data.url.placeholder'))
70687               .call(utilNoAuto)
70688               .property('value', _currSettings.url);
70689
70690
70691           // insert a cancel button
70692           var buttonSection = modal.select('.modal-section.buttons');
70693
70694           buttonSection
70695               .insert('button', '.ok-button')
70696               .attr('class', 'button cancel-button secondary-action')
70697               .text(t('confirm.cancel'));
70698
70699
70700           buttonSection.select('.cancel-button')
70701               .on('click.cancel', clickCancel);
70702
70703           buttonSection.select('.ok-button')
70704               .attr('disabled', isSaveDisabled)
70705               .on('click.save', clickSave);
70706
70707
70708           function isSaveDisabled() {
70709               return null;
70710           }
70711
70712
70713           // restore the original url
70714           function clickCancel() {
70715               textSection.select('.field-url').property('value', _origSettings.url);
70716               context.storage('settings-custom-data-url', _origSettings.url);
70717               this.blur();
70718               modal.close();
70719           }
70720
70721           // accept the current url
70722           function clickSave() {
70723               _currSettings.url = textSection.select('.field-url').property('value').trim();
70724
70725               // one or the other but not both
70726               if (_currSettings.url) { _currSettings.fileList = null; }
70727               if (_currSettings.fileList) { _currSettings.url = ''; }
70728
70729               context.storage('settings-custom-data-url', _currSettings.url);
70730               this.blur();
70731               modal.close();
70732               dispatch$1.call('change', this, _currSettings);
70733           }
70734       }
70735
70736       return utilRebind(render, dispatch$1, 'on');
70737   }
70738
70739   function uiMapData(context) {
70740       var key = t('map_data.key');
70741       var features = context.features().keys();
70742       var layers = context.layers();
70743       var fills = ['wireframe', 'partial', 'full'];
70744
70745       var settingsCustomData = uiSettingsCustomData(context)
70746           .on('change', customChanged);
70747
70748       var _pane = select(null), _toggleButton = select(null);
70749
70750       var _fillSelected = context.storage('area-fill') || 'partial';
70751       var _shown = false;
70752       var _dataLayerContainer = select(null);
70753       var _fillList = select(null);
70754       var _featureList = select(null);
70755       var _QAList = select(null);
70756
70757
70758       function showsFeature(d) {
70759           return context.features().enabled(d);
70760       }
70761
70762
70763       function autoHiddenFeature(d) {
70764           if (d.type === 'kr_error') return context.errors().autoHidden(d);
70765           return context.features().autoHidden(d);
70766       }
70767
70768
70769       function clickFeature(d) {
70770           context.features().toggle(d);
70771           update();
70772       }
70773
70774
70775       function showsQA(d) {
70776           var QAKeys = [d];
70777           var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
70778           var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
70779
70780           function layerSupported(d) {
70781               return d.layer && d.layer.supported();
70782           }
70783           function layerEnabled(d) {
70784               return layerSupported(d) && d.layer.enabled();
70785           }
70786
70787           return layerEnabled(data[0]);
70788       }
70789
70790
70791       function showsFill(d) {
70792           return _fillSelected === d;
70793       }
70794
70795
70796       function setFill(d) {
70797           fills.forEach(function(opt) {
70798               context.surface().classed('fill-' + opt, Boolean(opt === d));
70799           });
70800
70801           _fillSelected = d;
70802           context.storage('area-fill', d);
70803           if (d !== 'wireframe') {
70804               context.storage('area-fill-toggle', d);
70805           }
70806           update();
70807       }
70808
70809
70810       function showsLayer(which) {
70811           var layer = layers.layer(which);
70812           if (layer) {
70813               return layer.enabled();
70814           }
70815           return false;
70816       }
70817
70818
70819       function setLayer(which, enabled) {
70820           var layer = layers.layer(which);
70821           if (layer) {
70822               layer.enabled(enabled);
70823
70824               if (!enabled && (which === 'osm' || which === 'notes')) {
70825                   context.enter(modeBrowse(context));
70826               }
70827
70828               update();
70829           }
70830       }
70831
70832
70833       function toggleLayer(which) {
70834           setLayer(which, !showsLayer(which));
70835       }
70836
70837
70838       function drawPhotoItems(selection) {
70839           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
70840           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
70841           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
70842
70843           function layerSupported(d) {
70844               return d.layer && d.layer.supported();
70845           }
70846           function layerEnabled(d) {
70847               return layerSupported(d) && d.layer.enabled();
70848           }
70849
70850           var ul = selection
70851               .selectAll('.layer-list-photos')
70852               .data([0]);
70853
70854           ul = ul.enter()
70855               .append('ul')
70856               .attr('class', 'layer-list layer-list-photos')
70857               .merge(ul);
70858
70859           var li = ul.selectAll('.list-item-photos')
70860               .data(data);
70861
70862           li.exit()
70863               .remove();
70864
70865           var liEnter = li.enter()
70866               .append('li')
70867               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
70868
70869           var labelEnter = liEnter
70870               .append('label')
70871               .each(function(d) {
70872                   select(this)
70873                       .call(tooltip()
70874                           .title(t(d.id.replace('-', '_') + '.tooltip'))
70875                           .placement('top')
70876                       );
70877               });
70878
70879           labelEnter
70880               .append('input')
70881               .attr('type', 'checkbox')
70882               .on('change', function(d) { toggleLayer(d.id); });
70883
70884           labelEnter
70885               .append('span')
70886               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
70887
70888
70889           // Update
70890           li
70891               .merge(liEnter)
70892               .classed('active', layerEnabled)
70893               .selectAll('input')
70894               .property('checked', layerEnabled);
70895       }
70896
70897
70898       function drawOsmItems(selection) {
70899           var osmKeys = ['osm', 'notes'];
70900           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
70901
70902           var ul = selection
70903               .selectAll('.layer-list-osm')
70904               .data([0]);
70905
70906           ul = ul.enter()
70907               .append('ul')
70908               .attr('class', 'layer-list layer-list-osm')
70909               .merge(ul);
70910
70911           var li = ul.selectAll('.list-item')
70912               .data(osmLayers);
70913
70914           li.exit()
70915               .remove();
70916
70917           var liEnter = li.enter()
70918               .append('li')
70919               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
70920
70921           var labelEnter = liEnter
70922               .append('label')
70923               .each(function(d) {
70924                   select(this)
70925                       .call(tooltip()
70926                           .title(t('map_data.layers.' + d.id + '.tooltip'))
70927                           .placement('bottom')
70928                       );
70929               });
70930
70931           labelEnter
70932               .append('input')
70933               .attr('type', 'checkbox')
70934               .on('change', function(d) { toggleLayer(d.id); });
70935
70936           labelEnter
70937               .append('span')
70938               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
70939
70940
70941           // Update
70942           li
70943               .merge(liEnter)
70944               .classed('active', function (d) { return d.layer.enabled(); })
70945               .selectAll('input')
70946               .property('checked', function (d) { return d.layer.enabled(); });
70947       }
70948
70949
70950       function drawQAItems(selection) {
70951           var qaKeys = ['keepRight', 'improveOSM'];
70952           var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
70953
70954           var ul = selection
70955               .selectAll('.layer-list-qa')
70956               .data([0]);
70957
70958           ul = ul.enter()
70959               .append('ul')
70960               .attr('class', 'layer-list layer-list-qa')
70961               .merge(ul);
70962
70963           var li = ul.selectAll('.list-item')
70964               .data(qaLayers);
70965
70966           li.exit()
70967               .remove();
70968
70969           var liEnter = li.enter()
70970               .append('li')
70971               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
70972
70973           var labelEnter = liEnter
70974               .append('label')
70975               .each(function(d) {
70976                   select(this)
70977                       .call(tooltip()
70978                           .title(t('map_data.layers.' + d.id + '.tooltip'))
70979                           .placement('bottom')
70980                       );
70981               });
70982
70983           labelEnter
70984               .append('input')
70985               .attr('type', 'checkbox')
70986               .on('change', function(d) { toggleLayer(d.id); });
70987
70988           labelEnter
70989               .append('span')
70990               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
70991
70992
70993           // Update
70994           li
70995               .merge(liEnter)
70996               .classed('active', function (d) { return d.layer.enabled(); })
70997               .selectAll('input')
70998               .property('checked', function (d) { return d.layer.enabled(); });
70999       }
71000
71001
71002       // Beta feature - sample vector layers to support Detroit Mapping Challenge
71003       // https://github.com/osmus/detroit-mapping-challenge
71004       function drawVectorItems(selection) {
71005           var dataLayer = layers.layer('data');
71006           var vtData = [
71007               {
71008                   name: 'Detroit Neighborhoods/Parks',
71009                   src: 'neighborhoods-parks',
71010                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
71011                   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'
71012               }, {
71013                   name: 'Detroit Composite POIs',
71014                   src: 'composite-poi',
71015                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
71016                   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'
71017               }, {
71018                   name: 'Detroit All-The-Places POIs',
71019                   src: 'alltheplaces-poi',
71020                   tooltip: 'Public domain business location data created by web scrapers.',
71021                   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'
71022               }
71023           ];
71024
71025           // Only show this if the map is around Detroit..
71026           var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
71027           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
71028
71029           var container = selection.selectAll('.vectortile-container')
71030               .data(showVectorItems ? [0] : []);
71031
71032           container.exit()
71033               .remove();
71034
71035           var containerEnter = container.enter()
71036               .append('div')
71037               .attr('class', 'vectortile-container');
71038
71039           containerEnter
71040               .append('h4')
71041               .attr('class', 'vectortile-header')
71042               .text('Detroit Vector Tiles (Beta)');
71043
71044           containerEnter
71045               .append('ul')
71046               .attr('class', 'layer-list layer-list-vectortile');
71047
71048           containerEnter
71049               .append('div')
71050               .attr('class', 'vectortile-footer')
71051               .append('a')
71052               .attr('target', '_blank')
71053               .attr('tabindex', -1)
71054               .call(svgIcon('#iD-icon-out-link', 'inline'))
71055               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
71056               .append('span')
71057               .text('About these layers');
71058
71059           container = container
71060               .merge(containerEnter);
71061
71062
71063           var ul = container.selectAll('.layer-list-vectortile');
71064
71065           var li = ul.selectAll('.list-item')
71066               .data(vtData);
71067
71068           li.exit()
71069               .remove();
71070
71071           var liEnter = li.enter()
71072               .append('li')
71073               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
71074
71075           var labelEnter = liEnter
71076               .append('label')
71077               .each(function(d) {
71078                   select(this).call(
71079                       tooltip().title(d.tooltip).placement('top')
71080                   );
71081               });
71082
71083           labelEnter
71084               .append('input')
71085               .attr('type', 'radio')
71086               .attr('name', 'vectortile')
71087               .on('change', selectVTLayer);
71088
71089           labelEnter
71090               .append('span')
71091               .text(function(d) { return d.name; });
71092
71093           // Update
71094           li
71095               .merge(liEnter)
71096               .classed('active', isVTLayerSelected)
71097               .selectAll('input')
71098               .property('checked', isVTLayerSelected);
71099
71100
71101           function isVTLayerSelected(d) {
71102               return dataLayer && dataLayer.template() === d.template;
71103           }
71104
71105           function selectVTLayer(d) {
71106               context.storage('settings-custom-data-url', d.template);
71107               if (dataLayer) {
71108                   dataLayer.template(d.template, d.src);
71109                   dataLayer.enabled(true);
71110               }
71111           }
71112       }
71113
71114
71115       function drawCustomDataItems(selection) {
71116           var dataLayer = layers.layer('data');
71117           var hasData = dataLayer && dataLayer.hasData();
71118           var showsData = hasData && dataLayer.enabled();
71119
71120           var ul = selection
71121               .selectAll('.layer-list-data')
71122               .data(dataLayer ? [0] : []);
71123
71124           // Exit
71125           ul.exit()
71126               .remove();
71127
71128           // Enter
71129           var ulEnter = ul.enter()
71130               .append('ul')
71131               .attr('class', 'layer-list layer-list-data');
71132
71133           var liEnter = ulEnter
71134               .append('li')
71135               .attr('class', 'list-item-data');
71136
71137           liEnter
71138               .append('button')
71139               .call(tooltip()
71140                   .title(t('settings.custom_data.tooltip'))
71141                   .placement((textDirection === 'rtl') ? 'right' : 'left')
71142               )
71143               .on('click', editCustom)
71144               .call(svgIcon('#iD-icon-more'));
71145
71146           liEnter
71147               .append('button')
71148               .call(tooltip()
71149                   .title(t('map_data.layers.custom.zoom'))
71150                   .placement((textDirection === 'rtl') ? 'right' : 'left')
71151               )
71152               .on('click', function() {
71153                   event.preventDefault();
71154                   event.stopPropagation();
71155                   dataLayer.fitZoom();
71156               })
71157               .call(svgIcon('#iD-icon-search'));
71158
71159           var labelEnter = liEnter
71160               .append('label')
71161               .call(tooltip()
71162                   .title(t('map_data.layers.custom.tooltip'))
71163                   .placement('top')
71164               );
71165
71166           labelEnter
71167               .append('input')
71168               .attr('type', 'checkbox')
71169               .on('change', function() { toggleLayer('data'); });
71170
71171           labelEnter
71172               .append('span')
71173               .text(t('map_data.layers.custom.title'));
71174
71175           // Update
71176           ul = ul
71177               .merge(ulEnter);
71178
71179           ul.selectAll('.list-item-data')
71180               .classed('active', showsData)
71181               .selectAll('label')
71182               .classed('deemphasize', !hasData)
71183               .selectAll('input')
71184               .property('disabled', !hasData)
71185               .property('checked', showsData);
71186       }
71187
71188
71189       function editCustom() {
71190           event.preventDefault();
71191           context.container()
71192               .call(settingsCustomData);
71193       }
71194
71195
71196       function customChanged(d) {
71197           var dataLayer = layers.layer('data');
71198
71199           if (d && d.url) {
71200               dataLayer.url(d.url);
71201           } else if (d && d.fileList) {
71202               dataLayer.fileList(d.fileList);
71203           }
71204       }
71205
71206
71207       function drawListItems(selection, data, type, name, change, active) {
71208           var items = selection.selectAll('li')
71209               .data(data);
71210
71211           // Exit
71212           items.exit()
71213               .remove();
71214
71215           // Enter
71216           var enter = items.enter()
71217               .append('li')
71218               .call(tooltip()
71219                   .html(true)
71220                   .title(function(d) {
71221                       var tip = t(name + '.' + d + '.tooltip');
71222                       var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
71223                       if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
71224                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
71225                           tip += '<div>' + msg + '</div>';
71226                       }
71227                       return uiTooltipHtml(tip, key);
71228                   })
71229                   .placement('top')
71230               );
71231
71232           var label = enter
71233               .append('label');
71234
71235           label
71236               .append('input')
71237               .attr('type', type)
71238               .attr('name', name)
71239               .on('change', change);
71240
71241           label
71242               .append('span')
71243               .text(function(d) { return t(name + '.' + d + '.description'); });
71244
71245           // Update
71246           items = items
71247               .merge(enter);
71248
71249           items
71250               .classed('active', active)
71251               .selectAll('input')
71252               .property('checked', active)
71253               .property('indeterminate', function(d) {
71254                   return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
71255               });
71256       }
71257
71258
71259       function renderDataLayers(selection) {
71260           var container = selection.selectAll('.data-layer-container')
71261               .data([0]);
71262
71263           _dataLayerContainer = container.enter()
71264               .append('div')
71265               .attr('class', 'data-layer-container')
71266               .merge(container);
71267
71268           updateDataLayers();
71269       }
71270
71271
71272       function renderFillList(selection) {
71273           var container = selection.selectAll('.layer-fill-list')
71274               .data([0]);
71275
71276           _fillList = container.enter()
71277               .append('ul')
71278               .attr('class', 'layer-list layer-fill-list')
71279               .merge(container);
71280
71281           updateFillList();
71282       }
71283
71284
71285       function renderFeatureList(selection) {
71286           var container = selection.selectAll('.layer-feature-list')
71287               .data([0]);
71288
71289           _featureList = container.enter()
71290               .append('ul')
71291               .attr('class', 'layer-list layer-feature-list')
71292               .merge(container);
71293
71294           updateFeatureList();
71295       }
71296
71297       function updateDataLayers() {
71298           _dataLayerContainer
71299               .call(drawOsmItems)
71300               .call(drawQAItems)
71301               .call(drawPhotoItems)
71302               .call(drawCustomDataItems)
71303               .call(drawVectorItems);      // Beta - Detroit mapping challenge
71304       }
71305
71306       function updateFillList() {
71307           _fillList
71308               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
71309       }
71310
71311       function updateFeatureList() {
71312           _featureList
71313               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
71314       }
71315
71316       function update() {
71317
71318           if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
71319               updateDataLayers();
71320           }
71321           if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
71322               updateFillList();
71323           }
71324           if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
71325               updateFeatureList();
71326           }
71327
71328           _QAList
71329               .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
71330       }
71331
71332
71333       function toggleWireframe() {
71334           if (event) {
71335               event.preventDefault();
71336               event.stopPropagation();
71337           }
71338
71339           if (_fillSelected === 'wireframe') {
71340               _fillSelected = context.storage('area-fill-toggle') || 'partial';
71341           } else {
71342               _fillSelected = 'wireframe';
71343           }
71344
71345           setFill(_fillSelected);
71346           context.map().pan([0,0]);  // trigger a redraw
71347       }
71348
71349       var paneTooltip = tooltip()
71350           .placement((textDirection === 'rtl') ? 'right' : 'left')
71351           .html(true)
71352           .title(uiTooltipHtml(t('map_data.description'), key));
71353
71354       uiMapData.hidePane = function() {
71355           uiMapData.setVisible(false);
71356       };
71357
71358       uiMapData.togglePane = function() {
71359           if (event) event.preventDefault();
71360           paneTooltip.hide(_toggleButton);
71361           uiMapData.setVisible(!_toggleButton.classed('active'));
71362       };
71363
71364       uiMapData.setVisible = function(show) {
71365           if (show !== _shown) {
71366               _toggleButton.classed('active', show);
71367               _shown = show;
71368
71369               if (show) {
71370                   uiBackground.hidePane();
71371                   uiHelp.hidePane();
71372                   uiIssues.hidePane();
71373                   update();
71374
71375                   _pane
71376                       .style('display', 'block')
71377                       .style('right', '-300px')
71378                       .transition()
71379                       .duration(200)
71380                       .style('right', '0px');
71381
71382               } else {
71383                   _pane
71384                       .style('display', 'block')
71385                       .style('right', '0px')
71386                       .transition()
71387                       .duration(200)
71388                       .style('right', '-300px')
71389                       .on('end', function() {
71390                           select(this).style('display', 'none');
71391                       });
71392               }
71393           }
71394       };
71395
71396       uiMapData.renderToggleButton = function(selection) {
71397
71398           _toggleButton = selection
71399               .append('button')
71400               .attr('tabindex', -1)
71401               .on('click', uiMapData.togglePane)
71402               .call(svgIcon('#iD-icon-data', 'light'))
71403               .call(paneTooltip);
71404       };
71405
71406
71407       uiMapData.renderPane = function(selection) {
71408
71409           _pane = selection
71410               .append('div')
71411               .attr('class', 'fillL map-pane map-data-pane hide');
71412
71413           var heading = _pane
71414               .append('div')
71415               .attr('class', 'pane-heading');
71416
71417           heading
71418               .append('h2')
71419               .text(t('map_data.title'));
71420
71421           heading
71422               .append('button')
71423               .on('click', uiMapData.hidePane)
71424               .call(svgIcon('#iD-icon-close'));
71425
71426
71427           var content = _pane
71428               .append('div')
71429               .attr('class', 'pane-content');
71430
71431
71432           // data layers
71433           content
71434               .append('div')
71435               .attr('class', 'map-data-data-layers')
71436               .call(uiDisclosure(context, 'data_layers', true)
71437                   .title(t('map_data.data_layers'))
71438                   .content(renderDataLayers)
71439               );
71440
71441           // area fills
71442           content
71443               .append('div')
71444               .attr('class', 'map-data-area-fills')
71445               .call(uiDisclosure(context, 'fill_area', false)
71446                   .title(t('map_data.fill_area'))
71447                   .content(renderFillList)
71448               );
71449
71450           // feature filters
71451           content
71452               .append('div')
71453               .attr('class', 'map-data-feature-filters')
71454               .call(uiDisclosure(context, 'map_features', false)
71455                   .title(t('map_data.map_features'))
71456                   .content(renderFeatureList)
71457               );
71458
71459
71460           // add listeners
71461           context.features()
71462               .on('change.map_data-update', update);
71463
71464           update();
71465           setFill(_fillSelected);
71466
71467           context.keybinding()
71468               .on(key, uiMapData.togglePane)
71469               .on(t('area_fill.wireframe.key'), toggleWireframe);
71470       };
71471
71472       return uiMapData;
71473   }
71474
71475   function uiShortcuts(context) {
71476       var detected = utilDetect();
71477       var _activeTab = 0;
71478       var _modalSelection;
71479       var _selection = select(null);
71480
71481
71482       context.keybinding()
71483           .on([t('shortcuts.toggle.key'), '?'], function () {
71484               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
71485                   if (_modalSelection) {
71486                       _modalSelection.close();
71487                       _modalSelection = null;
71488                   }
71489               } else {
71490                   _modalSelection = uiModal(_selection);
71491                   shortcutsModal(_modalSelection);
71492               }
71493           });
71494
71495
71496       function shortcutsModal(_modalSelection) {
71497           _modalSelection.select('.modal')
71498               .classed('modal-shortcuts', true);
71499
71500           var shortcutsModal = _modalSelection.select('.content');
71501
71502           shortcutsModal
71503               .append('div')
71504               .attr('class', 'modal-section')
71505               .append('h3')
71506               .text(t('shortcuts.title'));
71507
71508           shortcutsModal
71509               .call(render);
71510       }
71511
71512
71513       function render(selection) {
71514           var wrapper = selection
71515               .selectAll('.wrapper')
71516               .data([0]);
71517
71518           var wrapperEnter = wrapper
71519               .enter()
71520               .append('div')
71521               .attr('class', 'wrapper modal-section');
71522
71523           var tabsBar = wrapperEnter
71524               .append('div')
71525               .attr('class', 'tabs-bar');
71526
71527           var shortcutsList = wrapperEnter
71528               .append('div')
71529               .attr('class', 'shortcuts-list');
71530
71531           wrapper = wrapper.merge(wrapperEnter);
71532
71533           var tabs = tabsBar
71534               .selectAll('.tab')
71535               .data(dataShortcuts);
71536
71537           var tabsEnter = tabs
71538               .enter()
71539               .append('div')
71540               .attr('class', 'tab')
71541               .on('click', function (d, i) {
71542                   _activeTab = i;
71543                   render(selection);
71544               });
71545
71546           tabsEnter
71547               .append('span')
71548               .text(function (d) { return t(d.text); });
71549
71550           tabs = tabs
71551               .merge(tabsEnter);
71552
71553           // Update
71554           wrapper.selectAll('.tab')
71555               .classed('active', function (d, i) {
71556                   return i === _activeTab;
71557               });
71558
71559
71560           var shortcuts = shortcutsList
71561               .selectAll('.shortcut-tab')
71562               .data(dataShortcuts);
71563
71564           var shortcutsEnter = shortcuts
71565               .enter()
71566               .append('div')
71567               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
71568
71569           var columnsEnter = shortcutsEnter
71570               .selectAll('.shortcut-column')
71571               .data(function (d) { return d.columns; })
71572               .enter()
71573               .append('table')
71574               .attr('class', 'shortcut-column');
71575
71576           var rowsEnter = columnsEnter
71577               .selectAll('.shortcut-row')
71578               .data(function (d) { return d.rows; })
71579               .enter()
71580               .append('tr')
71581               .attr('class', 'shortcut-row');
71582
71583
71584           var sectionRows = rowsEnter
71585               .filter(function (d) { return !d.shortcuts; });
71586
71587           sectionRows
71588               .append('td');
71589
71590           sectionRows
71591               .append('td')
71592               .attr('class', 'shortcut-section')
71593               .append('h3')
71594               .text(function (d) { return t(d.text); });
71595
71596
71597           var shortcutRows = rowsEnter
71598               .filter(function (d) { return d.shortcuts; });
71599
71600           var shortcutKeys = shortcutRows
71601               .append('td')
71602               .attr('class', 'shortcut-keys');
71603
71604           var modifierKeys = shortcutKeys
71605               .filter(function (d) { return d.modifiers; });
71606
71607           modifierKeys
71608               .selectAll('kbd.modifier')
71609               .data(function (d) {
71610                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
71611                       return ['⌘'];
71612                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
71613                       return [];
71614                   } else {
71615                       return d.modifiers;
71616                   }
71617               })
71618               .enter()
71619               .each(function () {
71620                   var selection = select(this);
71621
71622                   selection
71623                       .append('kbd')
71624                       .attr('class', 'modifier')
71625                       .text(function (d) { return uiCmd.display(d); });
71626
71627                   selection
71628                       .append('span')
71629                       .text('+');
71630               });
71631
71632
71633           shortcutKeys
71634               .selectAll('kbd.shortcut')
71635               .data(function (d) {
71636                   var arr = d.shortcuts;
71637                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
71638                       arr = ['Y'];
71639                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
71640                       arr = ['F11'];
71641                   }
71642
71643                   // replace translations
71644                   arr = arr.map(function(s) {
71645                       return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
71646                   });
71647
71648                   return uniq(arr).map(function(s) {
71649                       return {
71650                           shortcut: s,
71651                           separator: d.separator
71652                       };
71653                   });
71654               })
71655               .enter()
71656               .each(function (d, i, nodes) {
71657                   var selection = select(this);
71658                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
71659
71660                   if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
71661                       selection
71662                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
71663                   } else {
71664                       selection
71665                           .append('kbd')
71666                           .attr('class', 'shortcut')
71667                           .text(function (d) { return d.shortcut; });
71668                   }
71669
71670                   if (i < nodes.length - 1) {
71671                       selection
71672                           .append('span')
71673                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
71674                   }
71675               });
71676
71677
71678           shortcutKeys
71679               .filter(function(d) { return d.gesture; })
71680               .each(function () {
71681                   var selection = select(this);
71682
71683                   selection
71684                       .append('span')
71685                       .text('+');
71686
71687                   selection
71688                       .append('span')
71689                       .attr('class', 'gesture')
71690                       .text(function (d) { return t(d.gesture); });
71691               });
71692
71693
71694           shortcutRows
71695               .append('td')
71696               .attr('class', 'shortcut-desc')
71697               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
71698
71699
71700           shortcuts = shortcuts
71701               .merge(shortcutsEnter);
71702
71703           // Update
71704           wrapper.selectAll('.shortcut-tab')
71705               .style('display', function (d, i) {
71706                   return i === _activeTab ? 'flex' : 'none';
71707               });
71708       }
71709
71710
71711       return function(selection, show) {
71712           _selection = selection;
71713           if (show) {
71714               _modalSelection = uiModal(selection);
71715               shortcutsModal(_modalSelection);
71716           }
71717       };
71718   }
71719
71720   function uiHelp(context) {
71721       var key = t('help.key');
71722
71723       var _pane = select(null), _toggleButton = select(null);
71724
71725       var _shown = false;
71726
71727       var docKeys = [
71728           ['help', [
71729               'welcome',
71730               'open_data_h',
71731               'open_data',
71732               'before_start_h',
71733               'before_start',
71734               'open_source_h',
71735               'open_source',
71736               'open_source_help'
71737           ]],
71738           ['overview', [
71739               'navigation_h',
71740               'navigation_drag',
71741               'navigation_zoom',
71742               'features_h',
71743               'features',
71744               'nodes_ways'
71745           ]],
71746           ['editing', [
71747               'select_h',
71748               'select_left_click',
71749               'select_right_click',
71750               'multiselect_h',
71751               'multiselect_shift_click',
71752               'multiselect_lasso',
71753               'undo_redo_h',
71754               'undo_redo',
71755               'save_h',
71756               'save',
71757               'save_validation',
71758               'upload_h',
71759               'upload',
71760               'backups_h',
71761               'backups',
71762               'keyboard_h',
71763               'keyboard'
71764           ]],
71765           ['feature_editor', [
71766               'intro',
71767               'definitions',
71768               'type_h',
71769               'type',
71770               'type_picker',
71771               'fields_h',
71772               'fields_all_fields',
71773               'fields_example',
71774               'fields_add_field',
71775               'tags_h',
71776               'tags_all_tags',
71777               'tags_resources'
71778           ]],
71779           ['points', [
71780               'intro',
71781               'add_point_h',
71782               'add_point',
71783               'add_point_finish',
71784               'move_point_h',
71785               'move_point',
71786               'delete_point_h',
71787               'delete_point',
71788               'delete_point_command'
71789           ]],
71790           ['lines', [
71791               'intro',
71792               'add_line_h',
71793               'add_line',
71794               'add_line_draw',
71795               'add_line_finish',
71796               'modify_line_h',
71797               'modify_line_dragnode',
71798               'modify_line_addnode',
71799               'connect_line_h',
71800               'connect_line',
71801               'connect_line_display',
71802               'connect_line_drag',
71803               'connect_line_tag',
71804               'disconnect_line_h',
71805               'disconnect_line_command',
71806               'move_line_h',
71807               'move_line_command',
71808               'move_line_connected',
71809               'delete_line_h',
71810               'delete_line',
71811               'delete_line_command'
71812           ]],
71813           ['areas', [
71814               'intro',
71815               'point_or_area_h',
71816               'point_or_area',
71817               'add_area_h',
71818               'add_area_command',
71819               'add_area_draw',
71820               'add_area_finish',
71821               'square_area_h',
71822               'square_area_command',
71823               'modify_area_h',
71824               'modify_area_dragnode',
71825               'modify_area_addnode',
71826               'delete_area_h',
71827               'delete_area',
71828               'delete_area_command'
71829           ]],
71830           ['relations', [
71831               'intro',
71832               'edit_relation_h',
71833               'edit_relation',
71834               'edit_relation_add',
71835               'edit_relation_delete',
71836               'maintain_relation_h',
71837               'maintain_relation',
71838               'relation_types_h',
71839               'multipolygon_h',
71840               'multipolygon',
71841               'multipolygon_create',
71842               'multipolygon_merge',
71843               'turn_restriction_h',
71844               'turn_restriction',
71845               'turn_restriction_field',
71846               'turn_restriction_editing',
71847               'route_h',
71848               'route',
71849               'route_add',
71850               'boundary_h',
71851               'boundary',
71852               'boundary_add'
71853           ]],
71854           ['notes', [
71855               'intro',
71856               'add_note_h',
71857               'add_note',
71858               'move_note',
71859               'update_note_h',
71860               'update_note',
71861               'save_note_h',
71862               'save_note'
71863           ]],
71864
71865           ['imagery', [
71866               'intro',
71867               'sources_h',
71868               'choosing',
71869               'sources',
71870               'offsets_h',
71871               'offset',
71872               'offset_change'
71873           ]],
71874           ['streetlevel', [
71875               'intro',
71876               'using_h',
71877               'using',
71878               'photos',
71879               'viewer'
71880           ]],
71881           ['gps', [
71882               'intro',
71883               'survey',
71884               'using_h',
71885               'using',
71886               'tracing',
71887               'upload'
71888           ]],
71889           ['qa', [
71890               'intro',
71891               'tools_h',
71892               'tools',
71893               'issues_h',
71894               'issues'
71895           ]]
71896       ];
71897
71898       var headings = {
71899           'help.help.open_data_h': 3,
71900           'help.help.before_start_h': 3,
71901           'help.help.open_source_h': 3,
71902           'help.overview.navigation_h': 3,
71903           'help.overview.features_h': 3,
71904           'help.editing.select_h': 3,
71905           'help.editing.multiselect_h': 3,
71906           'help.editing.undo_redo_h': 3,
71907           'help.editing.save_h': 3,
71908           'help.editing.upload_h': 3,
71909           'help.editing.backups_h': 3,
71910           'help.editing.keyboard_h': 3,
71911           'help.feature_editor.type_h': 3,
71912           'help.feature_editor.fields_h': 3,
71913           'help.feature_editor.tags_h': 3,
71914           'help.points.add_point_h': 3,
71915           'help.points.move_point_h': 3,
71916           'help.points.delete_point_h': 3,
71917           'help.lines.add_line_h': 3,
71918           'help.lines.modify_line_h': 3,
71919           'help.lines.connect_line_h': 3,
71920           'help.lines.disconnect_line_h': 3,
71921           'help.lines.move_line_h': 3,
71922           'help.lines.delete_line_h': 3,
71923           'help.areas.point_or_area_h': 3,
71924           'help.areas.add_area_h': 3,
71925           'help.areas.square_area_h': 3,
71926           'help.areas.modify_area_h': 3,
71927           'help.areas.delete_area_h': 3,
71928           'help.relations.edit_relation_h': 3,
71929           'help.relations.maintain_relation_h': 3,
71930           'help.relations.relation_types_h': 2,
71931           'help.relations.multipolygon_h': 3,
71932           'help.relations.turn_restriction_h': 3,
71933           'help.relations.route_h': 3,
71934           'help.relations.boundary_h': 3,
71935           'help.notes.add_note_h': 3,
71936           'help.notes.update_note_h': 3,
71937           'help.notes.save_note_h': 3,
71938           'help.imagery.sources_h': 3,
71939           'help.imagery.offsets_h': 3,
71940           'help.streetlevel.using_h': 3,
71941           'help.gps.using_h': 3,
71942           'help.qa.tools_h': 3,
71943           'help.qa.issues_h': 3
71944       };
71945
71946       var replacements = {
71947           point: icon('#iD-icon-point', 'pre-text'),
71948           line: icon('#iD-icon-line', 'pre-text'),
71949           area: icon('#iD-icon-area', 'pre-text'),
71950           note: icon('#iD-icon-note', 'pre-text add-note'),
71951           plus: icon('#iD-icon-plus', 'pre-text'),
71952           minus: icon('#iD-icon-minus', 'pre-text'),
71953           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
71954           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
71955           layers: icon('#iD-icon-layers', 'pre-text'),
71956           data: icon('#iD-icon-data', 'pre-text'),
71957           inspect: icon('#iD-icon-inspect', 'pre-text'),
71958           move: icon('#iD-operation-move', 'pre-text'),
71959           merge: icon('#iD-operation-merge', 'pre-text'),
71960           delete: icon('#iD-operation-delete', 'pre-text'),
71961           close: icon('#iD-icon-close', 'pre-text'),
71962           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
71963           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
71964           save: icon('#iD-icon-save', 'pre-text'),
71965           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
71966           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
71967           shift: uiCmd.display('⇧'),
71968           alt: uiCmd.display('⌥'),
71969           return: uiCmd.display('↵'),
71970           version: context.version
71971       };
71972
71973       // For each section, squash all the texts into a single markdown document
71974       var docs = docKeys.map(function(key) {
71975           var helpkey = 'help.' + key[0];
71976           var text = key[1].reduce(function(all, part) {
71977               var subkey = helpkey + '.' + part;
71978               var depth = headings[subkey];                              // is this subkey a heading?
71979               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
71980               return all + hhh + t(subkey, replacements) + '\n\n';
71981           }, '');
71982
71983           return {
71984               title: t(helpkey + '.title'),
71985               html: marked(text.trim())
71986           };
71987       });
71988
71989       var paneTooltip = tooltip()
71990           .placement((textDirection === 'rtl') ? 'right' : 'left')
71991           .html(true)
71992           .title(uiTooltipHtml(t('help.title'), key));
71993
71994       uiHelp.hidePane = function() {
71995           uiHelp.setVisible(false);
71996       };
71997
71998       uiHelp.togglePane = function() {
71999           if (event) event.preventDefault();
72000           paneTooltip.hide(_toggleButton);
72001           uiHelp.setVisible(!_toggleButton.classed('active'));
72002       };
72003
72004       uiHelp.setVisible = function(show) {
72005           if (show !== _shown) {
72006               _toggleButton.classed('active', show);
72007               _shown = show;
72008
72009               if (show) {
72010                   uiBackground.hidePane();
72011                   uiIssues.hidePane();
72012                   uiMapData.hidePane();
72013
72014                   _pane.style('display', 'block')
72015                       .style('right', '-500px')
72016                       .transition()
72017                       .duration(200)
72018                       .style('right', '0px');
72019
72020               } else {
72021                   _pane.style('right', '0px')
72022                       .transition()
72023                       .duration(200)
72024                       .style('right', '-500px')
72025                       .on('end', function() {
72026                           select(this).style('display', 'none');
72027                       });
72028               }
72029           }
72030       };
72031
72032       uiHelp.renderToggleButton = function(selection) {
72033
72034           _toggleButton = selection.append('button')
72035               .attr('tabindex', -1)
72036               .on('click', uiHelp.togglePane)
72037               .call(svgIcon('#iD-icon-help', 'light'))
72038               .call(paneTooltip);
72039       };
72040
72041
72042       uiHelp.renderPane = function(selection) {
72043
72044           function clickHelp(d, i) {
72045               var rtl = (textDirection === 'rtl');
72046               content.property('scrollTop', 0);
72047               doctitle.html(d.title);
72048
72049               body.html(d.html);
72050               body.selectAll('a')
72051                   .attr('target', '_blank');
72052               menuItems.classed('selected', function(m) {
72053                   return m.title === d.title;
72054               });
72055
72056               nav.html('');
72057               if (rtl) {
72058                   nav.call(drawNext).call(drawPrevious);
72059               } else {
72060                   nav.call(drawPrevious).call(drawNext);
72061               }
72062
72063
72064               function drawNext(selection) {
72065                   if (i < docs.length - 1) {
72066                       var nextLink = selection
72067                           .append('a')
72068                           .attr('class', 'next')
72069                           .on('click', function() {
72070                               clickHelp(docs[i + 1], i + 1);
72071                           });
72072
72073                       nextLink
72074                           .append('span')
72075                           .text(docs[i + 1].title)
72076                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
72077                   }
72078               }
72079
72080
72081               function drawPrevious(selection) {
72082                   if (i > 0) {
72083                       var prevLink = selection
72084                           .append('a')
72085                           .attr('class', 'previous')
72086                           .on('click', function() {
72087                               clickHelp(docs[i - 1], i - 1);
72088                           });
72089
72090                       prevLink
72091                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
72092                           .append('span')
72093                           .text(docs[i - 1].title);
72094                   }
72095               }
72096           }
72097
72098
72099           function clickWalkthrough() {
72100               if (context.inIntro()) return;
72101               context.container().call(uiIntro(context));
72102               uiHelp.setVisible(false);
72103           }
72104
72105
72106           function clickShortcuts() {
72107               context.container().call(uiShortcuts(context), true);
72108           }
72109
72110
72111           _pane = selection.append('div')
72112               .attr('class', 'help-wrap map-pane fillL hide');
72113
72114           var heading = _pane
72115               .append('div')
72116               .attr('class', 'pane-heading');
72117
72118           var doctitle = heading
72119               .append('h2')
72120               .text(t('help.title'));
72121
72122           heading
72123               .append('button')
72124               .on('click', uiHelp.hidePane)
72125               .call(svgIcon('#iD-icon-close'));
72126
72127
72128           var content = _pane
72129               .append('div')
72130               .attr('class', 'pane-content');
72131
72132           var toc = content
72133               .append('ul')
72134               .attr('class', 'toc');
72135
72136           var menuItems = toc.selectAll('li')
72137               .data(docs)
72138               .enter()
72139               .append('li')
72140               .append('a')
72141               .html(function(d) { return d.title; })
72142               .on('click', clickHelp);
72143
72144           var shortcuts = toc
72145               .append('li')
72146               .attr('class', 'shortcuts')
72147               .call(tooltip()
72148                   .html(true)
72149                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
72150                   .placement('top')
72151               )
72152               .append('a')
72153               .on('click', clickShortcuts);
72154
72155           shortcuts
72156               .append('div')
72157               .text(t('shortcuts.title'));
72158
72159           var walkthrough = toc
72160               .append('li')
72161               .attr('class', 'walkthrough')
72162               .append('a')
72163               .on('click', clickWalkthrough);
72164
72165           walkthrough
72166               .append('svg')
72167               .attr('class', 'logo logo-walkthrough')
72168               .append('use')
72169               .attr('xlink:href', '#iD-logo-walkthrough');
72170
72171           walkthrough
72172               .append('div')
72173               .text(t('splash.walkthrough'));
72174
72175
72176           var helpContent = content
72177               .append('div')
72178               .attr('class', 'left-content');
72179
72180           var body = helpContent
72181               .append('div')
72182               .attr('class', 'body');
72183
72184           var nav = helpContent
72185               .append('div')
72186               .attr('class', 'nav');
72187
72188           clickHelp(docs[0], 0);
72189
72190           context.keybinding()
72191               .on(key, uiHelp.togglePane);
72192
72193       };
72194
72195       return uiHelp;
72196   }
72197
72198   function localeDateString(s) {
72199       if (!s) return null;
72200       var detected = utilDetect();
72201       var options = { day: 'numeric', month: 'short', year: 'numeric' };
72202       var d = new Date(s);
72203       if (isNaN(d.getTime())) return null;
72204       return d.toLocaleDateString(detected.locale, options);
72205   }
72206
72207   function vintageRange(vintage) {
72208       var s;
72209       if (vintage.start || vintage.end) {
72210           s = (vintage.start || '?');
72211           if (vintage.start !== vintage.end) {
72212               s += ' - ' + (vintage.end || '?');
72213           }
72214       }
72215       return s;
72216   }
72217
72218
72219   function rendererBackgroundSource(data) {
72220       var source = clone(data);
72221       var offset = [0, 0];
72222       var name = source.name;
72223       var description = source.description;
72224       var best = !!source.best;
72225       var template = source.template;
72226
72227       source.tileSize = data.tileSize || 256;
72228       source.zoomExtent = data.zoomExtent || [0, 22];
72229       source.overzoom = data.overzoom !== false;
72230
72231       source.offset = function(_) {
72232           if (!arguments.length) return offset;
72233           offset = _;
72234           return source;
72235       };
72236
72237
72238       source.nudge = function(_, zoomlevel) {
72239           offset[0] += _[0] / Math.pow(2, zoomlevel);
72240           offset[1] += _[1] / Math.pow(2, zoomlevel);
72241           return source;
72242       };
72243
72244
72245       source.name = function() {
72246           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
72247           return t('imagery.' + id_safe + '.name', { default: name });
72248       };
72249
72250
72251       source.description = function() {
72252           var id_safe = source.id.replace(/\./g, '<TX_DOT>');
72253           return t('imagery.' + id_safe + '.description', { default: description });
72254       };
72255
72256
72257       source.best = function() {
72258           return best;
72259       };
72260
72261
72262       source.area = function() {
72263           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
72264           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
72265           return isNaN(area) ? 0 : area;
72266       };
72267
72268
72269       source.imageryUsed = function() {
72270           return name || source.id;
72271       };
72272
72273
72274       source.template = function(_) {
72275           if (!arguments.length) return template;
72276           if (source.id === 'custom') template = _;
72277           return source;
72278       };
72279
72280
72281       source.url = function(coord) {
72282           if (this.type === 'wms') {
72283               var tileToProjectedCoords = (function(x, y, z) {
72284                   //polyfill for IE11, PhantomJS
72285                   var sinh = Math.sinh || function(x) {
72286                       var y = Math.exp(x);
72287                       return (y - 1 / y) / 2;
72288                   };
72289
72290                   var zoomSize = Math.pow(2, z);
72291                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
72292                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
72293
72294                   switch (this.projection) {
72295                       case 'EPSG:4326':
72296                           return {
72297                               x: lon * 180 / Math.PI,
72298                               y: lat * 180 / Math.PI
72299                           };
72300                       default: // EPSG:3857 and synonyms
72301                           var mercCoords = mercatorRaw(lon, lat);
72302                           return {
72303                               x: 20037508.34 / Math.PI * mercCoords[0],
72304                               y: 20037508.34 / Math.PI * mercCoords[1]
72305                           };
72306                   }
72307               }).bind(this);
72308
72309               var tileSize = this.tileSize;
72310               var projection = this.projection;
72311               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
72312               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
72313               return template.replace(/\{(\w+)\}/g, function (token, key) {
72314                 switch (key) {
72315                   case 'width':
72316                   case 'height':
72317                     return tileSize;
72318                   case 'proj':
72319                     return projection;
72320                   case 'wkid':
72321                     return projection.replace(/^EPSG:/, '');
72322                   case 'bbox':
72323                     return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
72324                   case 'w':
72325                     return minXmaxY.x;
72326                   case 's':
72327                     return maxXminY.y;
72328                   case 'n':
72329                     return maxXminY.x;
72330                   case 'e':
72331                     return minXmaxY.y;
72332                   default:
72333                     return token;
72334                 }
72335               });
72336           }
72337           return template
72338               .replace('{x}', coord[0])
72339               .replace('{y}', coord[1])
72340               // TMS-flipped y coordinate
72341               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
72342               .replace(/\{z(oom)?\}/, coord[2])
72343               .replace(/\{switch:([^}]+)\}/, function(s, r) {
72344                   var subdomains = r.split(',');
72345                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
72346               })
72347               .replace('{u}', function() {
72348                   var u = '';
72349                   for (var zoom = coord[2]; zoom > 0; zoom--) {
72350                       var b = 0;
72351                       var mask = 1 << (zoom - 1);
72352                       if ((coord[0] & mask) !== 0) b++;
72353                       if ((coord[1] & mask) !== 0) b += 2;
72354                       u += b.toString();
72355                   }
72356                   return u;
72357               });
72358       };
72359
72360
72361       source.validZoom = function(z) {
72362           return source.zoomExtent[0] <= z &&
72363               (source.overzoom || source.zoomExtent[1] > z);
72364       };
72365
72366
72367       source.isLocatorOverlay = function() {
72368           return source.id === 'mapbox_locator_overlay';
72369       };
72370
72371
72372       /* hides a source from the list, but leaves it available for use */
72373       source.isHidden = function() {
72374           return source.id === 'DigitalGlobe-Premium-vintage' ||
72375               source.id === 'DigitalGlobe-Standard-vintage';
72376       };
72377
72378
72379       source.copyrightNotices = function() {};
72380
72381
72382       source.getMetadata = function(center, tileCoord, callback) {
72383           var vintage = {
72384               start: localeDateString(source.startDate),
72385               end: localeDateString(source.endDate)
72386           };
72387           vintage.range = vintageRange(vintage);
72388
72389           var metadata = { vintage: vintage };
72390           callback(null, metadata);
72391       };
72392
72393
72394       return source;
72395   }
72396
72397
72398   rendererBackgroundSource.Bing = function(data, dispatch) {
72399       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
72400       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
72401
72402       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
72403
72404       var bing = rendererBackgroundSource(data);
72405       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
72406       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
72407               key;
72408       var cache = {};
72409       var inflight = {};
72410       var providers = [];
72411
72412       d3_json(url, function(err, json) {
72413           providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
72414               return {
72415                   attribution: provider.attribution,
72416                   areas: provider.coverageAreas.map(function(area) {
72417                       return {
72418                           zoom: [area.zoomMin, area.zoomMax],
72419                           extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
72420                       };
72421                   })
72422               };
72423           });
72424           dispatch.call('change');
72425       });
72426
72427
72428       bing.copyrightNotices = function(zoom, extent) {
72429           zoom = Math.min(zoom, 21);
72430           return providers.filter(function(provider) {
72431               return some(provider.areas, function(area) {
72432                   return extent.intersects(area.extent) &&
72433                       area.zoom[0] <= zoom &&
72434                       area.zoom[1] >= zoom;
72435               });
72436           }).map(function(provider) {
72437               return provider.attribution;
72438           }).join(', ');
72439       };
72440
72441
72442       bing.getMetadata = function(center, tileCoord, callback) {
72443           var tileId = tileCoord.slice(0, 3).join('/');
72444           var zoom = Math.min(tileCoord[2], 21);
72445           var centerPoint = center[1] + ',' + center[0];  // lat,lng
72446           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
72447                   '?zl=' + zoom + '&key=' + key;
72448
72449           if (inflight[tileId]) return;
72450
72451           if (!cache[tileId]) {
72452               cache[tileId] = {};
72453           }
72454           if (cache[tileId] && cache[tileId].metadata) {
72455               return callback(null, cache[tileId].metadata);
72456           }
72457
72458           inflight[tileId] = true;
72459           d3_json(url, function(error, result) {
72460               delete inflight[tileId];
72461
72462               var err;
72463               if (error) {
72464                   err = error;
72465               } else if (!result && 'Unknown Error') {
72466                   err = result.errorDetails;
72467               }
72468               if (err) {
72469                   return callback(err);
72470               } else {
72471                   var vintage = {
72472                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
72473                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
72474                   };
72475                   vintage.range = vintageRange(vintage);
72476
72477                   var metadata = { vintage: vintage };
72478                   cache[tileId].metadata = metadata;
72479                   return callback(null, metadata);
72480               }
72481           });
72482       };
72483
72484
72485       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
72486
72487
72488       return bing;
72489   };
72490
72491
72492
72493   rendererBackgroundSource.Esri = function(data) {
72494       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
72495       if (data.template.match(/blankTile/) === null) {
72496           data.template = data.template + '?blankTile=false';
72497       }
72498
72499       var esri = rendererBackgroundSource(data);
72500       var cache = {};
72501       var inflight = {};
72502       var _prevCenter;
72503
72504       // use a tilemap service to set maximum zoom for esri tiles dynamically
72505       // https://developers.arcgis.com/documentation/tiled-elevation-service/
72506       esri.fetchTilemap = function(center) {
72507           // skip if we have already fetched a tilemap within 5km
72508           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
72509           _prevCenter = center;
72510
72511           // tiles are available globally to zoom level 19, afterward they may or may not be present
72512           var z = 20;
72513
72514           // first generate a random url using the template
72515           var dummyUrl = esri.url([1,2,3]);
72516
72517           // calculate url z/y/x from the lat/long of the center of the map
72518           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
72519           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)));
72520
72521           // fetch an 8x8 grid to leverage cache
72522           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
72523
72524           // make the request and introspect the response from the tilemap server
72525           d3_json(tilemapUrl, function (err, tilemap) {
72526               if (err || !tilemap) return;
72527
72528               var hasTiles = true;
72529               for (var i = 0; i < tilemap.data.length; i++) {
72530                   // 0 means an individual tile in the grid doesn't exist
72531                   if (!tilemap.data[i]) {
72532                       hasTiles = false;
72533                       break;
72534                   }
72535               }
72536
72537               // if any tiles are missing at level 20 we restrict maxZoom to 19
72538               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
72539           });
72540       };
72541
72542       esri.getMetadata = function(center, tileCoord, callback) {
72543           var tileId = tileCoord.slice(0, 3).join('/');
72544           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
72545           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
72546           var unknown = t('info_panels.background.unknown');
72547           var metadataLayer;
72548           var vintage = {};
72549           var metadata = {};
72550
72551           if (inflight[tileId]) return;
72552
72553           switch (true) {
72554               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
72555                   metadataLayer = 4;
72556                   break;
72557               case zoom >= 19:
72558                   metadataLayer = 3;
72559                   break;
72560               case zoom >= 17:
72561                   metadataLayer = 2;
72562                   break;
72563               case zoom >= 13:
72564                   metadataLayer = 0;
72565                   break;
72566               default:
72567                   metadataLayer = 99;
72568           }
72569
72570           var url;
72571           // build up query using the layer appropriate to the current zoom
72572           if (esri.id === 'EsriWorldImagery') {
72573               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
72574           } else if (esri.id === 'EsriWorldImageryClarity') {
72575               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
72576           }
72577
72578           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
72579
72580           if (!cache[tileId]) {
72581               cache[tileId] = {};
72582           }
72583           if (cache[tileId] && cache[tileId].metadata) {
72584               return callback(null, cache[tileId].metadata);
72585           }
72586
72587           // accurate metadata is only available >= 13
72588           if (metadataLayer === 99) {
72589               vintage = {
72590                   start: null,
72591                   end: null,
72592                   range: null
72593               };
72594               metadata = {
72595                   vintage: null,
72596                   source: unknown,
72597                   description: unknown,
72598                   resolution: unknown,
72599                   accuracy: unknown
72600               };
72601
72602               callback(null, metadata);
72603
72604           } else {
72605               inflight[tileId] = true;
72606               d3_json(url, function(error, result) {
72607                   delete inflight[tileId];
72608
72609                   var err;
72610                   if (error) {
72611                       err = error;
72612                   } else if (!result) {
72613                       err = 'Unknown Error';
72614                   } else if (result.features && result.features.length < 1) {
72615                       err = 'No Results';
72616                   } else if (result.error && result.error.message) {
72617                       err = result.error.message;
72618                   }
72619
72620                   if (err) {
72621                       return callback(err);
72622                   } else {
72623                       // pass through the discrete capture date from metadata
72624                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
72625                       vintage = {
72626                           start: captureDate,
72627                           end: captureDate,
72628                           range: captureDate
72629                       };
72630                       metadata = {
72631                           vintage: vintage,
72632                           source: clean(result.features[0].attributes.NICE_NAME),
72633                           description: clean(result.features[0].attributes.NICE_DESC),
72634                           resolution: clean(result.features[0].attributes.SRC_RES),
72635                           accuracy: clean(result.features[0].attributes.SRC_ACC)
72636                       };
72637
72638                       // append units - meters
72639                       if (isFinite(metadata.resolution)) {
72640                           metadata.resolution += ' m';
72641                       }
72642                       if (isFinite(metadata.accuracy)) {
72643                           metadata.accuracy += ' m';
72644                       }
72645
72646                       cache[tileId].metadata = metadata;
72647                       return callback(null, metadata);
72648                   }
72649               });
72650           }
72651
72652
72653           function clean(val) {
72654               return String(val).trim() || unknown;
72655           }
72656       };
72657
72658       return esri;
72659   };
72660
72661
72662   rendererBackgroundSource.None = function() {
72663       var source = rendererBackgroundSource({ id: 'none', template: '' });
72664
72665
72666       source.name = function() {
72667           return t('background.none');
72668       };
72669
72670
72671       source.imageryUsed = function() {
72672           return null;
72673       };
72674
72675
72676       source.area = function() {
72677           return -1;  // sources in background pane are sorted by area
72678       };
72679
72680
72681       return source;
72682   };
72683
72684
72685   rendererBackgroundSource.Custom = function(template) {
72686       var source = rendererBackgroundSource({ id: 'custom', template: template });
72687
72688
72689       source.name = function() {
72690           return t('background.custom');
72691       };
72692
72693
72694       source.imageryUsed = function() {
72695           return 'Custom (' + source.template() + ')';
72696       };
72697
72698
72699       source.area = function() {
72700           return -2;  // sources in background pane are sorted by area
72701       };
72702
72703
72704       return source;
72705   };
72706
72707   function rendererTileLayer(context) {
72708       var transformProp = utilPrefixCSSProperty('Transform');
72709       var tiler = utilTiler();
72710
72711       var _tileSize = 256;
72712       var _projection;
72713       var _cache = {};
72714       var _tileOrigin;
72715       var _zoom;
72716       var _source;
72717
72718
72719       function tileSizeAtZoom(d, z) {
72720           var EPSILON = 0.002;    // close seams
72721           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
72722       }
72723
72724
72725       function atZoom(t, distance) {
72726           var power = Math.pow(2, distance);
72727           return [
72728               Math.floor(t[0] * power),
72729               Math.floor(t[1] * power),
72730               t[2] + distance
72731           ];
72732       }
72733
72734
72735       function lookUp(d) {
72736           for (var up = -1; up > -d[2]; up--) {
72737               var tile = atZoom(d, up);
72738               if (_cache[_source.url(tile)] !== false) {
72739                   return tile;
72740               }
72741           }
72742       }
72743
72744
72745       function uniqueBy(a, n) {
72746           var o = [];
72747           var seen = {};
72748           for (var i = 0; i < a.length; i++) {
72749               if (seen[a[i][n]] === undefined) {
72750                   o.push(a[i]);
72751                   seen[a[i][n]] = true;
72752               }
72753           }
72754           return o;
72755       }
72756
72757
72758       function addSource(d) {
72759           d.push(_source.url(d));
72760           return d;
72761       }
72762
72763
72764       // Update tiles based on current state of `projection`.
72765       function background(selection) {
72766           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
72767
72768           var pixelOffset;
72769           if (_source) {
72770               pixelOffset = [
72771                   _source.offset()[0] * Math.pow(2, _zoom),
72772                   _source.offset()[1] * Math.pow(2, _zoom)
72773               ];
72774           } else {
72775               pixelOffset = [0, 0];
72776           }
72777
72778           var translate = [
72779               _projection.translate()[0] + pixelOffset[0],
72780               _projection.translate()[1] + pixelOffset[1]
72781           ];
72782
72783           tiler
72784               .scale(_projection.scale() * 2 * Math.PI)
72785               .translate(translate);
72786
72787           _tileOrigin = [
72788               _projection.scale() * Math.PI - translate[0],
72789               _projection.scale() * Math.PI - translate[1]
72790           ];
72791
72792           render(selection);
72793       }
72794
72795
72796       // Derive the tiles onscreen, remove those offscreen and position them.
72797       // Important that this part not depend on `_projection` because it's
72798       // rentered when tiles load/error (see #644).
72799       function render(selection) {
72800           if (!_source) return;
72801           var requests = [];
72802           var showDebug = context.getDebug('tile') && !_source.overlay;
72803
72804           if (_source.validZoom(_zoom)) {
72805               tiler.skipNullIsland(!!_source.overlay);
72806
72807               tiler().forEach(function(d) {
72808                   addSource(d);
72809                   if (d[3] === '') return;
72810                   if (typeof d[3] !== 'string') return; // Workaround for #2295
72811                   requests.push(d);
72812                   if (_cache[d[3]] === false && lookUp(d)) {
72813                       requests.push(addSource(lookUp(d)));
72814                   }
72815               });
72816
72817               requests = uniqueBy(requests, 3).filter(function(r) {
72818                   // don't re-request tiles which have failed in the past
72819                   return _cache[r[3]] !== false;
72820               });
72821           }
72822
72823           function load(d) {
72824               _cache[d[3]] = true;
72825               select(this)
72826                   .on('error', null)
72827                   .on('load', null)
72828                   .classed('tile-loaded', true);
72829               render(selection);
72830           }
72831
72832           function error(d) {
72833               _cache[d[3]] = false;
72834               select(this)
72835                   .on('error', null)
72836                   .on('load', null)
72837                   .remove();
72838               render(selection);
72839           }
72840
72841           function imageTransform(d) {
72842               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
72843               var scale = tileSizeAtZoom(d, _zoom);
72844               return 'translate(' +
72845                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
72846                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
72847                   'scale(' + scale + ',' + scale + ')';
72848           }
72849
72850           function tileCenter(d) {
72851               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
72852               return [
72853                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
72854                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
72855               ];
72856           }
72857
72858           function debugTransform(d) {
72859               var coord = tileCenter(d);
72860               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
72861           }
72862
72863
72864           // Pick a representative tile near the center of the viewport
72865           // (This is useful for sampling the imagery vintage)
72866           var dims = tiler.size();
72867           var mapCenter = [dims[0] / 2, dims[1] / 2];
72868           var minDist = Math.max(dims[0], dims[1]);
72869           var nearCenter;
72870
72871           requests.forEach(function(d) {
72872               var c = tileCenter(d);
72873               var dist = geoVecLength(c, mapCenter);
72874               if (dist < minDist) {
72875                   minDist = dist;
72876                   nearCenter = d;
72877               }
72878           });
72879
72880
72881           var image = selection.selectAll('img')
72882               .data(requests, function(d) { return d[3]; });
72883
72884           image.exit()
72885               .style(transformProp, imageTransform)
72886               .classed('tile-removing', true)
72887               .classed('tile-center', false)
72888               .each(function() {
72889                   var tile = select(this);
72890                   window.setTimeout(function() {
72891                       if (tile.classed('tile-removing')) {
72892                           tile.remove();
72893                       }
72894                   }, 300);
72895               });
72896
72897           image.enter()
72898             .append('img')
72899               .attr('class', 'tile')
72900               .attr('src', function(d) { return d[3]; })
72901               .on('error', error)
72902               .on('load', load)
72903             .merge(image)
72904               .style(transformProp, imageTransform)
72905               .classed('tile-debug', showDebug)
72906               .classed('tile-removing', false)
72907               .classed('tile-center', function(d) { return d === nearCenter; });
72908
72909
72910
72911           var debug = selection.selectAll('.tile-label-debug')
72912               .data(showDebug ? requests : [], function(d) { return d[3]; });
72913
72914           debug.exit()
72915               .remove();
72916
72917           if (showDebug) {
72918               var debugEnter = debug.enter()
72919                   .append('div')
72920                   .attr('class', 'tile-label-debug');
72921
72922               debugEnter
72923                   .append('div')
72924                   .attr('class', 'tile-label-debug-coord');
72925
72926               debugEnter
72927                   .append('div')
72928                   .attr('class', 'tile-label-debug-vintage');
72929
72930               debug = debug.merge(debugEnter);
72931
72932               debug
72933                   .style(transformProp, debugTransform);
72934
72935               debug
72936                   .selectAll('.tile-label-debug-coord')
72937                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
72938
72939               debug
72940                   .selectAll('.tile-label-debug-vintage')
72941                   .each(function(d) {
72942                       var span = select(this);
72943                       var center = context.projection.invert(tileCenter(d));
72944                       _source.getMetadata(center, d, function(err, result) {
72945                           span.text((result && result.vintage && result.vintage.range) ||
72946                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
72947                           );
72948                       });
72949                   });
72950           }
72951
72952       }
72953
72954
72955       background.projection = function(_) {
72956           if (!arguments.length) return _projection;
72957           _projection = _;
72958           return background;
72959       };
72960
72961
72962       background.dimensions = function(_) {
72963           if (!arguments.length) return tiler.size();
72964           tiler.size(_);
72965           return background;
72966       };
72967
72968
72969       background.source = function(_) {
72970           if (!arguments.length) return _source;
72971           _source = _;
72972           _tileSize = _source.tileSize;
72973           _cache = {};
72974           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
72975           return background;
72976       };
72977
72978
72979       return background;
72980   }
72981
72982   function rendererBackground(context) {
72983       var dispatch$1 = dispatch('change');
72984       var detected = utilDetect();
72985       var baseLayer = rendererTileLayer(context).projection(context.projection);
72986       var _isValid = true;
72987       var _overlayLayers = [];
72988       var _backgroundSources = [];
72989       var _brightness = 1;
72990       var _contrast = 1;
72991       var _saturation = 1;
72992       var _sharpness = 1;
72993
72994
72995       function background(selection) {
72996           // If we are displaying an Esri basemap at high zoom,
72997           // check its tilemap to see how high the zoom can go
72998           if (context.map().zoom() > 18) {
72999               var basemap = baseLayer.source();
73000               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
73001                   var center = context.map().center();
73002                   basemap.fetchTilemap(center);
73003               }
73004           }
73005
73006           // Is the imagery valid here? - #4827
73007           var sources = background.sources(context.map().extent());
73008           var wasValid = _isValid;
73009           _isValid = !!sources
73010               .filter(function(d) { return d === baseLayer.source(); }).length;
73011
73012           if (wasValid !== _isValid) {      // change in valid status
73013               background.updateImagery();
73014           }
73015
73016
73017           var baseFilter = '';
73018           if (detected.cssfilters) {
73019               if (_brightness !== 1) {
73020                   baseFilter += 'brightness(' + _brightness + ')';
73021               }
73022               if (_contrast !== 1) {
73023                   baseFilter += 'contrast(' + _contrast + ')';
73024               }
73025               if (_saturation !== 1) {
73026                   baseFilter += 'saturate(' + _saturation + ')';
73027               }
73028               if (_sharpness < 1) {  // gaussian blur
73029                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
73030                   baseFilter += 'blur(' + blur + 'px)';
73031               }
73032           }
73033
73034           var base = selection.selectAll('.layer-background')
73035               .data([0]);
73036
73037           base = base.enter()
73038               .insert('div', '.layer-data')
73039               .attr('class', 'layer layer-background')
73040               .merge(base);
73041
73042           if (detected.cssfilters) {
73043               base.style('filter', baseFilter || null);
73044           } else {
73045               base.style('opacity', _brightness);
73046           }
73047
73048
73049           var imagery = base.selectAll('.layer-imagery')
73050               .data([0]);
73051
73052           imagery.enter()
73053               .append('div')
73054               .attr('class', 'layer layer-imagery')
73055               .merge(imagery)
73056               .call(baseLayer);
73057
73058
73059           var maskFilter = '';
73060           var mixBlendMode = '';
73061           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
73062               mixBlendMode = 'overlay';
73063               maskFilter = 'saturate(0) blur(3px) invert(1)';
73064
73065               var contrast = _sharpness - 1;
73066               maskFilter += ' contrast(' + contrast + ')';
73067
73068               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
73069               maskFilter += ' brightness(' + brightness + ')';
73070           }
73071
73072           var mask = base.selectAll('.layer-unsharp-mask')
73073               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
73074
73075           mask.exit()
73076               .remove();
73077
73078           mask.enter()
73079               .append('div')
73080               .attr('class', 'layer layer-mask layer-unsharp-mask')
73081               .merge(mask)
73082               .call(baseLayer)
73083               .style('filter', maskFilter || null)
73084               .style('mix-blend-mode', mixBlendMode || null);
73085
73086
73087           var overlays = selection.selectAll('.layer-overlay')
73088               .data(_overlayLayers, function(d) { return d.source().name(); });
73089
73090           overlays.exit()
73091               .remove();
73092
73093           overlays.enter()
73094               .insert('div', '.layer-data')
73095               .attr('class', 'layer layer-overlay')
73096               .merge(overlays)
73097               .each(function(layer) { select(this).call(layer); });
73098       }
73099
73100
73101       background.updateImagery = function() {
73102           var b = baseLayer.source();
73103           if (context.inIntro() || !b) return;
73104
73105           var o = _overlayLayers
73106               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
73107               .map(function (d) { return d.source().id; })
73108               .join(',');
73109
73110           var meters = geoOffsetToMeters(b.offset());
73111           var epsilon = 0.01;
73112           var x = +meters[0].toFixed(2);
73113           var y = +meters[1].toFixed(2);
73114           var q = utilStringQs(window.location.hash.substring(1));
73115
73116           var id = b.id;
73117           if (id === 'custom') {
73118               id = 'custom:' + b.template();
73119           }
73120
73121           if (id) {
73122               q.background = id;
73123           } else {
73124               delete q.background;
73125           }
73126
73127           if (o) {
73128               q.overlays = o;
73129           } else {
73130               delete q.overlays;
73131           }
73132
73133           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
73134               q.offset = x + ',' + y;
73135           } else {
73136               delete q.offset;
73137           }
73138
73139           if (!window.mocha) {
73140               window.location.replace('#' + utilQsString(q, true));
73141           }
73142
73143           var imageryUsed = [];
73144
73145           var current = b.imageryUsed();
73146           if (current && _isValid) {
73147               imageryUsed.push(current);
73148           }
73149
73150           _overlayLayers
73151               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
73152               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
73153
73154           var data = context.layers().layer('data');
73155           if (data && data.enabled() && data.hasData()) {
73156               imageryUsed.push(data.getSrc());
73157           }
73158
73159           var streetside = context.layers().layer('streetside');
73160           if (streetside && streetside.enabled()) {
73161               imageryUsed.push('Bing Streetside');
73162           }
73163
73164           var mapillary_images = context.layers().layer('mapillary-images');
73165           if (mapillary_images && mapillary_images.enabled()) {
73166               imageryUsed.push('Mapillary Images');
73167           }
73168
73169           var mapillary_signs = context.layers().layer('mapillary-signs');
73170           if (mapillary_signs && mapillary_signs.enabled()) {
73171               imageryUsed.push('Mapillary Signs');
73172           }
73173
73174           var openstreetcam_images = context.layers().layer('openstreetcam-images');
73175           if (openstreetcam_images && openstreetcam_images.enabled()) {
73176               imageryUsed.push('OpenStreetCam Images');
73177           }
73178
73179           context.history().imageryUsed(imageryUsed);
73180       };
73181
73182
73183       background.sources = function(extent) {
73184           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
73185
73186           var matchIDs = {};
73187           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
73188           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
73189
73190           return _backgroundSources.filter(function(source) {
73191               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
73192           });
73193       };
73194
73195
73196       background.dimensions = function(d) {
73197           if (!d) return;
73198           baseLayer.dimensions(d);
73199
73200           _overlayLayers.forEach(function(layer) {
73201               layer.dimensions(d);
73202           });
73203       };
73204
73205
73206       background.baseLayerSource = function(d) {
73207           if (!arguments.length) return baseLayer.source();
73208
73209           // test source against OSM imagery blacklists..
73210           var osm = context.connection();
73211           if (!osm) return background;
73212
73213           var blacklists = context.connection().imageryBlacklists();
73214           var template = d.template();
73215           var fail = false;
73216           var tested = 0;
73217           var regex;
73218
73219           for (var i = 0; i < blacklists.length; i++) {
73220               try {
73221                   regex = new RegExp(blacklists[i]);
73222                   fail = regex.test(template);
73223                   tested++;
73224                   if (fail) break;
73225               } catch (e) {
73226                   /* noop */
73227               }
73228           }
73229
73230           // ensure at least one test was run.
73231           if (!tested) {
73232               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
73233               fail = regex.test(template);
73234           }
73235
73236           baseLayer.source(!fail ? d : background.findSource('none'));
73237           dispatch$1.call('change');
73238           background.updateImagery();
73239           return background;
73240       };
73241
73242
73243       background.findSource = function(id) {
73244           return find$1(_backgroundSources, function(d) {
73245               return d.id && d.id === id;
73246           });
73247       };
73248
73249
73250       background.bing = function() {
73251           background.baseLayerSource(background.findSource('Bing'));
73252       };
73253
73254
73255       background.showsLayer = function(d) {
73256           return d.id === baseLayer.source().id ||
73257               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
73258       };
73259
73260
73261       background.overlayLayerSources = function() {
73262           return _overlayLayers.map(function (l) { return l.source(); });
73263       };
73264
73265
73266       background.toggleOverlayLayer = function(d) {
73267           var layer;
73268           for (var i = 0; i < _overlayLayers.length; i++) {
73269               layer = _overlayLayers[i];
73270               if (layer.source() === d) {
73271                   _overlayLayers.splice(i, 1);
73272                   dispatch$1.call('change');
73273                   background.updateImagery();
73274                   return;
73275               }
73276           }
73277
73278           layer = rendererTileLayer(context)
73279               .source(d)
73280               .projection(context.projection)
73281               .dimensions(baseLayer.dimensions()
73282           );
73283
73284           _overlayLayers.push(layer);
73285           dispatch$1.call('change');
73286           background.updateImagery();
73287       };
73288
73289
73290       background.nudge = function(d, zoom) {
73291           baseLayer.source().nudge(d, zoom);
73292           dispatch$1.call('change');
73293           background.updateImagery();
73294           return background;
73295       };
73296
73297
73298       background.offset = function(d) {
73299           if (!arguments.length) return baseLayer.source().offset();
73300           baseLayer.source().offset(d);
73301           dispatch$1.call('change');
73302           background.updateImagery();
73303           return background;
73304       };
73305
73306
73307       background.brightness = function(d) {
73308           if (!arguments.length) return _brightness;
73309           _brightness = d;
73310           if (context.mode()) dispatch$1.call('change');
73311           return background;
73312       };
73313
73314
73315       background.contrast = function(d) {
73316           if (!arguments.length) return _contrast;
73317           _contrast = d;
73318           if (context.mode()) dispatch$1.call('change');
73319           return background;
73320       };
73321
73322
73323       background.saturation = function(d) {
73324           if (!arguments.length) return _saturation;
73325           _saturation = d;
73326           if (context.mode()) dispatch$1.call('change');
73327           return background;
73328       };
73329
73330
73331       background.sharpness = function(d) {
73332           if (!arguments.length) return _sharpness;
73333           _sharpness = d;
73334           if (context.mode()) dispatch$1.call('change');
73335           return background;
73336       };
73337
73338
73339       background.init = function() {
73340           function parseMap(qmap) {
73341               if (!qmap) return false;
73342               var args = qmap.split('/').map(Number);
73343               if (args.length < 3 || args.some(isNaN)) return false;
73344               return geoExtent([args[2], args[1]]);
73345           }
73346
73347           var q = utilStringQs(window.location.hash.substring(1));
73348           var requested = q.background || q.layer;
73349           var extent = parseMap(q.map);
73350           var first;
73351           var best;
73352
73353
73354           data.imagery = data.imagery || [];
73355           data.imagery.features = {};
73356
73357           // build efficient index and querying for data.imagery
73358           var features = data.imagery.map(function(source) {
73359               if (!source.polygon) return null;
73360
73361               // Add an extra array nest to each element in `source.polygon`
73362               // so the rings are not treated as a bunch of holes:
73363               // what we have: [ [[outer],[hole],[hole]] ]
73364               // what we want: [ [[outer]],[[outer]],[[outer]] ]
73365               var rings = source.polygon.map(function(ring) { return [ring]; });
73366
73367               var feature = {
73368                   type: 'Feature',
73369                   properties: { id: source.id },
73370                   geometry: { type: 'MultiPolygon', coordinates: rings }
73371               };
73372
73373               data.imagery.features[source.id] = feature;
73374               return feature;
73375
73376           }).filter(Boolean);
73377
73378           data.imagery.query = whichPolygon_1({
73379               type: 'FeatureCollection',
73380               features: features
73381           });
73382
73383
73384           // Add all the available imagery sources
73385           _backgroundSources = data.imagery.map(function(source) {
73386               if (source.type === 'bing') {
73387                   return rendererBackgroundSource.Bing(source, dispatch$1);
73388               } else if (/^EsriWorldImagery/.test(source.id)) {
73389                   return rendererBackgroundSource.Esri(source);
73390               } else {
73391                   return rendererBackgroundSource(source);
73392               }
73393           });
73394
73395           first = _backgroundSources.length && _backgroundSources[0];
73396
73397           // Add 'None'
73398           _backgroundSources.unshift(rendererBackgroundSource.None());
73399
73400           // Add 'Custom'
73401           var template = context.storage('background-custom-template') || '';
73402           var custom = rendererBackgroundSource.Custom(template);
73403           _backgroundSources.unshift(custom);
73404
73405
73406           // Decide which background layer to display
73407           if (!requested && extent) {
73408               best = find$1(this.sources(extent), function(s) { return s.best(); });
73409           }
73410           if (requested && requested.indexOf('custom:') === 0) {
73411               template = requested.replace(/^custom:/, '');
73412               background.baseLayerSource(custom.template(template));
73413               context.storage('background-custom-template', template);
73414           } else {
73415               background.baseLayerSource(
73416                   background.findSource(requested) ||
73417                   best ||
73418                   background.findSource(context.storage('background-last-used')) ||
73419                   background.findSource('Bing') ||
73420                   first ||
73421                   background.findSource('none')
73422               );
73423           }
73424
73425           var locator = find$1(_backgroundSources, function(d) {
73426               return d.overlay && d.default;
73427           });
73428
73429           if (locator) {
73430               background.toggleOverlayLayer(locator);
73431           }
73432
73433           var overlays = (q.overlays || '').split(',');
73434           overlays.forEach(function(overlay) {
73435               overlay = background.findSource(overlay);
73436               if (overlay) {
73437                   background.toggleOverlayLayer(overlay);
73438               }
73439           });
73440
73441           if (q.gpx) {
73442               var gpx = context.layers().layer('data');
73443               if (gpx) {
73444                   gpx.url(q.gpx, '.gpx');
73445               }
73446           }
73447
73448           if (q.offset) {
73449               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
73450                   return !isNaN(n) && n;
73451               });
73452
73453               if (offset.length === 2) {
73454                   background.offset(geoMetersToOffset(offset));
73455               }
73456           }
73457       };
73458
73459
73460       return utilRebind(background, dispatch$1, 'on');
73461   }
73462
73463   function rendererFeatures(context) {
73464       var traffic_roads = {
73465           'motorway': true,
73466           'motorway_link': true,
73467           'trunk': true,
73468           'trunk_link': true,
73469           'primary': true,
73470           'primary_link': true,
73471           'secondary': true,
73472           'secondary_link': true,
73473           'tertiary': true,
73474           'tertiary_link': true,
73475           'residential': true,
73476           'unclassified': true,
73477           'living_street': true
73478       };
73479
73480       var service_roads = {
73481           'service': true,
73482           'road': true,
73483           'track': true
73484       };
73485
73486       var paths = {
73487           'path': true,
73488           'footway': true,
73489           'cycleway': true,
73490           'bridleway': true,
73491           'steps': true,
73492           'pedestrian': true,
73493           'corridor': true
73494       };
73495
73496       var past_futures = {
73497           'proposed': true,
73498           'construction': true,
73499           'abandoned': true,
73500           'dismantled': true,
73501           'disused': true,
73502           'razed': true,
73503           'demolished': true,
73504           'obliterated': true
73505       };
73506
73507       var dispatch$1 = dispatch('change', 'redraw');
73508       var _cullFactor = 1;
73509       var _cache = {};
73510       var _features = {};
73511       var _stats = {};
73512       var _keys = [];
73513       var _hidden = [];
73514       var _forceVisible = {};
73515
73516
73517       function update() {
73518           if (!window.mocha) {
73519               var q = utilStringQs(window.location.hash.substring(1));
73520               var disabled = features.disabled();
73521               if (disabled.length) {
73522                   q.disable_features = disabled.join(',');
73523               } else {
73524                   delete q.disable_features;
73525               }
73526               window.location.replace('#' + utilQsString(q, true));
73527               context.storage('disabled-features', disabled.join(','));
73528           }
73529           _hidden = features.hidden();
73530           dispatch$1.call('change');
73531           dispatch$1.call('redraw');
73532       }
73533
73534
73535       function defineFeature(k, filter, max) {
73536           var isEnabled = true;
73537
73538           _keys.push(k);
73539           _features[k] = {
73540               filter: filter,
73541               enabled: isEnabled,   // whether the user wants it enabled..
73542               count: 0,
73543               currentMax: (max || Infinity),
73544               defaultMax: (max || Infinity),
73545               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
73546               disable: function() { this.enabled = false; this.currentMax = 0; },
73547               hidden: function() {
73548                   return !context.editable() ||
73549                       (this.count === 0 && !this.enabled) ||
73550                       this.count > this.currentMax * _cullFactor;
73551               },
73552               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
73553           };
73554       }
73555
73556
73557       defineFeature('points', function isPoint(tags, geometry) {
73558           return geometry === 'point';
73559       }, 200);
73560
73561       defineFeature('traffic_roads', function isTrafficRoad(tags) {
73562           return traffic_roads[tags.highway];
73563       });
73564
73565       defineFeature('service_roads', function isServiceRoad(tags) {
73566           return service_roads[tags.highway];
73567       });
73568
73569       defineFeature('paths', function isPath(tags) {
73570           return paths[tags.highway];
73571       });
73572
73573       defineFeature('buildings', function isBuilding(tags) {
73574           return (
73575               !!tags['building:part'] ||
73576               (!!tags.building && tags.building !== 'no') ||
73577               tags.parking === 'multi-storey' ||
73578               tags.parking === 'sheds' ||
73579               tags.parking === 'carports' ||
73580               tags.parking === 'garage_boxes'
73581           );
73582       }, 250);
73583
73584       defineFeature('landuse', function isLanduse(tags, geometry) {
73585           return geometry === 'area' &&
73586               !_features.buildings.filter(tags) &&
73587               !_features.water.filter(tags);
73588       });
73589
73590       defineFeature('boundaries', function isBoundary(tags) {
73591           return (
73592               !!tags.boundary
73593           ) && !(
73594               traffic_roads[tags.highway] ||
73595               service_roads[tags.highway] ||
73596               paths[tags.highway]
73597           );
73598       });
73599
73600       defineFeature('water', function isWater(tags) {
73601           return (
73602               !!tags.waterway ||
73603               tags.natural === 'water' ||
73604               tags.natural === 'coastline' ||
73605               tags.natural === 'bay' ||
73606               tags.landuse === 'pond' ||
73607               tags.landuse === 'basin' ||
73608               tags.landuse === 'reservoir' ||
73609               tags.landuse === 'salt_pond'
73610           );
73611       });
73612
73613       defineFeature('rail', function isRail(tags) {
73614           return (
73615               !!tags.railway ||
73616               tags.landuse === 'railway'
73617           ) && !(
73618               traffic_roads[tags.highway] ||
73619               service_roads[tags.highway] ||
73620               paths[tags.highway]
73621           );
73622       });
73623
73624       defineFeature('power', function isPower(tags) {
73625           return !!tags.power;
73626       });
73627
73628       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
73629       defineFeature('past_future', function isPastFuture(tags) {
73630           if (
73631               traffic_roads[tags.highway] ||
73632               service_roads[tags.highway] ||
73633               paths[tags.highway]
73634           ) { return false; }
73635
73636           var strings = Object.keys(tags);
73637
73638           for (var i = 0; i < strings.length; i++) {
73639               var s = strings[i];
73640               if (past_futures[s] || past_futures[tags[s]]) { return true; }
73641           }
73642           return false;
73643       });
73644
73645       // Lines or areas that don't match another feature filter.
73646       // IMPORTANT: The 'others' feature must be the last one defined,
73647       //   so that code in getMatches can skip this test if `hasMatch = true`
73648       defineFeature('others', function isOther(tags, geometry) {
73649           return (geometry === 'line' || geometry === 'area');
73650       });
73651
73652
73653       function features() {}
73654
73655
73656       features.features = function() {
73657           return _features;
73658       };
73659
73660
73661       features.keys = function() {
73662           return _keys;
73663       };
73664
73665
73666       features.enabled = function(k) {
73667           if (!arguments.length) {
73668               return _keys.filter(function(k) { return _features[k].enabled; });
73669           }
73670           return _features[k] && _features[k].enabled;
73671       };
73672
73673
73674       features.disabled = function(k) {
73675           if (!arguments.length) {
73676               return _keys.filter(function(k) { return !_features[k].enabled; });
73677           }
73678           return _features[k] && !_features[k].enabled;
73679       };
73680
73681
73682       features.hidden = function(k) {
73683           if (!arguments.length) {
73684               return _keys.filter(function(k) { return _features[k].hidden(); });
73685           }
73686           return _features[k] && _features[k].hidden();
73687       };
73688
73689
73690       features.autoHidden = function(k) {
73691           if (!arguments.length) {
73692               return _keys.filter(function(k) { return _features[k].autoHidden(); });
73693           }
73694           return _features[k] && _features[k].autoHidden();
73695       };
73696
73697
73698       features.enable = function(k) {
73699           if (_features[k] && !_features[k].enabled) {
73700               _features[k].enable();
73701               update();
73702           }
73703       };
73704
73705
73706       features.disable = function(k) {
73707           if (_features[k] && _features[k].enabled) {
73708               _features[k].disable();
73709               update();
73710           }
73711       };
73712
73713
73714       features.toggle = function(k) {
73715           if (_features[k]) {
73716               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
73717               update();
73718           }
73719       };
73720
73721
73722       features.resetStats = function() {
73723           for (var i = 0; i < _keys.length; i++) {
73724               _features[_keys[i]].count = 0;
73725           }
73726           dispatch$1.call('change');
73727       };
73728
73729
73730       features.gatherStats = function(d, resolver, dimensions) {
73731           var needsRedraw = false;
73732           var type = groupBy(d, function(ent) { return ent.type; });
73733           var entities = [].concat(type.relation || [], type.way || [], type.node || []);
73734           var currHidden, geometry, matches, i, j;
73735
73736           for (i = 0; i < _keys.length; i++) {
73737               _features[_keys[i]].count = 0;
73738           }
73739
73740           // adjust the threshold for point/building culling based on viewport size..
73741           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
73742           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
73743
73744           for (i = 0; i < entities.length; i++) {
73745               geometry = entities[i].geometry(resolver);
73746               matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
73747               for (j = 0; j < matches.length; j++) {
73748                   _features[matches[j]].count++;
73749               }
73750           }
73751
73752           currHidden = features.hidden();
73753           if (currHidden !== _hidden) {
73754               _hidden = currHidden;
73755               needsRedraw = true;
73756               dispatch$1.call('change');
73757           }
73758
73759           return needsRedraw;
73760       };
73761
73762
73763       features.stats = function() {
73764           for (var i = 0; i < _keys.length; i++) {
73765               _stats[_keys[i]] = _features[_keys[i]].count;
73766           }
73767
73768           return _stats;
73769       };
73770
73771
73772       features.clear = function(d) {
73773           for (var i = 0; i < d.length; i++) {
73774               features.clearEntity(d[i]);
73775           }
73776       };
73777
73778
73779       features.clearEntity = function(entity) {
73780           delete _cache[osmEntity.key(entity)];
73781       };
73782
73783
73784       features.reset = function() {
73785           _cache = {};
73786       };
73787
73788       // only certain relations are worth checking
73789       function relationShouldBeChecked(relation) {
73790           // multipolygon features have `area` geometry and aren't checked here
73791           return relation.tags.type === 'boundary';
73792       }
73793
73794       features.getMatches = function(entity, resolver, geometry) {
73795           if (geometry === 'vertex' ||
73796               (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
73797
73798           var ent = osmEntity.key(entity);
73799           if (!_cache[ent]) {
73800               _cache[ent] = {};
73801           }
73802
73803           if (!_cache[ent].matches) {
73804               var matches = {};
73805               var hasMatch = false;
73806
73807               for (var i = 0; i < _keys.length; i++) {
73808                   if (_keys[i] === 'others') {
73809                       if (hasMatch) continue;
73810
73811                       // If an entity...
73812                       //   1. is a way that hasn't matched other 'interesting' feature rules,
73813                       if (entity.type === 'way') {
73814                           var parents = features.getParents(entity, resolver, geometry);
73815
73816                           //   2a. belongs only to a single multipolygon relation
73817                           if ((parents.length === 1 && parents[0].isMultipolygon()) ||
73818                               // 2b. or belongs only to boundary relations
73819                               (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
73820
73821                               // ...then match whatever feature rules the parent relation has matched.
73822                               // see #2548, #2887
73823                               //
73824                               // IMPORTANT:
73825                               // For this to work, getMatches must be called on relations before ways.
73826                               //
73827                               var pkey = osmEntity.key(parents[0]);
73828                               if (_cache[pkey] && _cache[pkey].matches) {
73829                                   matches = clone(_cache[pkey].matches);
73830                                   continue;
73831                               }
73832                           }
73833                       }
73834                   }
73835
73836                   if (_features[_keys[i]].filter(entity.tags, geometry)) {
73837                       matches[_keys[i]] = hasMatch = true;
73838                   }
73839               }
73840               _cache[ent].matches = matches;
73841           }
73842
73843           return _cache[ent].matches;
73844       };
73845
73846
73847       features.getParents = function(entity, resolver, geometry) {
73848           if (geometry === 'point') return [];
73849
73850           var ent = osmEntity.key(entity);
73851           if (!_cache[ent]) {
73852               _cache[ent] = {};
73853           }
73854
73855           if (!_cache[ent].parents) {
73856               var parents = [];
73857               if (geometry === 'vertex') {
73858                   parents = resolver.parentWays(entity);
73859               } else {   // 'line', 'area', 'relation'
73860                   parents = resolver.parentRelations(entity);
73861               }
73862               _cache[ent].parents = parents;
73863           }
73864           return _cache[ent].parents;
73865       };
73866
73867
73868       features.isHiddenPreset = function(preset, geometry) {
73869           if (!_hidden.length) return false;
73870           if (!preset.tags) return false;
73871           for (var key in _features) {
73872               if (_features[key].filter(preset.setTags({}, geometry), geometry)) {
73873                   if (_hidden.indexOf(key) !== -1) {
73874                       return key;
73875                   }
73876                   return false;
73877               }
73878           }
73879           return false;
73880       };
73881
73882
73883       features.isHiddenFeature = function(entity, resolver, geometry) {
73884           if (!_hidden.length) return false;
73885           if (!entity.version) return false;
73886
73887           var matches = features.getMatches(entity, resolver, geometry);
73888
73889           for (var i = 0; i < _hidden.length; i++) {
73890               if (matches[_hidden[i]]) return true;
73891           }
73892           return false;
73893       };
73894
73895
73896       features.isHiddenChild = function(entity, resolver, geometry) {
73897           if (!_hidden.length) return false;
73898           if (!entity.version || geometry === 'point') return false;
73899
73900           var parents = features.getParents(entity, resolver, geometry);
73901           if (!parents.length) return false;
73902
73903           for (var i = 0; i < parents.length; i++) {
73904               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
73905                   return false;
73906               }
73907           }
73908           return true;
73909       };
73910
73911
73912       features.hasHiddenConnections = function(entity, resolver) {
73913           if (!_hidden.length) return false;
73914           var childNodes, connections;
73915
73916           if (entity.type === 'midpoint') {
73917               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
73918               connections = [];
73919           } else {
73920               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
73921               connections = features.getParents(entity, resolver, entity.geometry(resolver));
73922           }
73923
73924           // gather ways connected to child nodes..
73925           connections = reduce(childNodes, function(result, e) {
73926               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
73927           }, connections);
73928
73929           return connections.length ? some(connections, function(e) {
73930               return features.isHidden(e, resolver, e.geometry(resolver));
73931           }) : false;
73932       };
73933
73934
73935       features.isHidden = function(entity, resolver, geometry) {
73936           if (!_hidden.length) return false;
73937           if (!entity.version) return false;
73938           if (_forceVisible[entity.id]) return false;
73939
73940           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
73941           return fn(entity, resolver, geometry);
73942       };
73943
73944
73945       features.filter = function(d, resolver) {
73946           if (!_hidden.length) return d;
73947
73948           var result = [];
73949           for (var i = 0; i < d.length; i++) {
73950               var entity = d[i];
73951               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
73952                   result.push(entity);
73953               }
73954           }
73955           return result;
73956       };
73957
73958
73959       features.forceVisible = function(entityIDs) {
73960           if (!arguments.length) return Object.keys(_forceVisible);
73961           _forceVisible = {};
73962           for (var i = 0; i < entityIDs.length; i++) {
73963               _forceVisible[entityIDs[i]] = true;
73964           }
73965           return features;
73966       };
73967
73968
73969       features.init = function() {
73970           var storage = context.storage('disabled-features');
73971           if (storage) {
73972               var storageDisabled = storage.replace(/;/g, ',').split(',');
73973               storageDisabled.forEach(features.disable);
73974           }
73975
73976           var q = utilStringQs(window.location.hash.substring(1));
73977           if (q.disable_features) {
73978               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
73979               hashDisabled.forEach(features.disable);
73980           }
73981       };
73982
73983       return utilRebind(features, dispatch$1, 'on');
73984   }
73985
73986   function utilBindOnce(target, type, listener, capture) {
73987       var typeOnce = type + '.once';
73988       function one() {
73989           target.on(typeOnce, null);
73990           listener.apply(this, arguments);
73991       }
73992       target.on(typeOnce, one, capture);
73993       return this;
73994   }
73995
73996   // constants
73997   var TILESIZE = 256;
73998   var kMin = geoZoomToScale(2, TILESIZE);
73999   var kMax = geoZoomToScale(24, TILESIZE);
74000
74001   function clamp(num, min, max) {
74002       return Math.max(min, Math.min(num, max));
74003   }
74004
74005
74006   function rendererMap(context) {
74007       var dispatch$1 = dispatch('move', 'drawn');
74008       var projection = context.projection;
74009       var curtainProjection = context.curtainProjection;
74010       var drawLayers = svgLayers(projection, context);
74011       var drawPoints = svgPoints(projection, context);
74012       var drawVertices = svgVertices(projection, context);
74013       var drawLines = svgLines(projection, context);
74014       var drawAreas = svgAreas(projection, context);
74015       var drawMidpoints = svgMidpoints(projection, context);
74016       var drawLabels = svgLabels(projection, context);
74017
74018       var _selection = select(null);
74019       var supersurface = select(null);
74020       var wrapper = select(null);
74021       var surface = select(null);
74022
74023       var _dimensions = [1, 1];
74024       var _dblClickEnabled = true;
74025       var _redrawEnabled = true;
74026       var _gestureTransformStart;
74027       var _transformStart = projection.transform();
74028       var _transformLast;
74029       var _isTransformed = false;
74030       var _minzoom = 0;
74031       var _getMouseCoords;
74032       var _mouseEvent;
74033
74034       var zoom = d3_zoom()
74035           .scaleExtent([kMin, kMax])
74036           .interpolate(interpolate)
74037           .filter(zoomEventFilter)
74038           .on('zoom', zoomPan);
74039
74040       var scheduleRedraw = throttle(redraw, 750);
74041       // var isRedrawScheduled = false;
74042       // var pendingRedrawCall;
74043       // function scheduleRedraw() {
74044       //     // Only schedule the redraw if one has not already been set.
74045       //     if (isRedrawScheduled) return;
74046       //     isRedrawScheduled = true;
74047       //     var that = this;
74048       //     var args = arguments;
74049       //     pendingRedrawCall = window.requestIdleCallback(function () {
74050       //         // Reset the boolean so future redraws can be set.
74051       //         isRedrawScheduled = false;
74052       //         redraw.apply(that, args);
74053       //     }, { timeout: 1400 });
74054       // }
74055
74056       function cancelPendingRedraw() {
74057           scheduleRedraw.cancel();
74058           // isRedrawScheduled = false;
74059           // window.cancelIdleCallback(pendingRedrawCall);
74060       }
74061
74062
74063       function map(selection) {
74064           _selection = selection;
74065
74066           context
74067               .on('change.map', immediateRedraw);
74068
74069           var osm = context.connection();
74070           if (osm) {
74071               osm.on('change.map', immediateRedraw);
74072           }
74073
74074           context.history()
74075               .on('change.map', immediateRedraw)
74076               .on('undone.map redone.map', function(stack) {
74077                   var mode = context.mode().id;
74078                   if (mode !== 'browse' && mode !== 'select') return;
74079
74080                   var followSelected = false;
74081                   if (Array.isArray(stack.selectedIDs)) {
74082                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
74083                       context.enter(
74084                           modeSelect(context, stack.selectedIDs).follow(followSelected)
74085                       );
74086                   }
74087                   if (!followSelected && stack.transform) {
74088                       map.transformEase(stack.transform);
74089                   }
74090               });
74091
74092           context.background()
74093               .on('change.map', immediateRedraw);
74094
74095           context.features()
74096               .on('redraw.map', immediateRedraw);
74097
74098           drawLayers
74099               .on('change.map', function() {
74100                   context.background().updateImagery();
74101                   immediateRedraw();
74102               });
74103
74104           selection
74105               .on('dblclick.map', dblClick)
74106               .call(zoom)
74107               .call(zoom.transform, projection.transform());
74108
74109           supersurface = selection.append('div')
74110               .attr('id', 'supersurface')
74111               .call(utilSetTransform, 0, 0);
74112
74113           // Need a wrapper div because Opera can't cope with an absolutely positioned
74114           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
74115           wrapper = supersurface
74116               .append('div')
74117               .attr('class', 'layer layer-data');
74118
74119           map.surface = surface = wrapper
74120               .call(drawLayers)
74121               .selectAll('.surface')
74122               .attr('id', 'surface');
74123
74124           surface
74125               .call(drawLabels.observe)
74126               .on('gesturestart.surface', function() {
74127                   _gestureTransformStart = projection.transform();
74128               })
74129               .on('gesturechange.surface', gestureChange)
74130               .on('mousedown.zoom', function() {
74131                   if (event.button === 2) {
74132                       event.stopPropagation();
74133                   }
74134               }, true)
74135               .on('mouseup.zoom', function() {
74136                   if (resetTransform()) {
74137                       immediateRedraw();
74138                   }
74139               })
74140               .on('mousemove.map', function() {
74141                   _mouseEvent = event;
74142               })
74143               .on('mouseover.vertices', function() {
74144                   if (map.editable() && !_isTransformed) {
74145                       var hover = event.target.__data__;
74146                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
74147                       dispatch$1.call('drawn', this, { full: false });
74148                   }
74149               })
74150               .on('mouseout.vertices', function() {
74151                   if (map.editable() && !_isTransformed) {
74152                       var hover = event.relatedTarget && event.relatedTarget.__data__;
74153                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
74154                       dispatch$1.call('drawn', this, { full: false });
74155                   }
74156               });
74157
74158           supersurface
74159               .call(context.background());
74160
74161           context.on('enter.map',  function() {
74162               if (map.editable() && !_isTransformed) {
74163                   // redraw immediately any objects affected by a change in selectedIDs.
74164                   var graph = context.graph();
74165                   var selectedAndParents = {};
74166                   context.selectedIDs().forEach(function(id) {
74167                       var entity = graph.hasEntity(id);
74168                       if (entity) {
74169                           selectedAndParents[entity.id] = entity;
74170                           if (entity.type === 'node') {
74171                               graph.parentWays(entity).forEach(function(parent) {
74172                                   selectedAndParents[parent.id] = parent;
74173                               });
74174                           }
74175                       }
74176                   });
74177                   var data = values$1(selectedAndParents);
74178                   var filter = function(d) { return d.id in selectedAndParents; };
74179
74180                   data = context.features().filter(data, graph);
74181
74182                   surface
74183                       .call(drawVertices.drawSelected, graph, map.extent())
74184                       .call(drawLines, graph, data, filter)
74185                       .call(drawAreas, graph, data, filter)
74186                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
74187
74188                   dispatch$1.call('drawn', this, { full: false });
74189
74190                   // redraw everything else later
74191                   scheduleRedraw();
74192               }
74193           });
74194
74195           map.dimensions(utilGetDimensions(selection));
74196       }
74197
74198
74199       function zoomEventFilter() {
74200           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
74201           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
74202           // This can happen if a previous `mousedown` occurred without a `mouseup`.
74203           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
74204           // so that d3-zoom won't stop propagation of new `mousedown` events.
74205           if (event.type === 'mousedown') {
74206               var hasOrphan = false;
74207               var listeners = window.__on;
74208               for (var i = 0; i < listeners.length; i++) {
74209                   var listener = listeners[i];
74210                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
74211                       hasOrphan = true;
74212                       break;
74213                   }
74214               }
74215               if (hasOrphan) {
74216                   var event$1 = window.CustomEvent;
74217                   if (event$1) {
74218                       event$1 = new event$1('mouseup');
74219                   } else {
74220                       event$1 = window.document.createEvent('Event');
74221                       event$1.initEvent('mouseup', false, false);
74222                   }
74223                   // Event needs to be dispatched with an event.view property.
74224                   event$1.view = window;
74225                   window.dispatchEvent(event$1);
74226               }
74227           }
74228
74229           return event.button !== 2;   // ignore right clicks
74230       }
74231
74232
74233       function pxCenter() {
74234           return [_dimensions[0] / 2, _dimensions[1] / 2];
74235       }
74236
74237
74238       function drawVector(difference, extent) {
74239           var mode = context.mode();
74240           var graph = context.graph();
74241           var features = context.features();
74242           var all = context.intersects(map.extent());
74243           var fullRedraw = false;
74244           var data;
74245           var filter;
74246
74247           if (difference) {
74248               var complete = difference.complete(map.extent());
74249               data = compact(values$1(complete));
74250               filter = function(d) { return d.id in complete; };
74251               features.clear(data);
74252
74253           } else {
74254               // force a full redraw if gatherStats detects that a feature
74255               // should be auto-hidden (e.g. points or buildings)..
74256               if (features.gatherStats(all, graph, _dimensions)) {
74257                   extent = undefined;
74258               }
74259
74260               if (extent) {
74261                   data = context.intersects(map.extent().intersection(extent));
74262                   var set = set$2(map$3(data, 'id'));
74263                   filter = function(d) { return set.has(d.id); };
74264
74265               } else {
74266                   data = all;
74267                   fullRedraw = true;
74268                   filter = utilFunctor(true);
74269               }
74270           }
74271
74272           data = features.filter(data, graph);
74273
74274           if (mode && mode.id === 'select') {
74275               // update selected vertices - the user might have just double-clicked a way,
74276               // creating a new vertex, triggering a partial redraw without a mode change
74277               surface.call(drawVertices.drawSelected, graph, map.extent());
74278           }
74279
74280           surface
74281               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
74282               .call(drawLines, graph, data, filter)
74283               .call(drawAreas, graph, data, filter)
74284               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
74285               .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
74286               .call(drawPoints, graph, data, filter);
74287
74288           dispatch$1.call('drawn', this, {full: true});
74289       }
74290
74291
74292       function editOff() {
74293           context.features().resetStats();
74294           surface.selectAll('.layer-osm *').remove();
74295           surface.selectAll('.layer-touch:not(.markers) *').remove();
74296
74297           var allowed = {
74298               'browse': true,
74299               'save': true,
74300               'select-note': true,
74301               'select-data': true,
74302               'select-error': true
74303           };
74304
74305           var mode = context.mode();
74306           if (mode && !allowed[mode.id]) {
74307               context.enter(modeBrowse(context));
74308           }
74309
74310           dispatch$1.call('drawn', this, {full: true});
74311       }
74312
74313
74314       function dblClick() {
74315           if (!_dblClickEnabled) {
74316               event.preventDefault();
74317               event.stopImmediatePropagation();
74318           }
74319       }
74320
74321
74322       function gestureChange() {
74323           // Remap Safari gesture events to wheel events - #5492
74324           // We want these disabled most places, but enabled for zoom/unzoom on map surface
74325           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
74326           var e = event;
74327           e.preventDefault();
74328
74329           var props = {
74330               deltaMode: 0,    // dummy values to ignore in zoomPan
74331               deltaY: 1,       // dummy values to ignore in zoomPan
74332               clientX: e.clientX,
74333               clientY: e.clientY,
74334               screenX: e.screenX,
74335               screenY: e.screenY,
74336               x: e.x,
74337               y: e.y
74338           };
74339
74340           var e2 = new WheelEvent('wheel', props);
74341           e2._scale = e.scale;         // preserve the original scale
74342           e2._rotation = e.rotation;   // preserve the original rotation
74343
74344           _selection.node().dispatchEvent(e2);
74345       }
74346
74347
74348       function zoomPan(manualEvent) {
74349           var event$1 = (manualEvent || event);
74350           var source = event$1.sourceEvent;
74351           var eventTransform = event$1.transform;
74352           var x = eventTransform.x;
74353           var y = eventTransform.y;
74354           var k = eventTransform.k;
74355
74356           if (_transformStart.x === x &&
74357               _transformStart.y === y &&
74358               _transformStart.k === k) {
74359               return;  // no change
74360           }
74361
74362           // Special handling of 'wheel' events:
74363           // They might be triggered by the user scrolling the mouse wheel,
74364           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
74365           if (source && source.type === 'wheel') {
74366               var detected = utilDetect();
74367               var dX = source.deltaX;
74368               var dY = source.deltaY;
74369               var x2 = x;
74370               var y2 = y;
74371               var k2 = k;
74372               var t0, p0, p1;
74373
74374               // Normalize mousewheel scroll speed (Firefox) - #3029
74375               // If wheel delta is provided in LINE units, recalculate it in PIXEL units
74376               // We are essentially redoing the calculations that occur here:
74377               //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
74378               // See this for more info:
74379               //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
74380               if (source.deltaMode === 1 /* LINE */) {
74381                   // Convert from lines to pixels, more if the user is scrolling fast.
74382                   // (I made up the exp function to roughly match Firefox to what Chrome does)
74383                   // These numbers should be floats, because integers are treated as pan gesture below.
74384                   var lines = Math.abs(source.deltaY);
74385                   var sign = (source.deltaY > 0) ? 1 : -1;
74386                   dY = sign * clamp(
74387                       Math.exp((lines - 1) * 0.75) * 4.000244140625,
74388                       4.000244140625,    // min
74389                       350.000244140625   // max
74390                   );
74391
74392                   // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
74393                   // There doesn't seem to be any scroll accelleration.
74394                   // This multiplier increases the speed a little bit - #5512
74395                   if (detected.os !== 'mac') {
74396                       dY *= 5;
74397                   }
74398
74399                   // recalculate x2,y2,k2
74400                   t0 = _isTransformed ? _transformLast : _transformStart;
74401                   p0 = _getMouseCoords(source);
74402                   p1 = t0.invert(p0);
74403                   k2 = t0.k * Math.pow(2, -dY / 500);
74404                   x2 = p0[0] - p1[0] * k2;
74405                   y2 = p0[1] - p1[1] * k2;
74406
74407               // 2 finger map pinch zooming (Safari) - #5492
74408               // These are fake `wheel` events we made from Safari `gesturechange` events..
74409               } else if (source._scale) {
74410                   // recalculate x2,y2,k2
74411                   t0 = _gestureTransformStart;
74412                   p0 = _getMouseCoords(source);
74413                   p1 = t0.invert(p0);
74414                   k2 = t0.k * source._scale;
74415                   x2 = p0[0] - p1[0] * k2;
74416                   y2 = p0[1] - p1[1] * k2;
74417
74418               // 2 finger map pinch zooming (all browsers except Safari) - #5492
74419               // Pinch zooming via the `wheel` event will always have:
74420               // - `ctrlKey = true`
74421               // - `deltaY` is not round integer pixels (ignore `deltaX`)
74422               } else if (source.ctrlKey && !isInteger(dY)) {
74423                   dY *= 6;   // slightly scale up whatever the browser gave us
74424
74425                   // recalculate x2,y2,k2
74426                   t0 = _isTransformed ? _transformLast : _transformStart;
74427                   p0 = _getMouseCoords(source);
74428                   p1 = t0.invert(p0);
74429                   k2 = t0.k * Math.pow(2, -dY / 500);
74430                   x2 = p0[0] - p1[0] * k2;
74431                   y2 = p0[1] - p1[1] * k2;
74432
74433               // Trackpad scroll zooming with shift or alt/option key down
74434               } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
74435                   // recalculate x2,y2,k2
74436                   t0 = _isTransformed ? _transformLast : _transformStart;
74437                   p0 = _getMouseCoords(source);
74438                   p1 = t0.invert(p0);
74439                   k2 = t0.k * Math.pow(2, -dY / 500);
74440                   x2 = p0[0] - p1[0] * k2;
74441                   y2 = p0[1] - p1[1] * k2;
74442
74443               // 2 finger map panning (Mac only, all browsers) - #5492, #5512
74444               // Panning via the `wheel` event will always have:
74445               // - `ctrlKey = false`
74446               // - `deltaX`,`deltaY` are round integer pixels
74447               } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
74448                   p1 = projection.translate();
74449                   x2 = p1[0] - dX;
74450                   y2 = p1[1] - dY;
74451                   k2 = projection.scale();
74452               }
74453
74454               // something changed - replace the event transform
74455               if (x2 !== x || y2 !== y || k2 !== k) {
74456                   x = x2;
74457                   y = y2;
74458                   k = k2;
74459                   eventTransform = identity$7.translate(x2, y2).scale(k2);
74460                   _selection.node().__zoom = eventTransform;
74461               }
74462
74463           }
74464
74465           if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
74466               surface.interrupt();
74467               uiFlash().text(t('cannot_zoom'))();
74468               setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
74469               scheduleRedraw();
74470               dispatch$1.call('move', this, map);
74471               return;
74472           }
74473
74474           projection.transform(eventTransform);
74475
74476           var scale = k / _transformStart.k;
74477           var tX = (x / scale - _transformStart.x) * scale;
74478           var tY = (y / scale - _transformStart.y) * scale;
74479
74480           if (context.inIntro()) {
74481               curtainProjection.transform({
74482                   x: x - tX,
74483                   y: y - tY,
74484                   k: k
74485               });
74486           }
74487
74488           if (source) {
74489               _mouseEvent = event$1;
74490           }
74491           _isTransformed = true;
74492           _transformLast = eventTransform;
74493           utilSetTransform(supersurface, tX, tY, scale);
74494           scheduleRedraw();
74495
74496           dispatch$1.call('move', this, map);
74497
74498
74499           function isInteger(val) {
74500               return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
74501           }
74502       }
74503
74504
74505       function resetTransform() {
74506           if (!_isTransformed) return false;
74507
74508           // deprecation warning - Radial Menu to be removed in iD v3
74509           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
74510           utilSetTransform(supersurface, 0, 0);
74511           _isTransformed = false;
74512           if (context.inIntro()) {
74513               curtainProjection.transform(projection.transform());
74514           }
74515           return true;
74516       }
74517
74518
74519       function redraw(difference, extent) {
74520           if (surface.empty() || !_redrawEnabled) return;
74521
74522           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
74523           // It would result in artifacts where differenced entities are redrawn with
74524           // one transform and unchanged entities with another.
74525           if (resetTransform()) {
74526               difference = extent = undefined;
74527           }
74528
74529           var zoom = map.zoom();
74530           var z = String(~~zoom);
74531
74532           if (surface.attr('data-zoom') !== z) {
74533               surface.attr('data-zoom', z);
74534           }
74535
74536           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
74537           var lat = map.center()[1];
74538           var lowzoom = linear$2()
74539               .domain([-60, 0, 60])
74540               .range([17, 18.5, 17])
74541               .clamp(true);
74542
74543           surface
74544               .classed('low-zoom', zoom <= lowzoom(lat));
74545
74546
74547           if (!difference) {
74548               supersurface.call(context.background());
74549           }
74550
74551           wrapper
74552               .call(drawLayers);
74553
74554           // OSM
74555           if (map.editable()) {
74556               context.loadTiles(projection);
74557               drawVector(difference, extent);
74558           } else {
74559               editOff();
74560           }
74561
74562           _transformStart = projection.transform();
74563
74564           return map;
74565       }
74566
74567
74568
74569       var immediateRedraw = function(difference, extent) {
74570           if (!difference && !extent) cancelPendingRedraw();
74571           redraw(difference, extent);
74572       };
74573
74574
74575       map.mouse = function() {
74576           var event$1 = _mouseEvent || event;
74577           if (event$1) {
74578               var s;
74579               while ((s = event$1.sourceEvent)) { event$1 = s; }
74580               return _getMouseCoords(event$1);
74581           }
74582           return null;
74583       };
74584
74585
74586       // returns Lng/Lat
74587       map.mouseCoordinates = function() {
74588           var coord = map.mouse() || pxCenter();
74589           return projection.invert(coord);
74590       };
74591
74592
74593       map.dblclickEnable = function(val) {
74594           if (!arguments.length) return _dblClickEnabled;
74595           _dblClickEnabled = val;
74596           return map;
74597       };
74598
74599
74600       map.redrawEnable = function(val) {
74601           if (!arguments.length) return _redrawEnabled;
74602           _redrawEnabled = val;
74603           return map;
74604       };
74605
74606
74607       map.isTransformed = function() {
74608           return _isTransformed;
74609       };
74610
74611
74612       function setTransform(t2, duration, force) {
74613           var t = projection.transform();
74614           if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
74615
74616           if (duration) {
74617               _selection
74618                   .transition()
74619                   .duration(duration)
74620                   .on('start', function() { map.startEase(); })
74621                   .call(zoom.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
74622           } else {
74623               projection.transform(t2);
74624               _transformStart = t2;
74625               _selection.call(zoom.transform, _transformStart);
74626           }
74627
74628           return true;
74629       }
74630
74631
74632       function setCenterZoom(loc2, z2, duration, force) {
74633           var c = map.center();
74634           var z = map.zoom();
74635           if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
74636
74637           var proj = geoRawMercator().transform(projection.transform());  // copy projection
74638
74639           var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
74640           proj.scale(k2);
74641
74642           var t = proj.translate();
74643           var point = proj(loc2);
74644
74645           var center = pxCenter();
74646           t[0] += center[0] - point[0];
74647           t[1] += center[1] - point[1];
74648
74649           return setTransform(identity$7.translate(t[0], t[1]).scale(k2), duration, force);
74650       }
74651
74652
74653       map.pan = function(delta, duration) {
74654           var t = projection.translate();
74655           var k = projection.scale();
74656
74657           t[0] += delta[0];
74658           t[1] += delta[1];
74659
74660           if (duration) {
74661               _selection
74662                   .transition()
74663                   .duration(duration)
74664                   .on('start', function() { map.startEase(); })
74665                   .call(zoom.transform, identity$7.translate(t[0], t[1]).scale(k));
74666           } else {
74667               projection.translate(t);
74668               _transformStart = projection.transform();
74669               _selection.call(zoom.transform, _transformStart);
74670               dispatch$1.call('move', this, map);
74671               immediateRedraw();
74672           }
74673
74674           return map;
74675       };
74676
74677
74678       map.dimensions = function(val) {
74679           if (!arguments.length) return _dimensions;
74680
74681           _dimensions = val;
74682           drawLayers.dimensions(_dimensions);
74683           context.background().dimensions(_dimensions);
74684           projection.clipExtent([[0, 0], _dimensions]);
74685           _getMouseCoords = utilFastMouse(supersurface.node());
74686
74687           scheduleRedraw();
74688           return map;
74689       };
74690
74691
74692       function zoomIn(delta) {
74693           setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
74694       }
74695
74696       function zoomOut(delta) {
74697           setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
74698       }
74699
74700       map.zoomIn = function() { zoomIn(1); };
74701       map.zoomInFurther = function() { zoomIn(4); };
74702
74703       map.zoomOut = function() { zoomOut(1); };
74704       map.zoomOutFurther = function() { zoomOut(4); };
74705
74706
74707       map.center = function(loc2) {
74708           if (!arguments.length) {
74709               return projection.invert(pxCenter());
74710           }
74711
74712           if (setCenterZoom(loc2, map.zoom())) {
74713               dispatch$1.call('move', this, map);
74714           }
74715
74716           scheduleRedraw();
74717           return map;
74718       };
74719
74720
74721       map.zoom = function(z2) {
74722           if (!arguments.length) {
74723               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
74724           }
74725
74726           if (z2 < _minzoom) {
74727               surface.interrupt();
74728               uiFlash().text(t('cannot_zoom'))();
74729               z2 = context.minEditableZoom();
74730           }
74731
74732           if (setCenterZoom(map.center(), z2)) {
74733               dispatch$1.call('move', this, map);
74734           }
74735
74736           scheduleRedraw();
74737           return map;
74738       };
74739
74740
74741       map.centerZoom = function(loc2, z2) {
74742           if (setCenterZoom(loc2, z2)) {
74743               dispatch$1.call('move', this, map);
74744           }
74745
74746           scheduleRedraw();
74747           return map;
74748       };
74749
74750
74751       map.zoomTo = function(entity) {
74752           var extent = entity.extent(context.graph());
74753           if (!isFinite(extent.area())) return map;
74754
74755           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
74756           return map.centerZoom(extent.center(), z2);
74757       };
74758
74759
74760       map.centerEase = function(loc2, duration) {
74761           duration = duration || 250;
74762           setCenterZoom(loc2, map.zoom(), duration);
74763           return map;
74764       };
74765
74766
74767       map.zoomEase = function(z2, duration) {
74768           duration = duration || 250;
74769           setCenterZoom(map.center(), z2, duration, false);
74770           return map;
74771       };
74772
74773
74774       map.centerZoomEase = function(loc2, z2, duration) {
74775           duration = duration || 250;
74776           setCenterZoom(loc2, z2, duration, false);
74777           return map;
74778       };
74779
74780
74781       map.transformEase = function(t2, duration) {
74782           duration = duration || 250;
74783           setTransform(t2, duration, false);
74784           return map;
74785       };
74786
74787
74788       map.zoomToEase = function(entity, duration) {
74789           var extent = entity.extent(context.graph());
74790           if (!isFinite(extent.area())) return map;
74791
74792           var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
74793           return map.centerZoomEase(extent.center(), z2, duration);
74794       };
74795
74796
74797       map.startEase = function() {
74798           utilBindOnce(surface, 'mousedown.ease', function() {
74799               map.cancelEase();
74800           });
74801           return map;
74802       };
74803
74804
74805       map.cancelEase = function() {
74806           _selection.interrupt();
74807           return map;
74808       };
74809
74810
74811       map.extent = function(val) {
74812           if (!arguments.length) {
74813               return new geoExtent(
74814                   projection.invert([0, _dimensions[1]]),
74815                   projection.invert([_dimensions[0], 0])
74816               );
74817           } else {
74818               var extent = geoExtent(val);
74819               map.centerZoom(extent.center(), map.extentZoom(extent));
74820           }
74821       };
74822
74823
74824       map.trimmedExtent = function(val) {
74825           if (!arguments.length) {
74826               var headerY = 60;
74827               var footerY = 30;
74828               var pad = 10;
74829               return new geoExtent(
74830                   projection.invert([pad, _dimensions[1] - footerY - pad]),
74831                   projection.invert([_dimensions[0] - pad, headerY + pad])
74832               );
74833           } else {
74834               var extent = geoExtent(val);
74835               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
74836           }
74837       };
74838
74839
74840       function calcExtentZoom(extent, dim) {
74841           var tl = projection([extent[0][0], extent[1][1]]);
74842           var br = projection([extent[1][0], extent[0][1]]);
74843
74844           // Calculate maximum zoom that fits extent
74845           var hFactor = (br[0] - tl[0]) / dim[0];
74846           var vFactor = (br[1] - tl[1]) / dim[1];
74847           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
74848           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
74849           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
74850
74851           return newZoom;
74852       }
74853
74854
74855       map.extentZoom = function(val) {
74856           return calcExtentZoom(geoExtent(val), _dimensions);
74857       };
74858
74859
74860       map.trimmedExtentZoom = function(val) {
74861           var trimY = 120;
74862           var trimX = 40;
74863           var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
74864           return calcExtentZoom(geoExtent(val), trimmed);
74865       };
74866
74867
74868       map.editable = function() {
74869           var osmLayer = surface.selectAll('.data-layer.osm');
74870           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
74871
74872           return map.zoom() >= context.minEditableZoom();
74873       };
74874
74875
74876       map.notesEditable = function() {
74877           var noteLayer = surface.selectAll('.data-layer.notes');
74878           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
74879
74880           return map.zoom() >= context.minEditableZoom();
74881       };
74882
74883
74884       map.minzoom = function(val) {
74885           if (!arguments.length) return _minzoom;
74886           _minzoom = val;
74887           return map;
74888       };
74889
74890
74891       map.layers = drawLayers;
74892
74893
74894       return utilRebind(map, dispatch$1, 'on');
74895   }
74896
74897   function uiMapInMap(context) {
74898
74899       function map_in_map(selection) {
74900           var backgroundLayer = rendererTileLayer(context);
74901           var overlayLayers = {};
74902           var projection = geoRawMercator();
74903           var dataLayer = svgData(projection, context).showLabels(false);
74904           var debugLayer = svgDebug(projection, context);
74905           var zoom = d3_zoom()
74906               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
74907               .on('start', zoomStarted)
74908               .on('zoom', zoomed)
74909               .on('end', zoomEnded);
74910           var isTransformed = false;
74911           var isHidden = true;
74912           var skipEvents = false;
74913           var gesture = null;
74914           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
74915           var wrap = select(null);
74916           var tiles = select(null);
74917           var viewport = select(null);
74918           var tStart;    // transform at start of gesture
74919           var tCurr;     // transform at most recent event
74920           var timeoutId;
74921
74922
74923           function zoomStarted() {
74924               if (skipEvents) return;
74925               tStart = tCurr = projection.transform();
74926               gesture = null;
74927           }
74928
74929
74930           function zoomed() {
74931               if (skipEvents) return;
74932
74933               var x = event.transform.x;
74934               var y = event.transform.y;
74935               var k = event.transform.k;
74936               var isZooming = (k !== tStart.k);
74937               var isPanning = (x !== tStart.x || y !== tStart.y);
74938
74939               if (!isZooming && !isPanning) {
74940                   return;  // no change
74941               }
74942
74943               // lock in either zooming or panning, don't allow both in minimap.
74944               if (!gesture) {
74945                   gesture = isZooming ? 'zoom' : 'pan';
74946               }
74947
74948               var tMini = projection.transform();
74949               var tX, tY, scale;
74950
74951               if (gesture === 'zoom') {
74952                   var dMini = utilGetDimensions(wrap);
74953                   var cMini = geoVecScale(dMini, 0.5);
74954                   scale = k / tMini.k;
74955                   tX = (cMini[0] / scale - cMini[0]) * scale;
74956                   tY = (cMini[1] / scale - cMini[1]) * scale;
74957               } else {
74958                   k = tMini.k;
74959                   scale = 1;
74960                   tX = x - tMini.x;
74961                   tY = y - tMini.y;
74962               }
74963
74964               utilSetTransform(tiles, tX, tY, scale);
74965               utilSetTransform(viewport, 0, 0, scale);
74966               isTransformed = true;
74967               tCurr = identity$7.translate(x, y).scale(k);
74968
74969               var zMain = geoScaleToZoom(context.projection.scale());
74970               var zMini = geoScaleToZoom(k);
74971
74972               zDiff = zMain - zMini;
74973
74974               queueRedraw();
74975           }
74976
74977
74978           function zoomEnded() {
74979               if (skipEvents) return;
74980               if (gesture !== 'pan') return;
74981
74982               updateProjection();
74983               gesture = null;
74984               var dMini = utilGetDimensions(wrap);
74985               var cMini = geoVecScale(dMini, 0.5);
74986               context.map().center(projection.invert(cMini));   // recenter main map..
74987           }
74988
74989
74990           function updateProjection() {
74991               var loc = context.map().center();
74992               var dMini = utilGetDimensions(wrap);
74993               var cMini = geoVecScale(dMini, 0.5);
74994               var tMain = context.projection.transform();
74995               var zMain = geoScaleToZoom(tMain.k);
74996               var zMini = Math.max(zMain - zDiff, 0.5);
74997               var kMini = geoZoomToScale(zMini);
74998
74999               projection
75000                   .translate([tMain.x, tMain.y])
75001                   .scale(kMini);
75002
75003               var point = projection(loc);
75004               var mouse = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
75005               var xMini = cMini[0] - point[0] + tMain.x + mouse[0];
75006               var yMini = cMini[1] - point[1] + tMain.y + mouse[1];
75007
75008               projection
75009                   .translate([xMini, yMini])
75010                   .clipExtent([[0, 0], dMini]);
75011
75012               tCurr = projection.transform();
75013
75014               if (isTransformed) {
75015                   utilSetTransform(tiles, 0, 0);
75016                   utilSetTransform(viewport, 0, 0);
75017                   isTransformed = false;
75018               }
75019
75020               zoom
75021                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
75022
75023               skipEvents = true;
75024               wrap.call(zoom.transform, tCurr);
75025               skipEvents = false;
75026           }
75027
75028
75029           function redraw() {
75030               clearTimeout(timeoutId);
75031               if (isHidden) return;
75032
75033               updateProjection();
75034
75035               var dMini = utilGetDimensions(wrap);
75036               var zMini = geoScaleToZoom(projection.scale());
75037
75038               // setup tile container
75039               tiles = wrap
75040                   .selectAll('.map-in-map-tiles')
75041                   .data([0]);
75042
75043               tiles = tiles.enter()
75044                   .append('div')
75045                   .attr('class', 'map-in-map-tiles')
75046                   .merge(tiles);
75047
75048               // redraw background
75049               backgroundLayer
75050                   .source(context.background().baseLayerSource())
75051                   .projection(projection)
75052                   .dimensions(dMini);
75053
75054               var background = tiles
75055                   .selectAll('.map-in-map-background')
75056                   .data([0]);
75057
75058               background.enter()
75059                   .append('div')
75060                   .attr('class', 'map-in-map-background')
75061                   .merge(background)
75062                   .call(backgroundLayer);
75063
75064
75065               // redraw overlay
75066               var overlaySources = context.background().overlayLayerSources();
75067               var activeOverlayLayers = [];
75068               for (var i = 0; i < overlaySources.length; i++) {
75069                   if (overlaySources[i].validZoom(zMini)) {
75070                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
75071                       activeOverlayLayers.push(overlayLayers[i]
75072                           .source(overlaySources[i])
75073                           .projection(projection)
75074                           .dimensions(dMini));
75075                   }
75076               }
75077
75078               var overlay = tiles
75079                   .selectAll('.map-in-map-overlay')
75080                   .data([0]);
75081
75082               overlay = overlay.enter()
75083                   .append('div')
75084                   .attr('class', 'map-in-map-overlay')
75085                   .merge(overlay);
75086
75087
75088               var overlays = overlay
75089                   .selectAll('div')
75090                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
75091
75092               overlays.exit()
75093                   .remove();
75094
75095               overlays = overlays.enter()
75096                   .append('div')
75097                   .merge(overlays)
75098                   .each(function(layer) { select(this).call(layer); });
75099
75100
75101               var dataLayers = tiles
75102                   .selectAll('.map-in-map-data')
75103                   .data([0]);
75104
75105               dataLayers.exit()
75106                   .remove();
75107
75108               dataLayers = dataLayers.enter()
75109                   .append('svg')
75110                   .attr('class', 'map-in-map-data')
75111                   .merge(dataLayers)
75112                   .call(dataLayer)
75113                   .call(debugLayer);
75114
75115
75116               // redraw viewport bounding box
75117               if (gesture !== 'pan') {
75118                   var getPath = d3_geoPath(projection);
75119                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
75120
75121                   viewport = wrap.selectAll('.map-in-map-viewport')
75122                       .data([0]);
75123
75124                   viewport = viewport.enter()
75125                       .append('svg')
75126                       .attr('class', 'map-in-map-viewport')
75127                       .merge(viewport);
75128
75129
75130                   var path = viewport.selectAll('.map-in-map-bbox')
75131                       .data([bbox]);
75132
75133                   path.enter()
75134                       .append('path')
75135                       .attr('class', 'map-in-map-bbox')
75136                       .merge(path)
75137                       .attr('d', getPath)
75138                       .classed('thick', function(d) { return getPath.area(d) < 30; });
75139               }
75140           }
75141
75142
75143           function queueRedraw() {
75144               clearTimeout(timeoutId);
75145               timeoutId = setTimeout(function() { redraw(); }, 750);
75146           }
75147
75148
75149           function toggle() {
75150               if (event) event.preventDefault();
75151
75152               isHidden = !isHidden;
75153
75154               select('.minimap-toggle-item')
75155                   .classed('active', !isHidden)
75156                   .select('input')
75157                   .property('checked', !isHidden);
75158
75159               if (isHidden) {
75160                   wrap
75161                       .style('display', 'block')
75162                       .style('opacity', '1')
75163                       .transition()
75164                       .duration(200)
75165                       .style('opacity', '0')
75166                       .on('end', function() {
75167                           selection.selectAll('.map-in-map')
75168                               .style('display', 'none');
75169                       });
75170               } else {
75171                   wrap
75172                       .style('display', 'block')
75173                       .style('opacity', '0')
75174                       .transition()
75175                       .duration(200)
75176                       .style('opacity', '1')
75177                       .on('end', function() {
75178                           redraw();
75179                       });
75180               }
75181           }
75182
75183
75184           uiMapInMap.toggle = toggle;
75185
75186           wrap = selection.selectAll('.map-in-map')
75187               .data([0]);
75188
75189           wrap = wrap.enter()
75190               .append('div')
75191               .attr('class', 'map-in-map')
75192               .style('display', (isHidden ? 'none' : 'block'))
75193               .call(zoom)
75194               .on('dblclick.zoom', null)
75195               .merge(wrap);
75196
75197           context.map()
75198               .on('drawn.map-in-map', function(drawn) {
75199                   if (drawn.full === true) {
75200                       redraw();
75201                   }
75202               });
75203
75204           redraw();
75205
75206           context.keybinding()
75207               .on(t('background.minimap.key'), toggle);
75208       }
75209
75210       return map_in_map;
75211   }
75212
75213   function uiSettingsCustomBackground(context) {
75214       var dispatch$1 = dispatch('change');
75215
75216       function render(selection) {
75217           var _origSettings = {
75218               template: context.storage('background-custom-template')
75219           };
75220           var _currSettings = cloneDeep(_origSettings);
75221           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
75222           var modal = uiConfirm(selection).okButton();
75223
75224           modal
75225               .classed('settings-modal settings-custom-background', true);
75226
75227           modal.select('.modal-section.header')
75228               .append('h3')
75229               .text(t('settings.custom_background.header'));
75230
75231
75232           var textSection = modal.select('.modal-section.message-text');
75233
75234           textSection
75235               .append('pre')
75236               .attr('class', 'instructions-template')
75237               .text(t('settings.custom_background.instructions', { example: example }));
75238
75239           textSection
75240               .append('textarea')
75241               .attr('class', 'field-template')
75242               .attr('placeholder', t('settings.custom_background.template.placeholder'))
75243               .call(utilNoAuto)
75244               .property('value', _currSettings.template);
75245
75246
75247           // insert a cancel button
75248           var buttonSection = modal.select('.modal-section.buttons');
75249
75250           buttonSection
75251               .insert('button', '.ok-button')
75252               .attr('class', 'button cancel-button secondary-action')
75253               .text(t('confirm.cancel'));
75254
75255
75256           buttonSection.select('.cancel-button')
75257               .on('click.cancel', clickCancel);
75258
75259           buttonSection.select('.ok-button')
75260               .attr('disabled', isSaveDisabled)
75261               .on('click.save', clickSave);
75262
75263
75264           function isSaveDisabled() {
75265               return null;
75266           }
75267
75268
75269           // restore the original template
75270           function clickCancel() {
75271               textSection.select('.field-template').property('value', _origSettings.template);
75272               context.storage('background-custom-template', _origSettings.template);
75273               this.blur();
75274               modal.close();
75275           }
75276
75277           // accept the current template
75278           function clickSave() {
75279               _currSettings.template = textSection.select('.field-template').property('value');
75280               context.storage('background-custom-template', _currSettings.template);
75281               this.blur();
75282               modal.close();
75283               dispatch$1.call('change', this, _currSettings);
75284           }
75285       }
75286
75287       return utilRebind(render, dispatch$1, 'on');
75288   }
75289
75290   function uiBackground(context) {
75291       var key = t('background.key');
75292
75293       var _pane = select(null), _toggleButton = select(null);
75294
75295       var _customSource = context.background().findSource('custom');
75296       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
75297       var _shown = false;
75298
75299       var _backgroundList = select(null);
75300       var _overlayList = select(null);
75301       var _displayOptionsContainer = select(null);
75302       var _offsetContainer = select(null);
75303
75304       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
75305       var backgroundOffset = uiBackgroundOffset(context);
75306
75307       var settingsCustomBackground = uiSettingsCustomBackground(context)
75308           .on('change', customChanged);
75309
75310
75311       function setTooltips(selection) {
75312           selection.each(function(d, i, nodes) {
75313               var item = select(this).select('label');
75314               var span = item.select('span');
75315               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
75316               var description = d.description();
75317               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
75318
75319               item.call(tooltip().destroyAny);
75320
75321               if (d === _previousBackground) {
75322                   item.call(tooltip()
75323                       .placement(placement)
75324                       .html(true)
75325                       .title(function() {
75326                           var tip = '<div>' + t('background.switch') + '</div>';
75327                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
75328                       })
75329                   );
75330               } else if (description || isOverflowing) {
75331                   item.call(tooltip()
75332                       .placement(placement)
75333                       .title(description || d.name())
75334                   );
75335               }
75336           });
75337       }
75338
75339
75340       function updateLayerSelections(selection) {
75341           function active(d) {
75342               return context.background().showsLayer(d);
75343           }
75344
75345           selection.selectAll('li')
75346               .classed('active', active)
75347               .classed('switch', function(d) { return d === _previousBackground; })
75348               .call(setTooltips)
75349               .selectAll('input')
75350               .property('checked', active);
75351       }
75352
75353
75354       function chooseBackground(d) {
75355           if (d.id === 'custom' && !d.template()) {
75356               return editCustom();
75357           }
75358
75359           event.preventDefault();
75360           _previousBackground = context.background().baseLayerSource();
75361           context.storage('background-last-used-toggle', _previousBackground.id);
75362           context.storage('background-last-used', d.id);
75363           context.background().baseLayerSource(d);
75364           _backgroundList.call(updateLayerSelections);
75365           document.activeElement.blur();
75366       }
75367
75368
75369       function customChanged(d) {
75370           if (d && d.template) {
75371               _customSource.template(d.template);
75372               chooseBackground(_customSource);
75373           } else {
75374               _customSource.template('');
75375               chooseBackground(context.background().findSource('none'));
75376           }
75377       }
75378
75379
75380       function editCustom() {
75381           event.preventDefault();
75382           context.container()
75383               .call(settingsCustomBackground);
75384       }
75385
75386
75387       function chooseOverlay(d) {
75388           event.preventDefault();
75389           context.background().toggleOverlayLayer(d);
75390           _overlayList.call(updateLayerSelections);
75391           document.activeElement.blur();
75392       }
75393
75394
75395       function drawListItems(layerList, type, change, filter) {
75396           var sources = context.background()
75397               .sources(context.map().extent())
75398               .filter(filter);
75399
75400           var layerLinks = layerList.selectAll('li')
75401               .data(sources, function(d) { return d.name(); });
75402
75403           layerLinks.exit()
75404               .remove();
75405
75406           var enter = layerLinks.enter()
75407               .append('li')
75408               .classed('layer-custom', function(d) { return d.id === 'custom'; })
75409               .classed('best', function(d) { return d.best(); });
75410
75411           enter.filter(function(d) { return d.id === 'custom'; })
75412               .append('button')
75413               .attr('class', 'layer-browse')
75414               .call(tooltip()
75415                   .title(t('settings.custom_background.tooltip'))
75416                   .placement((textDirection === 'rtl') ? 'right' : 'left')
75417               )
75418               .on('click', editCustom)
75419               .call(svgIcon('#iD-icon-more'));
75420
75421           enter.filter(function(d) { return d.best(); })
75422               .append('div')
75423               .attr('class', 'best')
75424               .call(tooltip()
75425                   .title(t('background.best_imagery'))
75426                   .placement((textDirection === 'rtl') ? 'right' : 'left')
75427               )
75428               .append('span')
75429               .html('&#9733;');
75430
75431           var label = enter
75432               .append('label');
75433
75434           label
75435               .append('input')
75436               .attr('type', type)
75437               .attr('name', 'layers')
75438               .on('change', change);
75439
75440           label
75441               .append('span')
75442               .text(function(d) { return d.name(); });
75443
75444
75445           layerList.selectAll('li')
75446               .sort(sortSources)
75447               .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
75448
75449           layerList
75450               .call(updateLayerSelections);
75451
75452
75453           function sortSources(a, b) {
75454               return a.best() && !b.best() ? -1
75455                   : b.best() && !a.best() ? 1
75456                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
75457           }
75458       }
75459
75460
75461       function renderBackgroundList(selection) {
75462
75463           // the background list
75464           var container = selection.selectAll('.layer-background-list')
75465               .data([0]);
75466
75467           _backgroundList = container.enter()
75468               .append('ul')
75469               .attr('class', 'layer-list layer-background-list')
75470               .attr('dir', 'auto')
75471               .merge(container);
75472
75473
75474           // add minimap toggle below list
75475           var minimapEnter = selection.selectAll('.minimap-toggle-list')
75476               .data([0])
75477               .enter()
75478               .append('ul')
75479               .attr('class', 'layer-list minimap-toggle-list')
75480               .append('li')
75481               .attr('class', 'minimap-toggle-item');
75482
75483           var minimapLabelEnter = minimapEnter
75484               .append('label')
75485               .call(tooltip()
75486                   .html(true)
75487                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
75488                   .placement('top')
75489               );
75490
75491           minimapLabelEnter
75492               .append('input')
75493               .attr('type', 'checkbox')
75494               .on('change', function() {
75495                   event.preventDefault();
75496                   uiMapInMap.toggle();
75497               });
75498
75499           minimapLabelEnter
75500               .append('span')
75501               .text(t('background.minimap.description'));
75502
75503
75504           // "Info / Report a Problem" link
75505           selection.selectAll('.imagery-faq')
75506               .data([0])
75507               .enter()
75508               .append('div')
75509               .attr('class', 'imagery-faq')
75510               .append('a')
75511               .attr('target', '_blank')
75512               .attr('tabindex', -1)
75513               .call(svgIcon('#iD-icon-out-link', 'inline'))
75514               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
75515               .append('span')
75516               .text(t('background.imagery_source_faq'));
75517
75518           updateBackgroundList();
75519       }
75520
75521
75522       function renderOverlayList(selection) {
75523           var container = selection.selectAll('.layer-overlay-list')
75524               .data([0]);
75525
75526           _overlayList = container.enter()
75527               .append('ul')
75528               .attr('class', 'layer-list layer-overlay-list')
75529               .attr('dir', 'auto')
75530               .merge(container);
75531
75532           updateOverlayList();
75533       }
75534
75535       function updateBackgroundList() {
75536           _backgroundList
75537               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
75538       }
75539
75540       function updateOverlayList() {
75541           _overlayList
75542               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
75543       }
75544
75545
75546       function update() {
75547
75548           if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
75549               updateBackgroundList();
75550           }
75551
75552           if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
75553               updateOverlayList();
75554           }
75555
75556           _displayOptionsContainer
75557               .call(backgroundDisplayOptions);
75558
75559           _offsetContainer
75560               .call(backgroundOffset);
75561       }
75562
75563
75564       function quickSwitch() {
75565           if (event) {
75566               event.stopImmediatePropagation();
75567               event.preventDefault();
75568           }
75569           if (_previousBackground) {
75570               chooseBackground(_previousBackground);
75571           }
75572       }
75573
75574       var paneTooltip = tooltip()
75575           .placement((textDirection === 'rtl') ? 'right' : 'left')
75576           .html(true)
75577           .title(uiTooltipHtml(t('background.description'), key));
75578
75579       uiBackground.togglePane = function() {
75580           if (event) event.preventDefault();
75581           paneTooltip.hide(_toggleButton);
75582           uiBackground.setVisible(!_toggleButton.classed('active'));
75583       };
75584
75585       uiBackground.hidePane = function() {
75586           uiBackground.setVisible(false);
75587       };
75588
75589       uiBackground.setVisible = function(show) {
75590           if (show !== _shown) {
75591               _toggleButton.classed('active', show);
75592               _shown = show;
75593
75594               if (show) {
75595                   uiHelp.hidePane();
75596                   uiIssues.hidePane();
75597                   uiMapData.hidePane();
75598                   update();
75599
75600                   _pane
75601                       .style('display', 'block')
75602                       .style('right', '-300px')
75603                       .transition()
75604                       .duration(200)
75605                       .style('right', '0px');
75606
75607               } else {
75608                   _pane
75609                       .style('display', 'block')
75610                       .style('right', '0px')
75611                       .transition()
75612                       .duration(200)
75613                       .style('right', '-300px')
75614                       .on('end', function() {
75615                           select(this).style('display', 'none');
75616                       });
75617               }
75618           }
75619       };
75620
75621       uiBackground.renderToggleButton = function(selection) {
75622
75623           _toggleButton = selection
75624               .append('button')
75625               .attr('tabindex', -1)
75626               .on('click', uiBackground.togglePane)
75627               .call(svgIcon('#iD-icon-layers', 'light'))
75628               .call(paneTooltip);
75629       };
75630
75631       uiBackground.renderPane = function(selection) {
75632
75633           _pane = selection
75634               .append('div')
75635               .attr('class', 'fillL map-pane background-pane hide');
75636
75637
75638           var heading = _pane
75639               .append('div')
75640               .attr('class', 'pane-heading');
75641
75642           heading
75643               .append('h2')
75644               .text(t('background.title'));
75645
75646           heading
75647               .append('button')
75648               .on('click', uiBackground.hidePane)
75649               .call(svgIcon('#iD-icon-close'));
75650
75651
75652           var content = _pane
75653               .append('div')
75654               .attr('class', 'pane-content');
75655
75656           // background list
75657           content
75658               .append('div')
75659               .attr('class', 'background-background-list-container')
75660               .call(uiDisclosure(context, 'background_list', true)
75661                   .title(t('background.backgrounds'))
75662                   .content(renderBackgroundList)
75663               );
75664
75665           // overlay list
75666           content
75667               .append('div')
75668               .attr('class', 'background-overlay-list-container')
75669               .call(uiDisclosure(context, 'overlay_list', true)
75670                   .title(t('background.overlays'))
75671                   .content(renderOverlayList)
75672               );
75673
75674           // display options
75675           _displayOptionsContainer = content
75676               .append('div')
75677               .attr('class', 'background-display-options');
75678
75679           // offset controls
75680           _offsetContainer = content
75681               .append('div')
75682               .attr('class', 'background-offset');
75683
75684
75685           // add listeners
75686           context.map()
75687               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
75688
75689           context.background()
75690               .on('change.background-update', update);
75691
75692
75693           update();
75694
75695           context.keybinding()
75696               .on(key, uiBackground.togglePane)
75697               .on(uiCmd('⌘' + key), quickSwitch);
75698       };
75699
75700       return uiBackground;
75701   }
75702
75703   function uiContributors(context) {
75704       var osm = context.connection(),
75705           debouncedUpdate = debounce(function() { update(); }, 1000),
75706           limit = 4,
75707           hidden = false,
75708           wrap = select(null);
75709
75710
75711       function update() {
75712           if (!osm) return;
75713
75714           var users = {},
75715               entities = context.intersects(context.map().extent());
75716
75717           entities.forEach(function(entity) {
75718               if (entity && entity.user) users[entity.user] = true;
75719           });
75720
75721           var u = Object.keys(users),
75722               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
75723
75724           wrap.html('')
75725               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
75726
75727           var userList = select(document.createElement('span'));
75728
75729           userList.selectAll()
75730               .data(subset)
75731               .enter()
75732               .append('a')
75733               .attr('class', 'user-link')
75734               .attr('href', function(d) { return osm.userURL(d); })
75735               .attr('target', '_blank')
75736               .attr('tabindex', -1)
75737               .text(String);
75738
75739           if (u.length > limit) {
75740               var count = select(document.createElement('span'));
75741
75742               count.append('a')
75743                   .attr('target', '_blank')
75744                   .attr('tabindex', -1)
75745                   .attr('href', function() {
75746                       return osm.changesetsURL(context.map().center(), context.map().zoom());
75747                   })
75748                   .text(u.length - limit + 1);
75749
75750               wrap.append('span')
75751                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
75752
75753           } else {
75754               wrap.append('span')
75755                   .html(t('contributors.list', { users: userList.html() }));
75756           }
75757
75758           if (!u.length) {
75759               hidden = true;
75760               wrap
75761                   .transition()
75762                   .style('opacity', 0);
75763
75764           } else if (hidden) {
75765               wrap
75766                   .transition()
75767                   .style('opacity', 1);
75768           }
75769       }
75770
75771
75772       return function(selection) {
75773           if (!osm) return;
75774           wrap = selection;
75775           update();
75776
75777           osm.on('loaded.contributors', debouncedUpdate);
75778           context.map().on('move.contributors', debouncedUpdate);
75779       };
75780   }
75781
75782   function uiFeatureInfo(context) {
75783       function update(selection) {
75784           var features = context.features(),
75785               stats = features.stats(),
75786               count = 0,
75787               hiddenList = compact(map$3(features.hidden(), function(k) {
75788                   if (stats[k]) {
75789                       count += stats[k];
75790                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
75791                   }
75792               }));
75793
75794           selection.html('');
75795
75796           if (hiddenList.length) {
75797               var tooltipBehavior = tooltip()
75798                   .placement('top')
75799                   .html(true)
75800                   .title(function() {
75801                       return uiTooltipHtml(hiddenList.join('<br/>'));
75802                   });
75803
75804               var warning = selection.append('a')
75805                   .attr('href', '#')
75806                   .attr('tabindex', -1)
75807                   .html(t('feature_info.hidden_warning', { count: count }))
75808                   .call(tooltipBehavior)
75809                   .on('click', function() {
75810                       tooltipBehavior.hide(warning);
75811                       // open map data panel?
75812                       event.preventDefault();
75813                   });
75814           }
75815
75816           selection
75817               .classed('hide', !hiddenList.length);
75818       }
75819
75820
75821       return function(selection) {
75822           update(selection);
75823
75824           context.features().on('change.feature_info', function() {
75825               update(selection);
75826           });
75827       };
75828   }
75829
75830   function uiFullScreen(context) {
75831       var element = context.container().node();
75832       // var button = d3_select(null);
75833
75834
75835       function getFullScreenFn() {
75836           if (element.requestFullscreen) {
75837               return element.requestFullscreen;
75838           } else if (element.msRequestFullscreen) {
75839               return element.msRequestFullscreen;
75840           } else if (element.mozRequestFullScreen) {
75841               return element.mozRequestFullScreen;
75842           } else if (element.webkitRequestFullscreen) {
75843               return element.webkitRequestFullscreen;
75844           }
75845       }
75846
75847
75848       function getExitFullScreenFn() {
75849           if (document.exitFullscreen) {
75850               return document.exitFullscreen;
75851           } else if (document.msExitFullscreen) {
75852               return document.msExitFullscreen;
75853           } else if (document.mozCancelFullScreen) {
75854               return document.mozCancelFullScreen;
75855           } else if (document.webkitExitFullscreen) {
75856               return document.webkitExitFullscreen;
75857           }
75858       }
75859
75860
75861       function isFullScreen() {
75862           return document.fullscreenElement ||
75863               document.mozFullScreenElement ||
75864               document.webkitFullscreenElement ||
75865               document.msFullscreenElement;
75866       }
75867
75868
75869       function isSupported() {
75870           return !!getFullScreenFn();
75871       }
75872
75873
75874       function fullScreen() {
75875           event.preventDefault();
75876           if (!isFullScreen()) {
75877               // button.classed('active', true);
75878               getFullScreenFn().apply(element);
75879           } else {
75880               // button.classed('active', false);
75881               getExitFullScreenFn().apply(document);
75882           }
75883       }
75884
75885
75886       return function() { // selection) {
75887           if (!isSupported()) return;
75888
75889           // button = selection.append('button')
75890           //     .attr('title', t('full_screen'))
75891           //     .attr('tabindex', -1)
75892           //     .on('click', fullScreen)
75893           //     .call(tooltip);
75894
75895           // button.append('span')
75896           //     .attr('class', 'icon full-screen');
75897
75898           var detected = utilDetect();
75899           var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
75900           context.keybinding().on(keys, fullScreen);
75901       };
75902   }
75903
75904   function uiLoading(context) {
75905       var _modalSelection = select(null);
75906       var _message = '';
75907       var _blocking = false;
75908
75909
75910       var loading = function(selection) {
75911           _modalSelection = uiModal(selection, _blocking);
75912
75913           var loadertext = _modalSelection.select('.content')
75914               .classed('loading-modal', true)
75915               .append('div')
75916               .attr('class', 'modal-section fillL');
75917
75918           loadertext
75919               .append('img')
75920               .attr('class', 'loader')
75921               .attr('src', context.imagePath('loader-white.gif'));
75922
75923           loadertext
75924               .append('h3')
75925               .text(_message);
75926
75927           _modalSelection.select('button.close')
75928               .attr('class', 'hide');
75929
75930           return loading;
75931       };
75932
75933
75934       loading.message = function(_) {
75935           if (!arguments.length) return _message;
75936           _message = _;
75937           return loading;
75938       };
75939
75940
75941       loading.blocking = function(_) {
75942           if (!arguments.length) return _blocking;
75943           _blocking = _;
75944           return loading;
75945       };
75946
75947
75948       loading.close = function() {
75949           _modalSelection.remove();
75950       };
75951
75952
75953       return loading;
75954   }
75955
75956   function uiGeolocate(context) {
75957       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
75958       var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
75959       var layer = context.layers().layer('geolocate');
75960       var _position;
75961       var _extent;
75962       var _timeoutID;
75963
75964
75965       function click() {
75966           if (context.inIntro()) return;
75967           context.enter(modeBrowse(context));
75968           if (!layer.enabled()) {
75969               if (!_position) {
75970                   context.container().call(locating);
75971                   navigator.geolocation.getCurrentPosition(success, error, geoOptions);
75972               } else {
75973                   zoomTo();
75974               }
75975           } else {
75976               layer.enabled(null, false);
75977           }
75978           // This timeout ensures that we still call finish() even if
75979           // the user declines to share their location in Firefox
75980           _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
75981       }
75982
75983       function zoomTo() {
75984           var map = context.map();
75985           layer.enabled(_position, true);
75986           map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
75987       }
75988
75989
75990       function success(geolocation) {
75991           _position = geolocation;
75992           var coords = _position.coords;
75993           _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
75994           zoomTo();
75995           finish();
75996       }
75997
75998
75999       function error() {
76000           finish();
76001       }
76002
76003
76004       function finish() {
76005           locating.close();  // unblock ui
76006           if (_timeoutID) { clearTimeout(_timeoutID); }
76007           _timeoutID = undefined;
76008       }
76009
76010
76011       return function(selection) {
76012           if (!navigator.geolocation) return;
76013
76014           selection
76015               .append('button')
76016               .attr('tabindex', -1)
76017               .attr('title', t('geolocate.title'))
76018               .on('click', click)
76019               .call(svgIcon('#iD-icon-geolocate', 'light'))
76020               .call(tooltip()
76021                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
76022       };
76023   }
76024
76025   function uiPanelBackground(context) {
76026       var background = context.background();
76027       var currSourceName = null;
76028       var metadata = {};
76029       var metadataKeys = [
76030           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
76031       ];
76032
76033       var debouncedRedraw = debounce(redraw, 250);
76034
76035       function redraw(selection) {
76036           var source = background.baseLayerSource();
76037           var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
76038
76039           if (currSourceName !== source.name()) {
76040               currSourceName = source.name();
76041               metadata = {};
76042           }
76043
76044           selection.html('');
76045
76046           var list = selection
76047               .append('ul')
76048               .attr('class', 'background-info');
76049
76050           list
76051               .append('li')
76052               .text(currSourceName);
76053
76054           metadataKeys.forEach(function(k) {
76055               // DigitalGlobe vintage is available in raster layers for now.
76056               if (isDG && k === 'vintage') return;
76057
76058               list
76059                   .append('li')
76060                   .attr('class', 'background-info-list-' + k)
76061                   .classed('hide', !metadata[k])
76062                   .text(t('info_panels.background.' + k) + ':')
76063                   .append('span')
76064                   .attr('class', 'background-info-span-' + k)
76065                   .text(metadata[k]);
76066           });
76067
76068           debouncedGetMetadata(selection);
76069
76070           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
76071
76072           selection
76073               .append('a')
76074               .text(t('info_panels.background.' + toggleTiles))
76075               .attr('href', '#')
76076               .attr('class', 'button button-toggle-tiles')
76077               .on('click', function() {
76078                   event.preventDefault();
76079                   context.setDebug('tile', !context.getDebug('tile'));
76080                   selection.call(redraw);
76081               });
76082
76083           if (isDG) {
76084               var key = source.id + '-vintage';
76085               var sourceVintage = context.background().findSource(key);
76086               var showsVintage = context.background().showsLayer(sourceVintage);
76087               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
76088               selection
76089                   .append('a')
76090                   .text(t('info_panels.background.' + toggleVintage))
76091                   .attr('href', '#')
76092                   .attr('class', 'button button-toggle-vintage')
76093                   .on('click', function() {
76094                       event.preventDefault();
76095                       context.background().toggleOverlayLayer(sourceVintage);
76096                       selection.call(redraw);
76097                   });
76098           }
76099
76100           // disable if necessary
76101           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
76102               if (source.id !== layerId) {
76103                   var key = layerId + '-vintage';
76104                   var sourceVintage = context.background().findSource(key);
76105                   if (context.background().showsLayer(sourceVintage)) {
76106                       context.background().toggleOverlayLayer(sourceVintage);
76107                   }
76108               }
76109           });
76110       }
76111
76112
76113       var debouncedGetMetadata = debounce(getMetadata, 250);
76114
76115       function getMetadata(selection) {
76116           var tile = select('.layer-background img.tile-center');   // tile near viewport center
76117           if (tile.empty()) return;
76118
76119           var sourceName = currSourceName,
76120               d = tile.datum(),
76121               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
76122               center = context.map().center();
76123
76124           // update zoom
76125           metadata.zoom = String(zoom);
76126           selection.selectAll('.background-info-list-zoom')
76127               .classed('hide', false)
76128               .selectAll('.background-info-span-zoom')
76129               .text(metadata.zoom);
76130
76131           if (!d || !d.length >= 3) return;
76132
76133           background.baseLayerSource().getMetadata(center, d, function(err, result) {
76134               if (err || currSourceName !== sourceName) return;
76135
76136               // update vintage
76137               var vintage = result.vintage;
76138               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
76139               selection.selectAll('.background-info-list-vintage')
76140                   .classed('hide', false)
76141                   .selectAll('.background-info-span-vintage')
76142                   .text(metadata.vintage);
76143
76144               // update other metdata
76145               without(metadataKeys, 'zoom', 'vintage')
76146                   .forEach(function(k) {
76147                       var val = result[k];
76148                       metadata[k] = val;
76149                       selection.selectAll('.background-info-list-' + k)
76150                           .classed('hide', !val)
76151                           .selectAll('.background-info-span-' + k)
76152                           .text(val);
76153                   });
76154           });
76155       }
76156
76157
76158       var panel = function(selection) {
76159           selection.call(redraw);
76160
76161           context.map()
76162               .on('drawn.info-background', function() {
76163                   selection.call(debouncedRedraw);
76164               })
76165               .on('move.info-background', function() {
76166                   selection.call(debouncedGetMetadata);
76167               });
76168
76169       };
76170
76171       panel.off = function() {
76172           context.map()
76173               .on('drawn.info-background', null)
76174               .on('move.info-background', null);
76175       };
76176
76177       panel.id = 'background';
76178       panel.title = t('info_panels.background.title');
76179       panel.key = t('info_panels.background.key');
76180
76181
76182       return panel;
76183   }
76184
76185   function uiPanelHistory(context) {
76186       var osm;
76187
76188       function displayTimestamp(timestamp) {
76189           if (!timestamp) return t('info_panels.history.unknown');
76190           var detected = utilDetect();
76191           var options = {
76192               day: 'numeric', month: 'short', year: 'numeric',
76193               hour: 'numeric', minute: 'numeric', second: 'numeric'
76194           };
76195           var d = new Date(timestamp);
76196           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
76197           return d.toLocaleString(detected.locale, options);
76198       }
76199
76200
76201       function displayUser(selection, userName) {
76202           if (!userName) {
76203               selection
76204                   .append('span')
76205                   .text(t('info_panels.history.unknown'));
76206               return;
76207           }
76208
76209           selection
76210               .append('span')
76211               .attr('class', 'user-name')
76212               .text(userName);
76213
76214           var links = selection
76215               .append('div')
76216               .attr('class', 'links');
76217
76218           if (osm) {
76219               links
76220                   .append('a')
76221                   .attr('class', 'user-osm-link')
76222                   .attr('href', osm.userURL(userName))
76223                   .attr('target', '_blank')
76224                   .attr('tabindex', -1)
76225                   .text('OSM');
76226           }
76227
76228           links
76229               .append('a')
76230               .attr('class', 'user-hdyc-link')
76231               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
76232               .attr('target', '_blank')
76233               .attr('tabindex', -1)
76234               .text('HDYC');
76235       }
76236
76237
76238       function displayChangeset(selection, changeset) {
76239           if (!changeset) {
76240               selection
76241                   .append('span')
76242                   .text(t('info_panels.history.unknown'));
76243               return;
76244           }
76245
76246           selection
76247               .append('span')
76248               .attr('class', 'changeset-id')
76249               .text(changeset);
76250
76251           var links = selection
76252               .append('div')
76253               .attr('class', 'links');
76254
76255           if (osm) {
76256               links
76257                   .append('a')
76258                   .attr('class', 'changeset-osm-link')
76259                   .attr('href', osm.changesetURL(changeset))
76260                   .attr('target', '_blank')
76261                   .attr('tabindex', -1)
76262                   .text('OSM');
76263           }
76264
76265           links
76266               .append('a')
76267               .attr('class', 'changeset-osmcha-link')
76268               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
76269               .attr('target', '_blank')
76270               .attr('tabindex', -1)
76271               .text('OSMCha');
76272       }
76273
76274
76275       function redraw(selection) {
76276           var selectedNoteID = context.selectedNoteID();
76277           osm = context.connection();
76278
76279           var selected, note, entity;
76280           if (selectedNoteID && osm) {       // selected 1 note
76281               selected = [ t('note.note') + ' ' + selectedNoteID ];
76282               note = osm.getNote(selectedNoteID);
76283           } else {                           // selected 1..n entities
76284               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
76285               if (selected.length) {
76286                   entity = context.entity(selected[0]);
76287               }
76288           }
76289
76290           var singular = selected.length === 1 ? selected[0] : null;
76291
76292           selection.html('');
76293
76294           selection
76295               .append('h4')
76296               .attr('class', 'history-heading')
76297               .text(singular || t('info_panels.history.selected', { n: selected.length }));
76298
76299           if (!singular) return;
76300
76301           if (entity) {
76302               selection.call(redrawEntity, entity);
76303           } else if (note) {
76304               selection.call(redrawNote, note);
76305           }
76306       }
76307
76308
76309       function redrawNote(selection, note) {
76310           if (!note || note.isNew()) {
76311               selection
76312                   .append('div')
76313                   .text(t('info_panels.history.note_no_history'));
76314               return;
76315           }
76316
76317           var list = selection
76318               .append('ul');
76319
76320           list
76321               .append('li')
76322               .text(t('info_panels.history.note_comments') + ':')
76323               .append('span')
76324               .text(note.comments.length);
76325
76326           if (note.comments.length) {
76327               list
76328                   .append('li')
76329                   .text(t('info_panels.history.note_created_date') + ':')
76330                   .append('span')
76331                   .text(displayTimestamp(note.comments[0].date));
76332
76333               list
76334                   .append('li')
76335                   .text(t('info_panels.history.note_created_user') + ':')
76336                   .call(displayUser, note.comments[0].user);
76337           }
76338
76339           if (osm) {
76340               selection
76341                   .append('a')
76342                   .attr('class', 'view-history-on-osm')
76343                   .attr('target', '_blank')
76344                   .attr('tabindex', -1)
76345                   .attr('href', osm.noteURL(note))
76346                   .call(svgIcon('#iD-icon-out-link', 'inline'))
76347                   .append('span')
76348                   .text(t('info_panels.history.note_link_text'));
76349           }
76350       }
76351
76352
76353       function redrawEntity(selection, entity) {
76354           if (!entity || entity.isNew()) {
76355               selection
76356                   .append('div')
76357                   .text(t('info_panels.history.no_history'));
76358               return;
76359           }
76360
76361           var list = selection
76362               .append('ul');
76363
76364           list
76365               .append('li')
76366               .text(t('info_panels.history.version') + ':')
76367               .append('span')
76368               .text(entity.version);
76369
76370           list
76371               .append('li')
76372               .text(t('info_panels.history.last_edit') + ':')
76373               .append('span')
76374               .text(displayTimestamp(entity.timestamp));
76375
76376           list
76377               .append('li')
76378               .text(t('info_panels.history.edited_by') + ':')
76379               .call(displayUser, entity.user);
76380
76381           list
76382               .append('li')
76383               .text(t('info_panels.history.changeset') + ':')
76384               .call(displayChangeset, entity.changeset);
76385
76386           if (osm) {
76387               selection
76388                   .append('a')
76389                   .attr('class', 'view-history-on-osm')
76390                   .attr('target', '_blank')
76391                   .attr('tabindex', -1)
76392                   .attr('href', osm.historyURL(entity))
76393                   .call(svgIcon('#iD-icon-out-link', 'inline'))
76394                   .append('span')
76395                   .text(t('info_panels.history.link_text'));
76396           }
76397       }
76398
76399
76400       var panel = function(selection) {
76401           selection.call(redraw);
76402
76403           context.map()
76404               .on('drawn.info-history', function() {
76405                   selection.call(redraw);
76406               });
76407
76408           context
76409               .on('enter.info-history', function() {
76410                   selection.call(redraw);
76411               });
76412       };
76413
76414       panel.off = function() {
76415           context.map().on('drawn.info-history', null);
76416           context.on('enter.info-history', null);
76417       };
76418
76419       panel.id = 'history';
76420       panel.title = t('info_panels.history.title');
76421       panel.key = t('info_panels.history.key');
76422
76423
76424       return panel;
76425   }
76426
76427   var OSM_PRECISION = 7;
76428   var locale$2 = utilDetect().locale;
76429
76430   /**
76431    * Returns a localized representation of the given length measurement.
76432    *
76433    * @param {Number} m area in meters
76434    * @param {Boolean} isImperial true for U.S. customary units; false for metric
76435    */
76436   function displayLength(m, isImperial) {
76437       var d = m * (isImperial ? 3.28084 : 1);
76438       var unit;
76439
76440       if (isImperial) {
76441           if (d >= 5280) {
76442               d /= 5280;
76443               unit = 'miles';
76444           } else {
76445               unit = 'feet';
76446           }
76447       } else {
76448           if (d >= 1000) {
76449               d /= 1000;
76450               unit = 'kilometers';
76451           } else {
76452               unit = 'meters';
76453           }
76454       }
76455
76456       return t('units.' + unit, {
76457           quantity: d.toLocaleString(locale$2, {
76458               maximumSignificantDigits: 4
76459           })
76460       });
76461   }
76462
76463   /**
76464    * Returns a localized representation of the given area measurement.
76465    *
76466    * @param {Number} m2 area in square meters
76467    * @param {Boolean} isImperial true for U.S. customary units; false for metric
76468    */
76469   function displayArea(m2, isImperial) {
76470       var d = m2 * (isImperial ? 10.7639111056 : 1);
76471       var d1, d2, area;
76472       var unit1 = '';
76473       var unit2 = '';
76474
76475       if (isImperial) {
76476           if (d >= 6969600) { // > 0.25mi² show mi²
76477               d1 = d / 27878400;
76478               unit1 = 'square_miles';
76479           } else {
76480               d1 = d;
76481               unit1 = 'square_feet';
76482           }
76483
76484           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
76485               d2 = d / 43560;
76486               unit2 = 'acres';
76487           }
76488
76489       } else {
76490           if (d >= 250000) { // > 0.25km² show km²
76491               d1 = d / 1000000;
76492               unit1 = 'square_kilometers';
76493           } else {
76494               d1 = d;
76495               unit1 = 'square_meters';
76496           }
76497
76498           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
76499               d2 = d / 10000;
76500               unit2 = 'hectares';
76501           }
76502       }
76503
76504       area = t('units.' + unit1, {
76505           quantity: d1.toLocaleString(locale$2, {
76506               maximumSignificantDigits: 4
76507           })
76508       });
76509
76510       if (d2) {
76511           return t('units.area_pair', {
76512               area1: area,
76513               area2: t('units.' + unit2, {
76514                   quantity: d2.toLocaleString(locale$2, {
76515                       maximumSignificantDigits: 2
76516                   })
76517               })
76518           });
76519       } else {
76520           return area;
76521       }
76522   }
76523
76524   function wrap(x, min, max) {
76525       var d = max - min;
76526       return ((x - min) % d + d) % d + min;
76527   }
76528
76529   function clamp$1(x, min, max) {
76530       return Math.max(min, Math.min(x, max));
76531   }
76532
76533   function displayCoordinate(deg, pos, neg) {
76534       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
76535       var sec = (min - Math.floor(min)) * 60;
76536       var displayDegrees = t('units.arcdegrees', {
76537           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
76538       });
76539       var displayCoordinate;
76540
76541       if (Math.floor(sec) > 0) {
76542           displayCoordinate = displayDegrees +
76543               t('units.arcminutes', {
76544                   quantity: Math.floor(min).toLocaleString(locale$2)
76545               }) +
76546               t('units.arcseconds', {
76547                   quantity: Math.round(sec).toLocaleString(locale$2)
76548               });
76549       } else if (Math.floor(min) > 0) {
76550           displayCoordinate = displayDegrees +
76551               t('units.arcminutes', {
76552                   quantity: Math.round(min).toLocaleString(locale$2)
76553               });
76554       } else {
76555           displayCoordinate = t('units.arcdegrees', {
76556               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
76557           });
76558       }
76559
76560       if (deg === 0) {
76561           return displayCoordinate;
76562       } else {
76563           return t('units.coordinate', {
76564               coordinate: displayCoordinate,
76565               direction: t('units.' + (deg > 0 ? pos : neg))
76566           });
76567       }
76568   }
76569
76570   /**
76571    * Returns given coordinate pair in degree-minute-second format.
76572    *
76573    * @param {Array<Number>} coord longitude and latitude
76574    */
76575   function dmsCoordinatePair(coord) {
76576       return t('units.coordinate_pair', {
76577           latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
76578           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
76579       });
76580   }
76581
76582   /**
76583    * Returns the given coordinate pair in decimal format.
76584    * note: unlocalized to avoid comma ambiguity - see #4765
76585    *
76586    * @param {Array<Number>} coord longitude and latitude
76587    */
76588   function decimalCoordinatePair(coord) {
76589       return t('units.coordinate_pair', {
76590           latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
76591           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
76592       });
76593   }
76594
76595   function uiPanelLocation(context) {
76596       var currLocation = '';
76597
76598
76599       function redraw(selection) {
76600           selection.html('');
76601
76602           var list = selection
76603               .append('ul');
76604
76605           // Mouse coordinates
76606           var coord = context.map().mouseCoordinates();
76607           if (coord.some(isNaN)) {
76608               coord = context.map().center();
76609           }
76610
76611           list
76612               .append('li')
76613               .text(dmsCoordinatePair(coord))
76614               .append('li')
76615               .text(decimalCoordinatePair(coord));
76616
76617           // Location Info
76618           selection
76619               .append('div')
76620               .attr('class', 'location-info')
76621               .text(currLocation || ' ');
76622
76623           debouncedGetLocation(selection, coord);
76624       }
76625
76626
76627       var debouncedGetLocation = debounce(getLocation, 250);
76628       function getLocation(selection, coord) {
76629           if (!services.geocoder) {
76630               currLocation = t('info_panels.location.unknown_location');
76631               selection.selectAll('.location-info')
76632                   .text(currLocation);
76633           } else {
76634               services.geocoder.reverse(coord, function(err, result) {
76635                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
76636                   selection.selectAll('.location-info')
76637                       .text(currLocation);
76638               });
76639           }
76640       }
76641
76642
76643       var panel = function(selection) {
76644           selection.call(redraw);
76645
76646           context.surface()
76647               .on('mousemove.info-location', function() {
76648                   selection.call(redraw);
76649               });
76650       };
76651
76652       panel.off = function() {
76653           context.surface()
76654               .on('mousemove.info-location', null);
76655       };
76656
76657       panel.id = 'location';
76658       panel.title = t('info_panels.location.title');
76659       panel.key = t('info_panels.location.key');
76660
76661
76662       return panel;
76663   }
76664
76665   function uiPanelMeasurement(context) {
76666       var locale = utilDetect().locale,
76667           isImperial = (locale.toLowerCase() === 'en-us');
76668
76669
76670       function radiansToMeters(r) {
76671           // using WGS84 authalic radius (6371007.1809 m)
76672           return r * 6371007.1809;
76673       }
76674
76675       function steradiansToSqmeters(r) {
76676           // http://gis.stackexchange.com/a/124857/40446
76677           return r / (4 * Math.PI) * 510065621724000;
76678       }
76679
76680
76681       function toLineString(feature) {
76682           if (feature.type === 'LineString') return feature;
76683
76684           var result = { type: 'LineString', coordinates: [] };
76685           if (feature.type === 'Polygon') {
76686               result.coordinates = feature.coordinates[0];
76687           } else if (feature.type === 'MultiPolygon') {
76688               result.coordinates = feature.coordinates[0][0];
76689           }
76690
76691           return result;
76692       }
76693
76694
76695       function nodeCount(feature) {
76696         if (feature.type === 'LineString') return feature.coordinates.length;
76697         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
76698       }
76699
76700
76701       function redraw(selection) {
76702           var resolver = context.graph();
76703           var selectedNoteID = context.selectedNoteID();
76704           var osm = services.osm;
76705
76706           var selected, center, entity, note, geometry;
76707
76708           if (selectedNoteID && osm) {       // selected 1 note
76709               selected = [ t('note.note') + ' ' + selectedNoteID ];
76710               note = osm.getNote(selectedNoteID);
76711               center = note.loc;
76712               geometry = 'note';
76713
76714           } else {                           // selected 1..n entities
76715               var extent = geoExtent();
76716               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
76717               if (selected.length) {
76718                   for (var i = 0; i < selected.length; i++) {
76719                       entity = context.entity(selected[i]);
76720                       extent._extend(entity.extent(resolver));
76721                   }
76722                   center = extent.center();
76723                   geometry = entity.geometry(resolver);
76724               }
76725           }
76726
76727           var singular = selected.length === 1 ? selected[0] : null;
76728
76729           selection.html('');
76730
76731           selection
76732               .append('h4')
76733               .attr('class', 'measurement-heading')
76734               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
76735
76736           if (!selected.length) return;
76737
76738
76739           var list = selection
76740               .append('ul');
76741           var coordItem;
76742
76743           // multiple selected features, just display extent center..
76744           if (!singular) {
76745               coordItem = list
76746                   .append('li')
76747                   .text(t('info_panels.measurement.center') + ':');
76748               coordItem.append('span')
76749                   .text(dmsCoordinatePair(center));
76750               coordItem.append('span')
76751                   .text(decimalCoordinatePair(center));
76752               return;
76753           }
76754
76755           // single selected feature, display details..
76756           if (geometry === 'line' || geometry === 'area') {
76757               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
76758               var feature = entity.asGeoJSON(resolver);
76759               var length = radiansToMeters(length$1(toLineString(feature)));
76760               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
76761               var centroid = d3_geoCentroid(feature);
76762
76763               list
76764                   .append('li')
76765                   .text(t('info_panels.measurement.geometry') + ':')
76766                   .append('span')
76767                   .text(
76768                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
76769                   );
76770
76771               if (entity.type !== 'relation') {
76772                   list
76773                       .append('li')
76774                       .text(t('info_panels.measurement.node_count') + ':')
76775                       .append('span')
76776                       .text(nodeCount(feature).toLocaleString(locale));
76777               }
76778
76779               if (closed) {
76780                   var area = steradiansToSqmeters(entity.area(resolver));
76781                   list
76782                       .append('li')
76783                       .text(t('info_panels.measurement.area') + ':')
76784                       .append('span')
76785                       .text(displayArea(area, isImperial));
76786               }
76787
76788
76789               list
76790                   .append('li')
76791                   .text(lengthLabel + ':')
76792                   .append('span')
76793                   .text(displayLength(length, isImperial));
76794
76795               coordItem = list
76796                   .append('li')
76797                   .text(t('info_panels.measurement.centroid') + ':');
76798               coordItem.append('span')
76799                   .text(dmsCoordinatePair(centroid));
76800               coordItem.append('span')
76801                   .text(decimalCoordinatePair(centroid));
76802
76803               var toggle  = isImperial ? 'imperial' : 'metric';
76804
76805               selection
76806                   .append('a')
76807                   .text(t('info_panels.measurement.' + toggle))
76808                   .attr('href', '#')
76809                   .attr('class', 'button button-toggle-units')
76810                   .on('click', function() {
76811                       event.preventDefault();
76812                       isImperial = !isImperial;
76813                       selection.call(redraw);
76814                   });
76815
76816           } else {
76817               var centerLabel = t('info_panels.measurement.' +
76818                   (note || entity.type === 'node' ? 'location' : 'center'));
76819
76820               list
76821                   .append('li')
76822                   .text(t('info_panels.measurement.geometry') + ':')
76823                   .append('span')
76824                   .text(t('geometry.' + geometry));
76825
76826               coordItem = list
76827                   .append('li')
76828                   .text(centerLabel + ':');
76829               coordItem.append('span')
76830                   .text(dmsCoordinatePair(center));
76831               coordItem.append('span')
76832                   .text(decimalCoordinatePair(center));
76833           }
76834       }
76835
76836
76837       var panel = function(selection) {
76838           selection.call(redraw);
76839
76840           context.map()
76841               .on('drawn.info-measurement', function() {
76842                   selection.call(redraw);
76843               });
76844
76845           context
76846               .on('enter.info-measurement', function() {
76847                   selection.call(redraw);
76848               });
76849       };
76850
76851       panel.off = function() {
76852           context.map().on('drawn.info-measurement', null);
76853           context.on('enter.info-measurement', null);
76854       };
76855
76856       panel.id = 'measurement';
76857       panel.title = t('info_panels.measurement.title');
76858       panel.key = t('info_panels.measurement.key');
76859
76860
76861       return panel;
76862   }
76863
76864   var uiInfoPanels = {
76865       background: uiPanelBackground,
76866       history: uiPanelHistory,
76867       location: uiPanelLocation,
76868       measurement: uiPanelMeasurement,
76869   };
76870
76871   function uiInfo(context) {
76872       var ids = Object.keys(uiInfoPanels);
76873       var wasActive = ['measurement'];
76874       var panels = {};
76875       var active = {};
76876
76877       // create panels
76878       ids.forEach(function(k) {
76879           if (!panels[k]) {
76880               panels[k] = uiInfoPanels[k](context);
76881               active[k] = false;
76882           }
76883       });
76884
76885
76886       function info(selection) {
76887
76888           function redraw() {
76889               var activeids = ids.filter(function(k) { return active[k]; }).sort();
76890
76891               var containers = infoPanels.selectAll('.panel-container')
76892                   .data(activeids, function(k) { return k; });
76893
76894               containers.exit()
76895                   .style('opacity', 1)
76896                   .transition()
76897                   .duration(200)
76898                   .style('opacity', 0)
76899                   .on('end', function(d) {
76900                       select(this)
76901                           .call(panels[d].off)
76902                           .remove();
76903                   });
76904
76905               var enter = containers.enter()
76906                   .append('div')
76907                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
76908
76909               enter
76910                   .style('opacity', 0)
76911                   .transition()
76912                   .duration(200)
76913                   .style('opacity', 1);
76914
76915               var title = enter
76916                   .append('div')
76917                   .attr('class', 'panel-title fillD2');
76918
76919               title
76920                   .append('h3')
76921                   .text(function(d) { return panels[d].title; });
76922
76923               title
76924                   .append('button')
76925                   .attr('class', 'close')
76926                   .on('click', function (d) { toggle(d); })
76927                   .call(svgIcon('#iD-icon-close'));
76928
76929               enter
76930                   .append('div')
76931                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
76932
76933
76934               // redraw the panels
76935               infoPanels.selectAll('.panel-content')
76936                   .each(function(d) {
76937                       select(this).call(panels[d]);
76938                   });
76939           }
76940
76941
76942           function toggle(which) {
76943               if (event) {
76944                   event.stopImmediatePropagation();
76945                   event.preventDefault();
76946               }
76947
76948               var activeids = ids.filter(function(k) { return active[k]; });
76949
76950               if (which) {  // toggle one
76951                   active[which] = !active[which];
76952                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
76953                       wasActive = [which];
76954                   }
76955               } else {      // toggle all
76956                   if (activeids.length) {
76957                       wasActive = activeids;
76958                       activeids.forEach(function(k) { active[k] = false; });
76959                   } else {
76960                       wasActive.forEach(function(k) { active[k] = true; });
76961                   }
76962               }
76963
76964               redraw();
76965           }
76966
76967
76968           var infoPanels = selection.selectAll('.info-panels')
76969               .data([0]);
76970
76971           infoPanels = infoPanels.enter()
76972               .append('div')
76973               .attr('class', 'info-panels')
76974               .merge(infoPanels);
76975
76976           redraw();
76977
76978           context.keybinding()
76979               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
76980
76981           ids.forEach(function(k) {
76982               var key = t('info_panels.' + k + '.key', { default: null });
76983               if (!key) return;
76984               context.keybinding()
76985                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
76986           });
76987       }
76988
76989       return info;
76990   }
76991
76992   function uiModes(context) {
76993       var modes = [
76994           modeAddPoint(context),
76995           modeAddLine(context),
76996           modeAddArea(context),
76997           modeAddNote(context)
76998       ];
76999
77000
77001       function enabled(d) {
77002           if (d.id === 'add-note') {
77003               return notesEnabled() && notesEditable();
77004           } else {
77005               return osmEditable();
77006           }
77007       }
77008
77009       function osmEditable() {
77010           var mode = context.mode();
77011           return context.editable() && mode && mode.id !== 'save';
77012       }
77013
77014       function notesEnabled() {
77015           var noteLayer = context.layers().layer('notes');
77016           return noteLayer && noteLayer.enabled();
77017       }
77018
77019       function notesEditable() {
77020           var mode = context.mode();
77021           return context.map().notesEditable() && mode && mode.id !== 'save';
77022       }
77023
77024
77025       return function(selection) {
77026           context
77027               .on('enter.editor', function(entered) {
77028                   selection.selectAll('button.add-button')
77029                       .classed('active', function(mode) { return entered.button === mode.button; });
77030                   context.container()
77031                       .classed('mode-' + entered.id, true);
77032               });
77033
77034           context
77035               .on('exit.editor', function(exited) {
77036                   context.container()
77037                       .classed('mode-' + exited.id, false);
77038               });
77039
77040           modes.forEach(function(mode) {
77041               context.keybinding().on(mode.key, function() {
77042                   if (!enabled(mode)) return;
77043
77044                   if (mode.id === context.mode().id) {
77045                       context.enter(modeBrowse(context));
77046                   } else {
77047                       context.enter(mode);
77048                   }
77049               });
77050           });
77051
77052
77053           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
77054
77055           context.map()
77056               .on('move.modes', debouncedUpdate)
77057               .on('drawn.modes', debouncedUpdate);
77058
77059           context
77060               .on('enter.modes', update);
77061
77062           update();
77063
77064
77065           function update() {
77066               var showNotes = notesEnabled();
77067               var data = showNotes ? modes : modes.slice(0, 3);
77068
77069               var buttons = selection.selectAll('button.add-button')
77070                   .data(data, function(d) { return d.id; });
77071
77072               // exit
77073               buttons.exit()
77074                   .remove();
77075
77076               // enter
77077               var buttonsEnter = buttons.enter()
77078                   .append('button')
77079                   .attr('tabindex', -1)
77080                   .attr('class', function(d) { return d.id + ' add-button'; })
77081                   .on('click.mode-buttons', function(d) {
77082                       if (!enabled(d)) return;
77083
77084                       // When drawing, ignore accidental clicks on mode buttons - #4042
77085                       var currMode = context.mode().id;
77086                       if (/^draw/.test(currMode)) return;
77087
77088                       if (d.id === currMode) {
77089                           context.enter(modeBrowse(context));
77090                       } else {
77091                           context.enter(d);
77092                       }
77093                   })
77094                   .call(tooltip()
77095                       .placement('bottom')
77096                       .html(true)
77097                       .title(function(d) { return uiTooltipHtml(d.description, d.key); })
77098                   );
77099
77100               buttonsEnter
77101                   .each(function(d) {
77102                       select(this)
77103                           .call(svgIcon('#iD-icon-' + d.button));
77104                   });
77105
77106               buttonsEnter
77107                   .append('span')
77108                   .attr('class', 'label')
77109                   .text(function(mode) { return mode.title; });
77110
77111               // if we are adding/removing the buttons, check if toolbar has overflowed
77112               if (buttons.enter().size() || buttons.exit().size()) {
77113                   context.ui().checkOverflow('#bar', true);
77114               }
77115
77116               // update
77117               buttons = buttons
77118                   .merge(buttonsEnter)
77119                   .classed('disabled', function(d) { return !enabled(d); });
77120           }
77121       };
77122   }
77123
77124   function uiNotice(context) {
77125
77126       return function(selection) {
77127           var div = selection
77128               .append('div')
77129               .attr('class', 'notice');
77130
77131           var button = div
77132               .append('button')
77133               .attr('class', 'zoom-to notice fillD')
77134               .on('click', function() {
77135                   context.map().zoomEase(context.minEditableZoom());
77136               })
77137               .on('wheel', function() {   // let wheel events pass through #4482
77138                   var e2 = new WheelEvent(event.type, event);
77139                   context.surface().node().dispatchEvent(e2);
77140               });
77141
77142           button
77143               .call(svgIcon('#iD-icon-plus', 'pre-text'))
77144               .append('span')
77145               .attr('class', 'label')
77146               .text(t('zoom_in_edit'));
77147
77148
77149           function disableTooHigh() {
77150               var canEdit = context.map().zoom() >= context.minEditableZoom();
77151               div.style('display', canEdit ? 'none' : 'block');
77152           }
77153
77154           context.map()
77155               .on('move.notice', debounce(disableTooHigh, 500));
77156
77157           disableTooHigh();
77158       };
77159   }
77160
77161   function uiPhotoviewer(context) {
77162
77163       var dispatch$1 = dispatch('resize');
77164
77165       function photoviewer(selection) {
77166           selection
77167               .append('button')
77168               .attr('class', 'thumb-hide')
77169               .on('click', function () {
77170                   if (services.streetside) { services.streetside.hideViewer(); }
77171                   if (services.mapillary) { services.mapillary.hideViewer(); }
77172                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
77173               })
77174               .append('div')
77175               .call(svgIcon('#iD-icon-close'));
77176
77177           selection
77178               .append('button')
77179               .attr('class', 'resize-handle-xy')
77180               .on(
77181                   'mousedown',
77182                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
77183               );
77184
77185           selection
77186               .append('button')
77187               .attr('class', 'resize-handle-x')
77188               .on(
77189                   'mousedown',
77190                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
77191               );
77192
77193           selection
77194               .append('button')
77195               .attr('class', 'resize-handle-y')
77196               .on(
77197                   'mousedown',
77198                   buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
77199               );
77200
77201
77202           function buildResizeListener(target, eventName, dispatch, options) {
77203               var resizeOnX = !!options.resizeOnX;
77204               var resizeOnY = !!options.resizeOnY;
77205               var minHeight = options.minHeight || 240;
77206               var minWidth = options.minWidth || 320;
77207               var startX;
77208               var startY;
77209               var startWidth;
77210               var startHeight;
77211
77212               function startResize() {
77213                   var mapSize = context.map().dimensions();
77214
77215                   if (resizeOnX) {
77216                       var maxWidth = mapSize[0];
77217                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
77218                       target.style('width', newWidth + 'px');
77219                   }
77220
77221                   if (resizeOnY) {
77222                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
77223                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
77224                       target.style('height', newHeight + 'px');
77225                   }
77226
77227                   dispatch.call(eventName, target, utilGetDimensions(target, true));
77228               }
77229
77230               function clamp(num, min, max) {
77231                   return Math.max(min, Math.min(num, max));
77232               }
77233
77234               function stopResize() {
77235                   select(window)
77236                       .on('.' + eventName, null);
77237               }
77238
77239               return function initResize() {
77240                   startX = event.clientX;
77241                   startY = event.clientY;
77242                   startWidth = target.node().getBoundingClientRect().width;
77243                   startHeight = target.node().getBoundingClientRect().height;
77244
77245                   select(window)
77246                       .on('mousemove.' + eventName, startResize, false)
77247                       .on('mouseup.' + eventName, stopResize, false);
77248               };
77249           }
77250       }
77251
77252       photoviewer.onMapResize = function() {
77253           var photoviewer = select('#photoviewer');
77254           var content = select('#content');
77255           var mapDimensions = utilGetDimensions(content, true);
77256           // shrink photo viewer if it is too big
77257           // (-90 preserves space at top and bottom of map used by menus)
77258           var photoDimensions = utilGetDimensions(photoviewer, true);
77259           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
77260               var setPhotoDimensions = [
77261                   Math.min(photoDimensions[0], mapDimensions[0]),
77262                   Math.min(photoDimensions[1], mapDimensions[1] - 90),
77263               ];
77264
77265               photoviewer
77266                   .style('width', setPhotoDimensions[0] + 'px')
77267                   .style('height', setPhotoDimensions[1] + 'px');
77268
77269               dispatch$1.call('resize', photoviewer, setPhotoDimensions);
77270           }
77271       };
77272
77273       return utilRebind(photoviewer, dispatch$1, 'on');
77274   }
77275
77276   function uiRestore(context) {
77277
77278       return function(selection) {
77279           if (!context.history().lock() || !context.history().restorableChanges())
77280               return;
77281
77282           var modalSelection = uiModal(selection, true);
77283
77284           modalSelection.select('.modal')
77285               .attr('class', 'modal fillL col6');
77286
77287           var introModal = modalSelection.select('.content');
77288
77289           introModal
77290               .attr('class','cf');
77291
77292           introModal
77293               .append('div')
77294               .attr('class', 'modal-section')
77295               .append('h3')
77296               .text(t('restore.heading'));
77297
77298           introModal
77299               .append('div')
77300               .attr('class','modal-section')
77301               .append('p')
77302               .text(t('restore.description'));
77303
77304           var buttonWrap = introModal
77305               .append('div')
77306               .attr('class', 'modal-actions cf');
77307
77308           var restore = buttonWrap
77309               .append('button')
77310               .attr('class', 'restore col6')
77311               .on('click', function() {
77312                   context.history().restore();
77313                   modalSelection.remove();
77314               });
77315
77316           restore
77317               .append('svg')
77318               .attr('class', 'logo logo-restore')
77319               .append('use')
77320               .attr('xlink:href', '#iD-logo-restore');
77321
77322           restore
77323               .append('div')
77324               .text(t('restore.restore'));
77325
77326           var reset = buttonWrap
77327               .append('button')
77328               .attr('class', 'reset col6')
77329               .on('click', function() {
77330                   context.history().clearSaved();
77331                   modalSelection.remove();
77332               });
77333
77334           reset
77335               .append('svg')
77336               .attr('class', 'logo logo-reset')
77337               .append('use')
77338               .attr('xlink:href', '#iD-logo-reset');
77339
77340           reset
77341               .append('div')
77342               .text(t('restore.reset'));
77343
77344           restore.node().focus();
77345       };
77346   }
77347
77348   function uiSave(context) {
77349       var history = context.history();
77350       var key = uiCmd('⌘S');
77351       var _numChanges = 0;
77352
77353
77354       return function(selection) {
77355
77356
77357           function isSaving() {
77358               var mode = context.mode();
77359               return mode && mode.id === 'save';
77360           }
77361
77362
77363           function isDisabled() {
77364               return _numChanges === 0 || isSaving();
77365           }
77366
77367
77368           function save() {
77369               event.preventDefault();
77370               if (!context.inIntro() && !isSaving() && history.hasChanges()) {
77371                   context.enter(modeSave(context));
77372               }
77373           }
77374
77375
77376           function bgColor() {
77377               var step;
77378               if (_numChanges === 0) {
77379                   return null;
77380               } else if (_numChanges <= 50) {
77381                   step = _numChanges / 50;
77382                   return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
77383               } else {
77384                   step = Math.min((_numChanges - 50) / 50, 1.0);
77385                   return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
77386               }
77387           }
77388
77389
77390           function updateCount() {
77391               var val = history.difference().summary().length;
77392               if (val === _numChanges) return;
77393               _numChanges = val;
77394
77395               tooltipBehavior
77396                   .title(uiTooltipHtml(
77397                       t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
77398                   );
77399
77400               button
77401                   .classed('disabled', isDisabled())
77402                   .style('background', bgColor(_numChanges));
77403
77404               button.select('span.count')
77405                   .text(_numChanges);
77406           }
77407
77408
77409           var tooltipBehavior = tooltip()
77410               .placement('bottom')
77411               .html(true)
77412               .title(uiTooltipHtml(t('save.no_changes'), key));
77413
77414           var button = selection
77415               .append('button')
77416               .attr('class', 'save disabled')
77417               .attr('tabindex', -1)
77418               .on('click', save)
77419               .call(tooltipBehavior);
77420
77421           button
77422               .call(svgIcon('#iD-icon-save'));
77423
77424           button
77425               .append('span')
77426               .attr('class', 'label')
77427               .text(t('save.title'));
77428
77429           button
77430               .append('span')
77431               .attr('class', 'count')
77432               .text('0');
77433
77434           updateCount();
77435
77436
77437           context.keybinding()
77438               .on(key, save, true);
77439
77440           context.history()
77441               .on('change.save', updateCount);
77442
77443           context
77444               .on('enter.save', function() {
77445                   button
77446                       .classed('disabled', isDisabled());
77447
77448                   if (isSaving()) {
77449                       button.call(tooltipBehavior.hide);
77450                   }
77451               });
77452       };
77453   }
77454
77455   function uiScale(context) {
77456       var projection = context.projection,
77457           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
77458           maxLength = 180,
77459           tickHeight = 8;
77460
77461
77462       function scaleDefs(loc1, loc2) {
77463           var lat = (loc2[1] + loc1[1]) / 2,
77464               conversion = (isImperial ? 3.28084 : 1),
77465               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
77466               scale = { dist: 0, px: 0, text: '' },
77467               buckets, i, val, dLon;
77468
77469           if (isImperial) {
77470               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
77471           } else {
77472               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
77473           }
77474
77475           // determine a user-friendly endpoint for the scale
77476           for (i = 0; i < buckets.length; i++) {
77477               val = buckets[i];
77478               if (dist >= val) {
77479                   scale.dist = Math.floor(dist / val) * val;
77480                   break;
77481               } else {
77482                   scale.dist = +dist.toFixed(2);
77483               }
77484           }
77485
77486           dLon = geoMetersToLon(scale.dist / conversion, lat);
77487           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
77488
77489           scale.text = displayLength(scale.dist / conversion, isImperial);
77490
77491           return scale;
77492       }
77493
77494
77495       function update(selection) {
77496           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
77497           var dims = context.map().dimensions(),
77498               loc1 = projection.invert([0, dims[1]]),
77499               loc2 = projection.invert([maxLength, dims[1]]),
77500               scale = scaleDefs(loc1, loc2);
77501
77502           selection.select('#scale-path')
77503               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
77504
77505           selection.select('#scale-textgroup')
77506               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
77507
77508           selection.select('#scale-text')
77509               .text(scale.text);
77510       }
77511
77512
77513       return function(selection) {
77514           function switchUnits() {
77515               isImperial = !isImperial;
77516               selection.call(update);
77517           }
77518
77519           var scalegroup = selection.append('svg')
77520               .attr('id', 'scale')
77521               .on('click', switchUnits)
77522               .append('g')
77523               .attr('transform', 'translate(10,11)');
77524
77525           scalegroup
77526               .append('path')
77527               .attr('id', 'scale-path');
77528
77529           scalegroup
77530               .append('g')
77531               .attr('id', 'scale-textgroup')
77532               .append('text')
77533               .attr('id', 'scale-text');
77534
77535           selection.call(update);
77536
77537           context.map().on('move.scale', function() {
77538               update(selection);
77539           });
77540       };
77541   }
77542
77543   function uiSidebar(context) {
77544       var inspector = uiInspector(context);
77545       var dataEditor = uiDataEditor(context);
77546       var noteEditor = uiNoteEditor(context);
77547       var improveOsmEditor = uiImproveOsmEditor(context);
77548       var keepRightEditor = uiKeepRightEditor(context);
77549       var _current;
77550       var _wasData = false;
77551       var _wasNote = false;
77552       var _wasQAError = false;
77553
77554
77555       function sidebar(selection) {
77556           var container = select('#id-container');
77557           var minWidth = 280;
77558           var sidebarWidth;
77559           var containerWidth;
77560           var dragOffset;
77561
77562           var resizer = selection
77563               .append('div')
77564               .attr('id', 'sidebar-resizer');
77565
77566           // Set the initial width constraints
77567           selection
77568               .style('min-width', minWidth + 'px')
77569               .style('max-width', '400px')
77570               .style('width', '33.3333%');
77571
77572           resizer.call(d3_drag()
77573               .container(container.node())
77574               .on('start', function() {
77575                   // offset from edge of sidebar-resizer
77576                   dragOffset = event.sourceEvent.offsetX - 1;
77577
77578                   sidebarWidth = selection.node().getBoundingClientRect().width;
77579                   containerWidth = container.node().getBoundingClientRect().width;
77580                   var widthPct = (sidebarWidth / containerWidth) * 100;
77581                   selection
77582                       .style('width', widthPct + '%')    // lock in current width
77583                       .style('max-width', '85%');        // but allow larger widths
77584
77585                   resizer.classed('dragging', true);
77586               })
77587               .on('drag', function() {
77588                   var isRTL = (textDirection === 'rtl');
77589                   var scaleX = isRTL ? 0 : 1;
77590                   var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
77591
77592                   var x = event.x - dragOffset;
77593                   sidebarWidth = isRTL ? containerWidth - x : x;
77594
77595                   var isCollapsed = selection.classed('collapsed');
77596                   var shouldCollapse = sidebarWidth < minWidth;
77597
77598                   selection.classed('collapsed', shouldCollapse);
77599
77600                   if (shouldCollapse) {
77601                       if (!isCollapsed) {
77602                           selection
77603                               .style(xMarginProperty, '-400px')
77604                               .style('width', '400px');
77605
77606                           context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
77607                       }
77608
77609                   } else {
77610                       var widthPct = (sidebarWidth / containerWidth) * 100;
77611                       selection
77612                           .style(xMarginProperty, null)
77613                           .style('width', widthPct + '%');
77614
77615                       if (isCollapsed) {
77616                           context.ui().onResize([-sidebarWidth * scaleX, 0]);
77617                       } else {
77618                           context.ui().onResize([-event.dx * scaleX, 0]);
77619                       }
77620                   }
77621               })
77622               .on('end', function() {
77623                   resizer.classed('dragging', false);
77624               })
77625           );
77626
77627           var featureListWrap = selection
77628               .append('div')
77629               .attr('class', 'feature-list-pane')
77630               .call(uiFeatureList(context));
77631
77632           var inspectorWrap = selection
77633               .append('div')
77634               .attr('class', 'inspector-hidden inspector-wrap fr');
77635
77636
77637           function hover(datum) {
77638               if (datum && datum.__featurehash__) {   // hovering on data
77639                   _wasData = true;
77640                   sidebar
77641                       .show(dataEditor.datum(datum));
77642
77643                   selection.selectAll('.sidebar-component')
77644                       .classed('inspector-hover', true);
77645
77646               } else if (datum instanceof osmNote) {
77647                   if (context.mode().id === 'drag-note') return;
77648                   _wasNote = true;
77649
77650                   var osm = services.osm;
77651                   if (osm) {
77652                       datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
77653                   }
77654
77655                   sidebar
77656                       .show(noteEditor.note(datum));
77657
77658                   selection.selectAll('.sidebar-component')
77659                       .classed('inspector-hover', true);
77660
77661               } else if (datum instanceof qaError) {
77662                   _wasQAError = true;
77663
77664                   var errService = services[datum.service];
77665                   if (errService) {
77666                       // marker may contain stale data - get latest
77667                       datum = errService.getError(datum.id);
77668                   }
77669
77670                   // Temporary solution while only two services
77671                   var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
77672
77673                   d3_selectAll('.qa_error.' + datum.service)
77674                       .classed('hover', function(d) { return d.id === datum.id; });
77675
77676                   sidebar
77677                       .show(errEditor.error(datum));
77678
77679                   selection.selectAll('.sidebar-component')
77680                       .classed('inspector-hover', true);
77681
77682               } else if (!_current && (datum instanceof osmEntity)) {
77683                   featureListWrap
77684                       .classed('inspector-hidden', true);
77685
77686                   inspectorWrap
77687                       .classed('inspector-hidden', false)
77688                       .classed('inspector-hover', true);
77689
77690                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
77691                       inspector
77692                           .state('hover')
77693                           .entityID(datum.id);
77694
77695                       inspectorWrap
77696                           .call(inspector);
77697                   }
77698
77699               } else if (!_current) {
77700                   featureListWrap
77701                       .classed('inspector-hidden', false);
77702                   inspectorWrap
77703                       .classed('inspector-hidden', true);
77704                   inspector
77705                       .state('hide');
77706
77707               } else if (_wasData || _wasNote || _wasQAError) {
77708                   _wasNote = false;
77709                   _wasData = false;
77710                   _wasQAError = false;
77711                   d3_selectAll('.note').classed('hover', false);
77712                   d3_selectAll('.qa_error').classed('hover', false);
77713                   sidebar.hide();
77714               }
77715           }
77716
77717           sidebar.hover = throttle(hover, 200);
77718
77719
77720           sidebar.intersects = function(extent) {
77721               var rect = selection.node().getBoundingClientRect();
77722               return extent.intersects([
77723                   context.projection.invert([0, rect.height]),
77724                   context.projection.invert([rect.width, 0])
77725               ]);
77726           };
77727
77728
77729           sidebar.select = function(id, newFeature) {
77730               sidebar.hide();
77731
77732               if (id) {
77733                   var entity = context.entity(id);
77734                   // uncollapse the sidebar
77735                   if (selection.classed('collapsed')) {
77736                       var extent = entity.extent(context.graph());
77737                       sidebar.expand(sidebar.intersects(extent));
77738                   }
77739
77740                   featureListWrap
77741                       .classed('inspector-hidden', true);
77742
77743                   inspectorWrap
77744                       .classed('inspector-hidden', false)
77745                       .classed('inspector-hover', false);
77746
77747                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
77748                       inspector
77749                           .state('select')
77750                           .entityID(id)
77751                           .newFeature(newFeature);
77752
77753                       inspectorWrap
77754                           .call(inspector, newFeature);
77755                   }
77756
77757                   sidebar.showPresetList = function() {
77758                       inspector.showList(context.presets().match(entity, context.graph()));
77759                   };
77760
77761               } else {
77762                   inspector
77763                       .state('hide');
77764               }
77765           };
77766
77767
77768           sidebar.show = function(component, element) {
77769               featureListWrap
77770                   .classed('inspector-hidden', true);
77771               inspectorWrap
77772                   .classed('inspector-hidden', true);
77773
77774               if (_current) _current.remove();
77775               _current = selection
77776                   .append('div')
77777                   .attr('class', 'sidebar-component')
77778                   .call(component, element);
77779           };
77780
77781
77782           sidebar.hide = function() {
77783               featureListWrap
77784                   .classed('inspector-hidden', false);
77785               inspectorWrap
77786                   .classed('inspector-hidden', true);
77787
77788               if (_current) _current.remove();
77789               _current = null;
77790           };
77791
77792
77793           sidebar.expand = function(moveMap) {
77794               if (selection.classed('collapsed')) {
77795                   sidebar.toggle(moveMap);
77796               }
77797           };
77798
77799
77800           sidebar.collapse = function(moveMap) {
77801               if (!selection.classed('collapsed')) {
77802                   sidebar.toggle(moveMap);
77803               }
77804           };
77805
77806
77807           sidebar.toggle = function(moveMap) {
77808               var e = event;
77809               if (e && e.sourceEvent) {
77810                   e.sourceEvent.preventDefault();
77811               } else if (e) {
77812                   e.preventDefault();
77813               }
77814
77815               // Don't allow sidebar to toggle when the user is in the walkthrough.
77816               if (context.inIntro()) return;
77817
77818               var isCollapsed = selection.classed('collapsed');
77819               var isCollapsing = !isCollapsed;
77820               var isRTL = (textDirection === 'rtl');
77821               var scaleX = isRTL ? 0 : 1;
77822               var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
77823
77824               sidebarWidth = selection.node().getBoundingClientRect().width;
77825
77826               // switch from % to px
77827               selection.style('width', sidebarWidth + 'px');
77828
77829               var startMargin, endMargin, lastMargin;
77830               if (isCollapsing) {
77831                   startMargin = lastMargin = 0;
77832                   endMargin = -sidebarWidth;
77833               } else {
77834                   startMargin = lastMargin = -sidebarWidth;
77835                   endMargin = 0;
77836               }
77837
77838               selection.transition()
77839                   .style(xMarginProperty, endMargin + 'px')
77840                   .tween('panner', function() {
77841                       var i = interpolateNumber(startMargin, endMargin);
77842                       return function(t) {
77843                           var dx = lastMargin - Math.round(i(t));
77844                           lastMargin = lastMargin - dx;
77845                           context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
77846                       };
77847                   })
77848                   .on('end', function() {
77849                       selection.classed('collapsed', isCollapsing);
77850
77851                       // switch back from px to %
77852                       if (!isCollapsing) {
77853                           var containerWidth = container.node().getBoundingClientRect().width;
77854                           var widthPct = (sidebarWidth / containerWidth) * 100;
77855                           selection
77856                               .style(xMarginProperty, null)
77857                               .style('width', widthPct + '%');
77858                       }
77859                   });
77860           };
77861
77862           // toggle the sidebar collapse when double-clicking the resizer
77863           resizer.on('dblclick', sidebar.toggle);
77864       }
77865
77866       sidebar.showPresetList = function() {};
77867       sidebar.hover = function() {};
77868       sidebar.hover.cancel = function() {};
77869       sidebar.intersects = function() {};
77870       sidebar.select = function() {};
77871       sidebar.show = function() {};
77872       sidebar.hide = function() {};
77873       sidebar.expand = function() {};
77874       sidebar.collapse = function() {};
77875       sidebar.toggle = function() {};
77876
77877       return sidebar;
77878   }
77879
77880   function uiSpinner(context) {
77881       var osm = context.connection();
77882
77883
77884       return function(selection) {
77885           var img = selection
77886               .append('img')
77887               .attr('src', context.imagePath('loader-black.gif'))
77888               .style('opacity', 0);
77889
77890           if (osm) {
77891               osm
77892                   .on('loading.spinner', function() {
77893                       img.transition()
77894                           .style('opacity', 1);
77895                   })
77896                   .on('loaded.spinner', function() {
77897                       img.transition()
77898                           .style('opacity', 0);
77899                   });
77900           }
77901       };
77902   }
77903
77904   function uiSplash(context) {
77905
77906       return function(selection) {
77907           if (context.storage('sawSplash'))
77908                return;
77909
77910           context.storage('sawSplash', true);
77911
77912           var modalSelection = uiModal(selection);
77913
77914           modalSelection.select('.modal')
77915               .attr('class', 'modal-splash modal col6');
77916
77917           var introModal = modalSelection.select('.content')
77918               .append('div')
77919               .attr('class', 'fillL');
77920
77921           introModal
77922               .append('div')
77923               .attr('class','modal-section cf')
77924               .append('h3').text(t('splash.welcome'));
77925
77926           introModal
77927               .append('div')
77928               .attr('class','modal-section')
77929               .append('p')
77930               .html(t('splash.text', {
77931                   version: context.version,
77932                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
77933                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
77934               }));
77935
77936           var buttonWrap = introModal
77937               .append('div')
77938               .attr('class', 'modal-actions cf');
77939
77940           var walkthrough = buttonWrap
77941               .append('button')
77942               .attr('class', 'walkthrough col6')
77943               .on('click', function() {
77944                   context.container().call(uiIntro(context));
77945                   modalSelection.close();
77946               });
77947
77948           walkthrough
77949               .append('svg')
77950               .attr('class', 'logo logo-walkthrough')
77951               .append('use')
77952               .attr('xlink:href', '#iD-logo-walkthrough');
77953
77954           walkthrough
77955               .append('div')
77956               .text(t('splash.walkthrough'));
77957
77958           var startEditing = buttonWrap
77959               .append('button')
77960               .attr('class', 'start-editing col6')
77961               .on('click', modalSelection.close);
77962
77963           startEditing
77964               .append('svg')
77965               .attr('class', 'logo logo-features')
77966               .append('use')
77967               .attr('xlink:href', '#iD-logo-features');
77968
77969           startEditing
77970               .append('div')
77971               .text(t('splash.start'));
77972
77973
77974           modalSelection.select('button.close')
77975               .attr('class','hide');
77976
77977       };
77978   }
77979
77980   function uiStatus(context) {
77981       var osm = context.connection();
77982
77983
77984       return function(selection) {
77985           if (!osm) return;
77986
77987           function update() {
77988               osm.status(function(err, apiStatus) {
77989                   selection.html('');
77990
77991                   if (err) {
77992                       if (apiStatus === 'connectionSwitched') {
77993                           // if the connection was just switched, we can't rely on
77994                           // the status (we're getting the status of the previous api)
77995                           return;
77996
77997                       } else if (apiStatus === 'rateLimited') {
77998                           selection
77999                               .text(t('status.rateLimit'))
78000                               .append('a')
78001                               .attr('class', 'api-status-login')
78002                               .attr('target', '_blank')
78003                               .call(svgIcon('#iD-icon-out-link', 'inline'))
78004                               .append('span')
78005                               .text(t('login'))
78006                               .on('click.login', function() {
78007                                   event.preventDefault();
78008                                   osm.authenticate();
78009                               });
78010                       } else {
78011                           // eslint-disable-next-line no-warning-comments
78012                           // TODO: nice messages for different error types
78013                           selection.text(t('status.error'));
78014                       }
78015
78016                   } else if (apiStatus === 'readonly') {
78017                       selection.text(t('status.readonly'));
78018                   } else if (apiStatus === 'offline') {
78019                       selection.text(t('status.offline'));
78020                   }
78021
78022                   selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
78023               });
78024           }
78025
78026           osm.on('change', function() { update(selection); });
78027
78028           window.setInterval(update, 90000);
78029           update(selection);
78030       };
78031   }
78032
78033   function uiUndoRedo(context) {
78034       var commands = [{
78035           id: 'undo',
78036           cmd: uiCmd('⌘Z'),
78037           action: function() { if (editable()) context.undo(); },
78038           annotation: function() { return context.history().undoAnnotation(); }
78039       }, {
78040           id: 'redo',
78041           cmd: uiCmd('⌘⇧Z'),
78042           action: function() { if (editable()) context.redo(); },
78043           annotation: function() { return context.history().redoAnnotation(); }
78044       }];
78045
78046
78047       function editable() {
78048           var mode = context.mode();
78049           return context.editable() && mode && mode.id !== 'save';
78050       }
78051
78052
78053       return function(selection) {
78054           var tooltipBehavior = tooltip()
78055               .placement('bottom')
78056               .html(true)
78057               .title(function (d) {
78058                   return uiTooltipHtml(d.annotation() ?
78059                       t(d.id + '.tooltip', {action: d.annotation()}) :
78060                       t(d.id + '.nothing'), d.cmd);
78061               });
78062
78063           var buttons = selection.selectAll('button')
78064               .data(commands)
78065               .enter()
78066               .append('button')
78067               .attr('class', function(d) { return 'disabled ' + d.id + '-button'; })
78068               .on('click', function(d) { return d.action(); })
78069               .call(tooltipBehavior);
78070
78071           buttons.each(function(d) {
78072               var iconName = d.id;
78073               if (textDirection === 'rtl') {
78074                   if (iconName === 'undo') {
78075                       iconName = 'redo';
78076                   } else if (iconName === 'redo') {
78077                       iconName = 'undo';
78078                   }
78079               }
78080               select(this)
78081                   .call(svgIcon('#iD-icon-' + iconName));
78082           });
78083
78084           context.keybinding()
78085               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
78086               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
78087
78088
78089           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
78090
78091           context.map()
78092               .on('move.undo_redo', debouncedUpdate)
78093               .on('drawn.undo_redo', debouncedUpdate);
78094
78095           context.history()
78096               .on('change.undo_redo', update);
78097
78098           context
78099               .on('enter.undo_redo', update);
78100
78101
78102           function update() {
78103               buttons
78104                   .property('disabled', !editable())
78105                   .classed('disabled', function(d) { return !d.annotation(); })
78106                   .each(function() {
78107                       var selection = select(this);
78108                       if (selection.property('tooltipVisible')) {
78109                           selection.call(tooltipBehavior.show);
78110                       }
78111                   });
78112           }
78113       };
78114   }
78115
78116   // these are module variables so they are preserved through a ui.restart()
78117   var sawVersion = null;
78118   var isNewVersion = false;
78119   var isNewUser = false;
78120
78121
78122   function uiVersion(context) {
78123
78124       var currVersion = context.version;
78125       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
78126
78127       if (sawVersion === null && matchedVersion !== null) {
78128           isNewVersion = (context.storage('sawVersion') !== currVersion);
78129           isNewUser = !context.storage('sawSplash');
78130           context.storage('sawVersion', currVersion);
78131           sawVersion = currVersion;
78132       }
78133
78134       return function(selection) {
78135           selection
78136               .append('a')
78137               .attr('target', '_blank')
78138               .attr('tabindex', -1)
78139               .attr('href', 'https://github.com/openstreetmap/iD')
78140               .text(currVersion);
78141
78142           // only show new version indicator to users that have used iD before
78143           if (isNewVersion && !isNewUser) {
78144               selection
78145                   .append('div')
78146                   .attr('class', 'badge')
78147                   .append('a')
78148                   .attr('target', '_blank')
78149                   .attr('tabindex', -1)
78150                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
78151                   .call(svgIcon('#maki-gift-11'))
78152                   .call(tooltip()
78153                       .title(t('version.whats_new', { version: currVersion }))
78154                       .placement('top')
78155                   );
78156           }
78157       };
78158   }
78159
78160   function uiZoom(context) {
78161       var zooms = [{
78162           id: 'zoom-in',
78163           icon: 'plus',
78164           title: t('zoom.in'),
78165           action: context.zoomIn,
78166           key: '+'
78167       }, {
78168           id: 'zoom-out',
78169           icon: 'minus',
78170           title: t('zoom.out'),
78171           action: context.zoomOut,
78172           key: '-'
78173       }];
78174
78175
78176       function zoomIn() {
78177           event.preventDefault();
78178           context.zoomIn();
78179       }
78180
78181
78182       function zoomOut() {
78183           event.preventDefault();
78184           context.zoomOut();
78185       }
78186
78187
78188       function zoomInFurther() {
78189           event.preventDefault();
78190           context.zoomInFurther();
78191       }
78192
78193
78194       function zoomOutFurther() {
78195           event.preventDefault();
78196           context.zoomOutFurther();
78197       }
78198
78199
78200       return function(selection) {
78201           var button = selection.selectAll('button')
78202               .data(zooms)
78203               .enter()
78204               .append('button')
78205               .attr('tabindex', -1)
78206               .attr('class', function(d) { return d.id; })
78207               .on('click.editor', function(d) { d.action(); })
78208               .call(tooltip()
78209                   .placement((textDirection === 'rtl') ? 'right' : 'left')
78210                   .html(true)
78211                   .title(function(d) {
78212                       return uiTooltipHtml(d.title, d.key);
78213                   })
78214               );
78215
78216           button.each(function(d) {
78217               select(this)
78218                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
78219           });
78220
78221           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
78222               context.keybinding().on([key], zoomIn);
78223               context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
78224           });
78225
78226           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
78227               context.keybinding().on([key], zoomOut);
78228               context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
78229           });
78230       };
78231   }
78232
78233   function uiInit(context) {
78234       var _initCounter = 0;
78235       var _initCallback;
78236       var _needWidth = {};
78237
78238
78239       function render(container) {
78240           container
78241               .attr('dir', textDirection);
78242
78243           var map = context.map();
78244
78245           container
78246               .append('svg')
78247               .attr('id', 'defs')
78248               .call(svgDefs(context));
78249
78250           container
78251               .append('div')
78252               .attr('id', 'sidebar')
78253               .call(ui.sidebar);
78254
78255           var content = container
78256               .append('div')
78257               .attr('id', 'content')
78258               .attr('class', 'active');
78259
78260           // Top toolbar
78261           var bar = content
78262               .append('div')
78263               .attr('id', 'bar')
78264               .attr('class', 'fillD');
78265
78266           content
78267               .append('div')
78268               .attr('id', 'map')
78269               .attr('dir', 'ltr')
78270               .call(map);
78271
78272           // Leading area button group (Sidebar toggle)
78273           var leadingArea = bar
78274               .append('div')
78275               .attr('class', 'tool-group leading-area');
78276
78277           var sidebarButton = leadingArea
78278               .append('div')
78279               .append('button')
78280               .attr('class', 'sidebar-toggle')
78281               .attr('tabindex', -1)
78282               .on('click', ui.sidebar.toggle)
78283               .call(tooltip()
78284                   .placement('bottom')
78285                   .html(true)
78286                   .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
78287               );
78288
78289           var iconSuffix = textDirection === 'rtl' ? 'right' : 'left';
78290           sidebarButton
78291               .call(svgIcon('#iD-icon-sidebar-' + iconSuffix));
78292
78293           leadingArea
78294               .append('div')
78295               .attr('class', 'full-screen bar-group')
78296               .call(uiFullScreen(context));
78297
78298
78299           // Center area button group (Point/Line/Area/Note mode buttons)
78300           bar
78301               .append('div')
78302               .attr('class', 'tool-group center-area')
78303               .append('div')
78304               .attr('class', 'modes joined')
78305               .call(uiModes(context), bar);
78306
78307
78308           // Trailing area button group (Undo/Redo save buttons)
78309           var trailingArea = bar
78310               .append('div')
78311               .attr('class', 'tool-group trailing-area');
78312
78313           trailingArea
78314               .append('div')
78315               .attr('class', 'joined')
78316               .call(uiUndoRedo(context));
78317
78318           trailingArea
78319               .append('div')
78320               .attr('class', 'save-wrap')
78321               .call(uiSave(context));
78322
78323
78324           // For now, just put spinner at the end of the #bar
78325           bar
78326               .append('div')
78327               .attr('class', 'spinner')
78328               .call(uiSpinner(context));
78329
78330
78331           // Map controls (appended to #bar, but absolutely positioned)
78332           var controls = content
78333               .append('div')
78334               .attr('class', 'map-controls');
78335
78336           controls
78337               .append('div')
78338               .attr('class', 'map-control zoombuttons')
78339               .call(uiZoom(context));
78340
78341           controls
78342               .append('div')
78343               .attr('class', 'map-control geolocate-control')
78344               .call(uiGeolocate(context));
78345
78346           var background = uiBackground(context);
78347           controls
78348               .append('div')
78349               .attr('class', 'map-control background-control')
78350               .call(background.renderToggleButton);
78351           content.call(background.renderPane);
78352
78353           var mapData = uiMapData(context);
78354           controls
78355               .append('div')
78356               .attr('class', 'map-control map-data-control')
78357               .call(mapData.renderToggleButton);
78358           content.call(mapData.renderPane);
78359
78360           var issues = uiIssues(context);
78361           controls
78362               .append('div')
78363               .attr('class', 'map-control map-issues-control')
78364               .call(issues.renderToggleButton);
78365           content.call(issues.renderPane);
78366
78367           var help = uiHelp(context);
78368           controls
78369               .append('div')
78370               .attr('class', 'map-control help-control')
78371               .call(help.renderToggleButton);
78372           content.call(help.renderPane);
78373
78374
78375           // Add attribution and footer
78376           var about = content
78377               .append('div')
78378               .attr('id', 'about');
78379
78380           about
78381               .append('div')
78382               .attr('id', 'attrib')
78383               .attr('dir', 'ltr')
78384               .call(uiAttribution(context));
78385
78386           about
78387               .append('div')
78388               .attr('class', 'api-status')
78389               .call(uiStatus(context));
78390
78391
78392           var footer = about
78393               .append('div')
78394               .attr('id', 'footer')
78395               .attr('class', 'fillD');
78396
78397           footer
78398               .append('div')
78399               .attr('id', 'flash-wrap')
78400               .attr('class', 'footer-hide');
78401
78402           var footerWrap = footer
78403               .append('div')
78404               .attr('id', 'footer-wrap')
78405               .attr('class', 'footer-show');
78406
78407           footerWrap
78408               .append('div')
78409               .attr('id', 'scale-block')
78410               .call(uiScale(context));
78411
78412           var aboutList = footerWrap
78413               .append('div')
78414               .attr('id', 'info-block')
78415               .append('ul')
78416               .attr('id', 'about-list');
78417
78418           if (!context.embed()) {
78419               aboutList
78420                   .call(uiAccount(context));
78421           }
78422
78423           aboutList
78424               .append('li')
78425               .attr('class', 'version')
78426               .call(uiVersion(context));
78427
78428           var issueLinks = aboutList
78429               .append('li');
78430
78431           issueLinks
78432               .append('a')
78433               .attr('target', '_blank')
78434               .attr('tabindex', -1)
78435               .attr('href', 'https://github.com/openstreetmap/iD/issues')
78436               .call(svgIcon('#iD-icon-bug', 'light'))
78437               .call(tooltip().title(t('report_a_bug')).placement('top'));
78438
78439           issueLinks
78440               .append('a')
78441               .attr('target', '_blank')
78442               .attr('tabindex', -1)
78443               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
78444               .call(svgIcon('#iD-icon-translate', 'light'))
78445               .call(tooltip().title(t('help_translate')).placement('top'));
78446
78447           aboutList
78448               .append('li')
78449               .attr('class', 'feature-warning')
78450               .attr('tabindex', -1)
78451               .call(uiFeatureInfo(context));
78452
78453           aboutList
78454               .append('li')
78455               .attr('class', 'user-list')
78456               .attr('tabindex', -1)
78457               .call(uiContributors(context));
78458
78459
78460           // Setup map dimensions and move map to initial center/zoom.
78461           // This should happen after #content and toolbars exist.
78462           ui.onResize();
78463
78464           var hash = behaviorHash(context);
78465           hash();
78466           if (!hash.hadHash) {
78467               map.centerZoom([0, 0], 2);
78468           }
78469
78470
78471           // Add absolutely-positioned elements that sit on top of the map
78472           // This should happen after the map is ready (center/zoom)
78473           content
78474               .call(uiMapInMap(context))
78475               .call(uiInfo(context))
78476               .call(uiNotice(context));
78477
78478           content
78479               .append('div')
78480               .attr('id', 'photoviewer')
78481               .classed('al', true)       // 'al'=left,  'ar'=right
78482               .classed('hide', true)
78483               .call(ui.photoviewer);
78484
78485
78486           // Bind events
78487           window.onbeforeunload = function() {
78488               return context.save();
78489           };
78490           window.onunload = function() {
78491               context.history().unlock();
78492           };
78493
78494           select(window)
78495               .on('gesturestart.editor', eventCancel)
78496               .on('gesturechange.editor', eventCancel)
78497               .on('gestureend.editor', eventCancel)
78498               .on('resize.editor', ui.onResize);
78499
78500
78501           var panPixels = 80;
78502           context.keybinding()
78503               .on('⌫', function() { event.preventDefault(); })
78504               .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
78505               .on('←', pan([panPixels, 0]))
78506               .on('↑', pan([0, panPixels]))
78507               .on('→', pan([-panPixels, 0]))
78508               .on('↓', pan([0, -panPixels]))
78509               .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
78510               .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
78511               .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
78512               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
78513
78514           context.enter(modeBrowse(context));
78515
78516           if (!_initCounter++) {
78517               if (!hash.startWalkthrough) {
78518                   context.container()
78519                       .call(uiSplash(context))
78520                       .call(uiRestore(context));
78521               }
78522
78523               context.container()
78524                   .call(uiShortcuts(context));
78525           }
78526
78527           var osm = context.connection();
78528           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
78529
78530           if (osm && auth) {
78531               osm
78532                   .on('authLoading.ui', function() {
78533                       context.container()
78534                           .call(auth);
78535                   })
78536                   .on('authDone.ui', function() {
78537                       auth.close();
78538                   });
78539           }
78540
78541           _initCounter++;
78542
78543           if (hash.startWalkthrough) {
78544               hash.startWalkthrough = false;
78545               context.container().call(uiIntro(context));
78546           }
78547
78548
78549           function pan(d) {
78550               return function() {
78551                   if (select('.combobox').size()) return;
78552                   event.preventDefault();
78553                   context.pan(d, 100);
78554               };
78555           }
78556
78557           function eventCancel() {
78558               event.preventDefault();
78559           }
78560       }
78561
78562
78563       function ui(node, callback) {
78564           _initCallback = callback;
78565           var container = select(node);
78566           context.container(container);
78567           context.loadLocale(function(err) {
78568               if (!err) {
78569                   render(container);
78570               }
78571               if (callback) {
78572                   callback(err);
78573               }
78574           });
78575       }
78576
78577
78578       ui.restart = function(arg) {
78579           context.keybinding().clear();
78580           context.locale(arg);
78581           context.loadLocale(function(err) {
78582               if (!err) {
78583                   context.container().selectAll('*').remove();
78584                   render(context.container());
78585                   if (_initCallback) _initCallback();
78586               }
78587           });
78588       };
78589
78590
78591       ui.sidebar = uiSidebar(context);
78592
78593       ui.photoviewer = uiPhotoviewer(context);
78594
78595       ui.onResize = function(withPan) {
78596           var map = context.map();
78597
78598           // Recalc dimensions of map and sidebar.. (`true` = force recalc)
78599           // This will call `getBoundingClientRect` and trigger reflow,
78600           //  but the values will be cached for later use.
78601           var mapDimensions = utilGetDimensions(select('#content'), true);
78602           utilGetDimensions(select('#sidebar'), true);
78603
78604           if (withPan !== undefined) {
78605               map.redrawEnable(false);
78606               map.pan(withPan);
78607               map.redrawEnable(true);
78608           }
78609           map.dimensions(mapDimensions);
78610
78611           ui.photoviewer.onMapResize();
78612
78613           // check if header or footer have overflowed
78614           ui.checkOverflow('#bar');
78615           ui.checkOverflow('#footer');
78616
78617           // Use outdated code so it works on Explorer
78618           var resizeWindowEvent = document.createEvent('Event');
78619
78620           resizeWindowEvent.initEvent('resizeWindow', true, true);
78621
78622           document.dispatchEvent(resizeWindowEvent);
78623       };
78624
78625
78626       // Call checkOverflow when resizing or whenever the contents change.
78627       ui.checkOverflow = function(selector, reset) {
78628           if (reset) {
78629               delete _needWidth[selector];
78630           }
78631
78632           var element = select(selector);
78633           var scrollWidth = element.property('scrollWidth');
78634           var clientWidth = element.property('clientWidth');
78635           var needed = _needWidth[selector] || scrollWidth;
78636
78637           if (scrollWidth > clientWidth) {    // overflow happening
78638               element.classed('narrow', true);
78639               if (!_needWidth[selector]) {
78640                   _needWidth[selector] = scrollWidth;
78641               }
78642
78643           } else if (scrollWidth >= needed) {
78644               element.classed('narrow', false);
78645           }
78646       };
78647
78648
78649       return ui;
78650   }
78651
78652   function uiChangesetEditor(context) {
78653       var dispatch$1 = dispatch('change');
78654       var formFields = uiFormFields(context);
78655       var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
78656       var _fieldsArr;
78657       var _tags;
78658       var _changesetID;
78659
78660
78661       function changesetEditor(selection) {
78662           render(selection);
78663       }
78664
78665
78666       function render(selection) {
78667           var initial = false;
78668
78669           if (!_fieldsArr) {
78670               initial = true;
78671               var presets = context.presets();
78672
78673               _fieldsArr = [
78674                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
78675                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
78676                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
78677               ];
78678
78679               _fieldsArr.forEach(function(field) {
78680                   field
78681                       .on('change', function(t, onInput) {
78682                           dispatch$1.call('change', field, t, onInput);
78683                       });
78684               });
78685           }
78686
78687           _fieldsArr.forEach(function(field) {
78688               field
78689                   .tags(_tags);
78690           });
78691
78692
78693           selection
78694               .call(formFields.fieldsArr(_fieldsArr));
78695
78696
78697           if (initial) {
78698               var commentField = selection.select('#preset-input-comment');
78699               var commentNode = commentField.node();
78700
78701               if (commentNode) {
78702                   commentNode.focus();
78703                   commentNode.select();
78704               }
78705
78706               // trigger a 'blur' event so that comment field can be cleaned
78707               // and checked for hashtags, even if retrieved from localstorage
78708               utilTriggerEvent(commentField, 'blur');
78709
78710               var osm = context.connection();
78711               if (osm) {
78712                   osm.userChangesets(function (err, changesets) {
78713                       if (err) return;
78714
78715                       var comments = changesets.map(function(changeset) {
78716                           return {
78717                               title: changeset.tags.comment,
78718                               value: changeset.tags.comment
78719                           };
78720                       });
78721
78722                       commentField
78723                           .call(commentCombo
78724                               .data(uniqBy(comments, 'title'))
78725                           );
78726                   });
78727               }
78728           }
78729
78730           // Add warning if comment mentions Google
78731           var hasGoogle = _tags.comment.match(/google/i);
78732           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
78733               .data(hasGoogle ? [0] : []);
78734
78735           commentWarning.exit()
78736               .transition()
78737               .duration(200)
78738               .style('opacity', 0)
78739               .remove();
78740
78741           var commentEnter = commentWarning.enter()
78742               .insert('div', '.tag-reference-body')
78743               .attr('class', 'field-warning comment-warning')
78744               .style('opacity', 0);
78745
78746           commentEnter
78747               .append('a')
78748               .attr('target', '_blank')
78749               .attr('tabindex', -1)
78750               .call(svgIcon('#iD-icon-alert', 'inline'))
78751               .attr('href', t('commit.google_warning_link'))
78752               .append('span')
78753               .text(t('commit.google_warning'));
78754
78755           commentEnter
78756               .transition()
78757               .duration(200)
78758               .style('opacity', 1);
78759       }
78760
78761
78762       changesetEditor.tags = function(_) {
78763           if (!arguments.length) return _tags;
78764           _tags = _;
78765           // Don't reset _fieldsArr here.
78766           return changesetEditor;
78767       };
78768
78769
78770       changesetEditor.changesetID = function(_) {
78771           if (!arguments.length) return _changesetID;
78772           if (_changesetID === _) return changesetEditor;
78773           _changesetID = _;
78774           _fieldsArr = null;
78775           return changesetEditor;
78776       };
78777
78778
78779       return utilRebind(changesetEditor, dispatch$1, 'on');
78780   }
78781
78782   // This code assumes that the combobox values will not have duplicate entries.
78783   // It is keyed on the `value` of the entry. Data should be an array of objects like:
78784   //   [{
78785   //       value:  'display text',  // required
78786   //       title:  'hover text'     // optional
78787   //   }, ...]
78788
78789   var _comboHideTimerID;
78790
78791   function uiCombobox(context, klass) {
78792       var dispatch$1 = dispatch('accept', 'cancel');
78793       var container = context.container();
78794
78795       var _suggestions = [];
78796       var _data = [];
78797       var _fetched = {};
78798       var _selected = null;
78799       var _canAutocomplete = true;
78800       var _caseSensitive = false;
78801       var _cancelFetch = false;
78802       var _minItems = 2;
78803       var _tDown = 0;
78804
78805       var _fetcher = function(val, cb) {
78806           cb(_data.filter(function(d) {
78807               return d.value
78808                   .toString()
78809                   .toLowerCase()
78810                   .indexOf(val.toLowerCase()) !== -1;
78811           }));
78812       };
78813
78814       var combobox = function(input, attachTo) {
78815           if (!input || input.empty()) return;
78816
78817           input
78818               .classed('combobox-input', true)
78819               .on('focus.combo-input', focus)
78820               .on('blur.combo-input', blur)
78821               .on('keydown.combo-input', keydown)
78822               .on('keyup.combo-input', keyup)
78823               .on('input.combo-input', change)
78824               .on('mousedown.combo-input', mousedown)
78825               .each(function() {
78826                   var parent = this.parentNode;
78827                   var sibling = this.nextSibling;
78828
78829                   select(parent).selectAll('.combobox-caret')
78830                       .filter(function(d) { return d === input.node(); })
78831                       .data([input.node()])
78832                       .enter()
78833                       .insert('div', function() { return sibling; })
78834                       .attr('class', 'combobox-caret')
78835                       .on('mousedown.combo-caret', function() {
78836                           event.preventDefault(); // don't steal focus from input
78837                           input.node().focus(); // focus the input as if it was clicked
78838                           mousedown();
78839                       })
78840                       .on('mouseup.combo-caret', function() {
78841                           event.preventDefault(); // don't steal focus from input
78842                           mouseup();
78843                       });
78844               });
78845
78846
78847           function mousedown() {
78848               if (event.button !== 0) return;    // left click only
78849               _tDown = +new Date();
78850
78851               // clear selection
78852               var start = input.property('selectionStart');
78853               var end = input.property('selectionEnd');
78854               if (start !== end) {
78855                   var val = utilGetSetValue(input);
78856                   input.node().setSelectionRange(val.length, val.length);
78857                   return;
78858               }
78859
78860               input.on('mouseup.combo-input', mouseup);
78861           }
78862
78863
78864           function mouseup() {
78865               input.on('mouseup.combo-input', null);
78866               if (event.button !== 0) return;    // left click only
78867               if (input.node() !== document.activeElement) return;   // exit if this input is not focused
78868
78869               var start = input.property('selectionStart');
78870               var end = input.property('selectionEnd');
78871               if (start !== end) return;  // exit if user is selecting
78872
78873               // not showing or showing for a different field - try to show it.
78874               var combo = container.selectAll('.combobox');
78875               if (combo.empty() || combo.datum() !== input.node()) {
78876                   var tOrig = _tDown;
78877                   window.setTimeout(function() {
78878                       if (tOrig !== _tDown) return;   // exit if user double clicked
78879                       fetch('', function() {
78880                           show();
78881                           render();
78882                       });
78883                   }, 250);
78884
78885               } else {
78886                   hide();
78887               }
78888           }
78889
78890
78891           function focus() {
78892               fetch('');   // prefetch values (may warm taginfo cache)
78893           }
78894
78895
78896           function blur() {
78897               _comboHideTimerID = window.setTimeout(hide, 75);
78898           }
78899
78900
78901           function show() {
78902               hide();   // remove any existing
78903
78904               container
78905                   .insert('div', ':first-child')
78906                   .datum(input.node())
78907                   .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
78908                   .style('position', 'absolute')
78909                   .style('display', 'block')
78910                   .style('left', '0px')
78911                   .on('mousedown.combo-container', function () {
78912                       // prevent moving focus out of the input field
78913                       event.preventDefault();
78914                   });
78915
78916               select('body')
78917                   .on('scroll.combo-scroll', render, true);
78918           }
78919
78920
78921           function hide() {
78922               if (_comboHideTimerID) {
78923                   window.clearTimeout(_comboHideTimerID);
78924                   _comboHideTimerID = undefined;
78925               }
78926
78927               container.selectAll('.combobox')
78928                   .remove();
78929
78930               select('body')
78931                   .on('scroll.combo-scroll', null);
78932           }
78933
78934
78935           function keydown() {
78936               var shown = !container.selectAll('.combobox').empty();
78937               var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
78938
78939               switch (event.keyCode) {
78940                   case 8:   // ⌫ Backspace
78941                   case 46:  // ⌦ Delete
78942                       event.stopPropagation();
78943                       _selected = null;
78944                       render();
78945                       input.on('input.combo-input', function() {
78946                           var start = input.property('selectionStart');
78947                           input.node().setSelectionRange(start, start);
78948                           input.on('input.combo-input', change);
78949                       });
78950                       break;
78951
78952                   case 9:   // ⇥ Tab
78953                       accept();
78954                       break;
78955
78956                   case 13:  // ↩ Return
78957                       event.preventDefault();
78958                       event.stopPropagation();
78959                       break;
78960
78961                   case 38:  // ↑ Up arrow
78962                       if (tagName === 'textarea' && !shown) return;
78963                       event.preventDefault();
78964                       if (tagName === 'input' && !shown) {
78965                           show();
78966                       }
78967                       nav(-1);
78968                       break;
78969
78970                   case 40:  // ↓ Down arrow
78971                       if (tagName === 'textarea' && !shown) return;
78972                       event.preventDefault();
78973                       if (tagName === 'input' && !shown) {
78974                           show();
78975                       }
78976                       nav(+1);
78977                       break;
78978               }
78979           }
78980
78981
78982           function keyup() {
78983               switch (event.keyCode) {
78984                   case 27:  // ⎋ Escape
78985                       cancel();
78986                       break;
78987
78988                   case 13:  // ↩ Return
78989                       accept();
78990                       break;
78991               }
78992           }
78993
78994
78995           // Called whenever the input value is changed (e.g. on typing)
78996           function change() {
78997               fetch(value(), function() {
78998                   _selected = null;
78999                   var val = input.property('value');
79000
79001                   if (_suggestions.length) {
79002                       if (input.property('selectionEnd') === val.length) {
79003                           _selected = tryAutocomplete();
79004                       }
79005
79006                       if (!_selected) {
79007                           _selected = val;
79008                       }
79009                   }
79010
79011                   if (val.length) {
79012                       var combo = container.selectAll('.combobox');
79013                       if (combo.empty()) {
79014                           show();
79015                       }
79016                   } else {
79017                       hide();
79018                   }
79019
79020                   render();
79021               });
79022           }
79023
79024
79025           // Called when the user presses up/down arrows to navigate the list
79026           function nav(dir) {
79027               if (_suggestions.length) {
79028                   // try to determine previously selected index..
79029                   var index = -1;
79030                   for (var i = 0; i < _suggestions.length; i++) {
79031                       if (_selected && _suggestions[i].value === _selected) {
79032                           index = i;
79033                           break;
79034                       }
79035                   }
79036
79037                   // pick new _selected
79038                   index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
79039                   _selected = _suggestions[index].value;
79040                   input.property('value', _selected);
79041               }
79042
79043               render();
79044               ensureVisible();
79045           }
79046
79047
79048           function ensureVisible() {
79049               var combo = container.selectAll('.combobox');
79050               if (combo.empty()) return;
79051
79052               var containerRect = container.node().getBoundingClientRect();
79053               var comboRect = combo.node().getBoundingClientRect();
79054
79055               if (comboRect.bottom > containerRect.bottom) {
79056                   var node = attachTo ? attachTo.node() : input.node();
79057                   node.scrollIntoView({ behavior: 'instant', block: 'center' });
79058                   render();
79059               }
79060
79061               // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
79062               var selected = combo.selectAll('.combobox-option.selected').node();
79063               if (selected) {
79064                   selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
79065               }
79066           }
79067
79068
79069           function value() {
79070               var value = input.property('value');
79071               var start = input.property('selectionStart');
79072               var end = input.property('selectionEnd');
79073
79074               if (start && end) {
79075                   value = value.substring(0, start);
79076               }
79077
79078               return value;
79079           }
79080
79081
79082           function fetch(v, cb) {
79083               _cancelFetch = false;
79084
79085               _fetcher.call(input, v, function(results) {
79086                   // already chose a value, don't overwrite or autocomplete it
79087                   if (_cancelFetch) return;
79088
79089                   _suggestions = results;
79090                   results.forEach(function(d) { _fetched[d.value] = d; });
79091
79092                   if (cb) {
79093                       cb();
79094                   }
79095               });
79096           }
79097
79098
79099           function tryAutocomplete() {
79100               if (!_canAutocomplete) return;
79101
79102               var val = _caseSensitive ? value() : value().toLowerCase();
79103               if (!val) return;
79104
79105               // Don't autocomplete if user is typing a number - #4935
79106               if (!isNaN(parseFloat(val)) && isFinite(val)) return;
79107
79108               var bestIndex = -1;
79109               for (var i = 0; i < _suggestions.length; i++) {
79110                   var suggestion = _suggestions[i].value;
79111                   var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
79112
79113                   // if search string matches suggestion exactly, pick it..
79114                   if (compare === val) {
79115                       bestIndex = i;
79116                       break;
79117
79118                   // otherwise lock in the first result that starts with the search string..
79119                   } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
79120                       bestIndex = i;
79121                   }
79122               }
79123
79124               if (bestIndex !== -1) {
79125                   var bestVal = _suggestions[bestIndex].value;
79126                   input.property('value', bestVal);
79127                   input.node().setSelectionRange(val.length, bestVal.length);
79128                   return bestVal;
79129               }
79130           }
79131
79132
79133           function render() {
79134               if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
79135                   hide();
79136                   return;
79137               }
79138
79139               var shown = !container.selectAll('.combobox').empty();
79140               if (!shown) return;
79141
79142               var combo = container.selectAll('.combobox');
79143               var options = combo.selectAll('.combobox-option')
79144                   .data(_suggestions, function(d) { return d.value; });
79145
79146               options.exit()
79147                   .remove();
79148
79149               // enter/update
79150               options.enter()
79151                   .append('a')
79152                   .attr('class', 'combobox-option')
79153                   .attr('title', function(d) { return d.title; })
79154                   .text(function(d) { return d.display || d.value; })
79155                   .merge(options)
79156                   .classed('selected', function(d) { return d.value === _selected; })
79157                   .on('click.combo-option', accept)
79158                   .order();
79159
79160               var node = attachTo ? attachTo.node() : input.node();
79161               var rect = node.getBoundingClientRect();
79162
79163               combo
79164                   .style('left', (rect.left + 5) + 'px')
79165                   .style('width', (rect.width - 10) + 'px')
79166                   .style('top', rect.height + rect.top + 'px');
79167           }
79168
79169
79170           // Dispatches an 'accept' event
79171           // Then hides the combobox.
79172           function accept(d) {
79173               _cancelFetch = true;
79174               var thiz = input.node();
79175
79176               if (d) {   // user clicked on a suggestion
79177                   utilGetSetValue(input, d.value);    // replace field contents
79178                   utilTriggerEvent(input, 'change');
79179               }
79180
79181               // clear (and keep) selection
79182               var val = utilGetSetValue(input);
79183               thiz.setSelectionRange(val.length, val.length);
79184
79185               d = _fetched[val];
79186               dispatch$1.call('accept', thiz, d, val);
79187               hide();
79188           }
79189
79190
79191           // Dispatches an 'cancel' event
79192           // Then hides the combobox.
79193           function cancel() {
79194               _cancelFetch = true;
79195               var thiz = input.node();
79196
79197               // clear (and remove) selection, and replace field contents
79198               var val = utilGetSetValue(input);
79199               var start = input.property('selectionStart');
79200               var end = input.property('selectionEnd');
79201               val = val.slice(0, start) + val.slice(end);
79202               utilGetSetValue(input, val);
79203               thiz.setSelectionRange(val.length, val.length);
79204
79205               dispatch$1.call('cancel', thiz);
79206               hide();
79207           }
79208
79209       };
79210
79211
79212       combobox.canAutocomplete = function(val) {
79213           if (!arguments.length) return _canAutocomplete;
79214           _canAutocomplete = val;
79215           return combobox;
79216       };
79217
79218       combobox.caseSensitive = function(val) {
79219           if (!arguments.length) return _caseSensitive;
79220           _caseSensitive = val;
79221           return combobox;
79222       };
79223
79224       combobox.data = function(val) {
79225           if (!arguments.length) return _data;
79226           _data = val;
79227           return combobox;
79228       };
79229
79230       combobox.fetcher = function(val) {
79231           if (!arguments.length) return _fetcher;
79232           _fetcher = val;
79233           return combobox;
79234       };
79235
79236       combobox.minItems = function(val) {
79237           if (!arguments.length) return _minItems;
79238           _minItems = val;
79239           return combobox;
79240       };
79241
79242
79243       return utilRebind(combobox, dispatch$1, 'on');
79244   }
79245
79246
79247   uiCombobox.off = function(input) {
79248       input
79249           .on('focus.combo-input', null)
79250           .on('blur.combo-input', null)
79251           .on('keydown.combo-input', null)
79252           .on('keyup.combo-input', null)
79253           .on('input.combo-input', null)
79254           .on('mousedown.combo-input', null)
79255           .on('mouseup.combo-input', null);
79256
79257
79258       select('body')
79259           .on('scroll.combo-scroll', null);
79260   };
79261
79262   /**
79263    * This method is like `_.union` except that it accepts `iteratee` which is
79264    * invoked for each element of each `arrays` to generate the criterion by
79265    * which uniqueness is computed. Result values are chosen from the first
79266    * array in which the value occurs. The iteratee is invoked with one argument:
79267    * (value).
79268    *
79269    * @static
79270    * @memberOf _
79271    * @since 4.0.0
79272    * @category Array
79273    * @param {...Array} [arrays] The arrays to inspect.
79274    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
79275    * @returns {Array} Returns the new array of combined values.
79276    * @example
79277    *
79278    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
79279    * // => [2.1, 1.2]
79280    *
79281    * // The `_.property` iteratee shorthand.
79282    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
79283    * // => [{ 'x': 1 }, { 'x': 2 }]
79284    */
79285   var unionBy = baseRest(function(arrays) {
79286     var iteratee = last(arrays);
79287     if (isArrayLikeObject(iteratee)) {
79288       iteratee = undefined;
79289     }
79290     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
79291   });
79292
79293   function uiCommitChanges(context) {
79294       var detected = utilDetect();
79295       var _entityID;
79296
79297
79298       function commitChanges(selection) {
79299           var history = context.history();
79300           var summary = history.difference().summary();
79301
79302           var container = selection.selectAll('.modal-section.commit-section')
79303               .data([0]);
79304
79305           var containerEnter = container.enter()
79306               .append('div')
79307               .attr('class', 'commit-section modal-section fillL2');
79308
79309           containerEnter
79310               .append('h3')
79311               .text(t('commit.changes', { count: summary.length }));
79312
79313           containerEnter
79314               .append('ul')
79315               .attr('class', 'changeset-list');
79316
79317           container = containerEnter
79318               .merge(container);
79319
79320
79321           var items = container.select('ul').selectAll('li')
79322               .data(summary);
79323
79324           var itemsEnter = items.enter()
79325               .append('li')
79326               .attr('class', 'change-item');
79327
79328           itemsEnter
79329               .each(function(d) {
79330                   select(this)
79331                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
79332               });
79333
79334           itemsEnter
79335               .append('span')
79336               .attr('class', 'change-type')
79337               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
79338
79339           itemsEnter
79340               .append('strong')
79341               .attr('class', 'entity-type')
79342               .text(function(d) {
79343                   var matched = context.presets().match(d.entity, d.graph);
79344                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
79345               });
79346
79347           itemsEnter
79348               .append('span')
79349               .attr('class', 'entity-name')
79350               .text(function(d) {
79351                   var name = utilDisplayName(d.entity) || '',
79352                       string = '';
79353                   if (name !== '') {
79354                       string += ':';
79355                   }
79356                   return string += ' ' + name;
79357               });
79358
79359           itemsEnter
79360               .style('opacity', 0)
79361               .transition()
79362               .style('opacity', 1);
79363
79364           items = itemsEnter
79365               .merge(items);
79366
79367           items
79368               .on('mouseover', mouseover)
79369               .on('mouseout', mouseout)
79370               .on('click', click);
79371
79372
79373           // Download changeset link
79374           var changeset = new osmChangeset().update({ id: undefined });
79375           var changes = history.changes(actionDiscardTags(history.difference()));
79376
79377           delete changeset.id;  // Export without chnageset_id
79378
79379           var data = JXON.stringify(changeset.osmChangeJXON(changes));
79380           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
79381           var fileName = 'changes.osc';
79382
79383           var linkEnter = container.selectAll('.download-changes')
79384               .data([0])
79385               .enter()
79386               .append('a')
79387               .attr('class', 'download-changes');
79388
79389           if (detected.download) {      // All except IE11 and Edge
79390               linkEnter                 // download the data as a file
79391                   .attr('href', window.URL.createObjectURL(blob))
79392                   .attr('download', fileName);
79393
79394           } else {                      // IE11 and Edge
79395               linkEnter                 // open data uri in a new tab
79396                   .attr('target', '_blank')
79397                   .on('click.download', function() {
79398                       navigator.msSaveBlob(blob, fileName);
79399                   });
79400           }
79401
79402           linkEnter
79403               .call(svgIcon('#iD-icon-load', 'inline'))
79404               .append('span')
79405               .text(t('commit.download_changes'));
79406
79407
79408           function mouseover(d) {
79409               if (d.entity) {
79410                   context.surface().selectAll(
79411                       utilEntityOrMemberSelector([d.entity.id], context.graph())
79412                   ).classed('hover', true);
79413               }
79414           }
79415
79416
79417           function mouseout() {
79418               context.surface().selectAll('.hover')
79419                   .classed('hover', false);
79420           }
79421
79422
79423           function click(change) {
79424               if (change.changeType === 'deleted') {
79425                   _entityID = null;
79426               } else {
79427                   var entity = change.entity;
79428                   _entityID = change.entity.id;
79429                   context.map().zoomToEase(entity);
79430                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
79431                       .classed('hover', true);
79432               }
79433           }
79434       }
79435
79436
79437       commitChanges.entityID = function(_) {
79438           if (!arguments.length) return _entityID;
79439           _entityID = _;
79440           return commitChanges;
79441       };
79442
79443
79444       return commitChanges;
79445   }
79446
79447   function uiCommitWarnings(context) {
79448
79449       function commitWarnings(selection) {
79450
79451           var issuesBySeverity = {
79452               warning: context.validator().getWarnings(),
79453               error: context.validator().getErrors()
79454           };
79455
79456           for (var severity in issuesBySeverity) {
79457               var issues = issuesBySeverity[severity];
79458               var section = severity + '-section';
79459               var issueItem = severity + '-item';
79460
79461               var container = selection.selectAll('.' + section)
79462                   .data(issues.length ? [0] : []);
79463
79464               container.exit()
79465                   .remove();
79466
79467               var containerEnter = container.enter()
79468                   .append('div')
79469                   .attr('class', 'modal-section ' + section + ' fillL2');
79470
79471               containerEnter
79472                   .append('h3')
79473                   .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
79474
79475               containerEnter
79476                   .append('ul')
79477                   .attr('class', 'changeset-list');
79478
79479               container = containerEnter
79480                   .merge(container);
79481
79482
79483               var items = container.select('ul').selectAll('li')
79484                   .data(issues, function(d) { return d.id(); });
79485
79486               items.exit()
79487                   .remove();
79488
79489               var itemsEnter = items.enter()
79490                   .append('li')
79491                   .attr('class', issueItem);
79492
79493               itemsEnter
79494                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
79495
79496               itemsEnter
79497                   .append('strong')
79498                   .text(function(d) { return d.message; });
79499
79500               itemsEnter.filter(function(d) { return d.tooltip; })
79501                   .call(tooltip()
79502                       .title(function(d) { return d.tooltip; })
79503                       .placement('top')
79504                   );
79505
79506               items = itemsEnter
79507                   .merge(items);
79508
79509
79510               items
79511                   .on('mouseover', function(d) {
79512                       if (d.entities) {
79513                           context.surface().selectAll(
79514                               utilEntityOrMemberSelector(
79515                                   d.entities.map(function(e) { return e.id; }),
79516                                   context.graph()
79517                               )
79518                           ).classed('hover', true);
79519                       }
79520                   })
79521                   .on('mouseout', function() {
79522                       context.surface().selectAll('.hover')
79523                           .classed('hover', false);
79524                   })
79525                   .on('click', function(d) {
79526                       if (d.entities && d.entities.length > 0) {
79527                           context.map().zoomTo(d.entities[0]);
79528                           context.enter(modeSelect(
79529                               context,
79530                               d.entities.map(function(e) { return e.id; })
79531                           ));
79532                       }
79533                   });
79534           }
79535       }
79536
79537
79538       return commitWarnings;
79539   }
79540
79541   function uiRawTagEditor(context) {
79542       var taginfo = services.taginfo;
79543       var dispatch$1 = dispatch('change');
79544       var _readOnlyTags = [];
79545       var _orderedKeys = [];
79546       var _showBlank = false;
79547       var _updatePreference = true;
79548       var _expanded = false;
79549       var _pendingChange = null;
79550       var _state;
79551       var _preset;
79552       var _tags;
79553       var _entityID;
79554
79555
79556       function rawTagEditor(selection) {
79557           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
79558
79559           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
79560               .title(t('inspector.all_tags') + ' (' + count + ')')
79561               .on('toggled', toggled)
79562               .updatePreference(_updatePreference)
79563               .content(content);
79564
79565           // Sometimes we want to force the raw_tag_editor to be opened/closed..
79566           // When undefined, uiDisclosure will use the user's stored preference.
79567           if (_expanded !== undefined) {
79568               disclosure.expanded(_expanded);
79569           }
79570
79571           selection.call(disclosure);
79572
79573           function toggled(expanded) {
79574               _expanded = expanded;
79575               if (expanded) {
79576                   selection.node().parentNode.scrollTop += 200;
79577               }
79578           }
79579       }
79580
79581
79582       function content(wrap) {
79583           var rowData = [];
79584           var seen = {};
79585           var allKeys = Object.keys(_tags);
79586           var i, k;
79587
79588           // When switching to a different entity or changing the state (hover/select)
79589           // we reorder the keys.  Otherwise leave them as the user entered - #5857
79590           if (!_orderedKeys.length) {
79591               _orderedKeys = allKeys.sort();
79592           }
79593
79594           // push ordered keys first
79595           for (i = 0; i < _orderedKeys.length; i++) {
79596               k = _orderedKeys[i];
79597               if (_tags[k] === undefined) continue;   // e.g. tag was removed
79598               seen[k] = true;
79599               rowData.push({ key: k, value: _tags[k] });
79600           }
79601           // push unknown keys after - these are tags the user added
79602           for (i = 0; i < allKeys.length; i++) {
79603               k = allKeys[i];
79604               if (seen[k]) continue;
79605               rowData.push({ key: k, value: _tags[k] });
79606           }
79607           // push blank row last, if necessary
79608           if (!rowData.length || _showBlank) {
79609               _showBlank = false;
79610               rowData.push({ key: '', value: '' });
79611           }
79612
79613           // List of tags
79614           var list = wrap.selectAll('.tag-list')
79615               .data([0]);
79616
79617           list = list.enter()
79618               .append('ul')
79619               .attr('class', 'tag-list')
79620               .merge(list);
79621
79622
79623           // Container for the Add button
79624           var addRowEnter = wrap.selectAll('.add-row')
79625               .data([0])
79626               .enter()
79627               .append('div')
79628               .attr('class', 'add-row');
79629
79630           addRowEnter
79631               .append('button')
79632               .attr('class', 'add-tag')
79633               .call(svgIcon('#iD-icon-plus', 'light'))
79634               .on('click', addTag);
79635
79636           addRowEnter
79637               .append('div')
79638               .attr('class', 'space-value');   // preserve space
79639
79640           addRowEnter
79641               .append('div')
79642               .attr('class', 'space-buttons');  // preserve space
79643
79644
79645           // Tag list items
79646           var items = list.selectAll('.tag-row')
79647               .data(rowData, function(d) { return d.key; });
79648
79649           items.exit()
79650               .each(unbind)
79651               .remove();
79652
79653
79654           // Enter
79655           var itemsEnter = items.enter()
79656               .append('li')
79657               .attr('class', 'tag-row')
79658               .classed('readonly', isReadOnly);
79659
79660           var innerWrap = itemsEnter.append('div')
79661               .attr('class', 'inner-wrap');
79662
79663           innerWrap
79664               .append('div')
79665               .attr('class', 'key-wrap')
79666               .append('input')
79667               .property('type', 'text')
79668               .attr('class', 'key')
79669               .attr('maxlength', 255)
79670               .call(utilNoAuto)
79671               .on('blur', keyChange)
79672               .on('change', keyChange);
79673
79674           innerWrap
79675               .append('div')
79676               .attr('class', 'value-wrap')
79677               .append('input')
79678               .property('type', 'text')
79679               .attr('class', 'value')
79680               .attr('maxlength', 255)
79681               .call(utilNoAuto)
79682               .on('blur', valueChange)
79683               .on('change', valueChange)
79684               .on('keydown.push-more', pushMore);
79685
79686           innerWrap
79687               .append('button')
79688               .attr('tabindex', -1)
79689               .attr('class', 'form-field-button remove')
79690               .attr('title', t('icons.remove'))
79691               .call(svgIcon('#iD-operation-delete'));
79692
79693
79694           // Update
79695           items = items
79696               .merge(itemsEnter)
79697               .order();
79698
79699           items
79700               .each(function(d) {
79701                   var row = select(this);
79702                   var key = row.select('input.key');      // propagate bound data
79703                   var value = row.select('input.value');  // propagate bound data
79704
79705                   if (_entityID && taginfo && _state !== 'hover') {
79706                       bindTypeahead(key, value);
79707                   }
79708
79709                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
79710                   var reference;
79711
79712                   if (isRelation && d.key === 'type') {
79713                       reference = uiTagReference({ rtype: d.value }, context);
79714                   } else {
79715                       reference = uiTagReference({ key: d.key, value: d.value }, context);
79716                   }
79717
79718                   if (_state === 'hover') {
79719                       reference.showing(false);
79720                   }
79721
79722                   row.select('.inner-wrap')      // propagate bound data
79723                       .call(reference.button);
79724
79725                   row.call(reference.body);
79726
79727                   row.select('button.remove');   // propagate bound data
79728               });
79729
79730           items.selectAll('input.key')
79731               .attr('title', function(d) { return d.key; })
79732               .call(utilGetSetValue, function(d) { return d.key; })
79733               .property('disabled', isReadOnly);
79734
79735           items.selectAll('input.value')
79736               .attr('title', function(d) { return d.value; })
79737               .call(utilGetSetValue, function(d) { return d.value; })
79738               .property('disabled', isReadOnly);
79739
79740           items.selectAll('button.remove')
79741               .on('mousedown', removeTag);  // 'click' fires too late - #5878
79742
79743
79744
79745           function isReadOnly(d) {
79746               for (var i = 0; i < _readOnlyTags.length; i++) {
79747                   if (d.key.match(_readOnlyTags[i]) !== null) {
79748                       return true;
79749                   }
79750               }
79751               return false;
79752           }
79753
79754
79755           function pushMore() {
79756               if (event.keyCode === 9 && !event.shiftKey &&
79757                   list.selectAll('li:last-child input.value').node() === this) {
79758                   addTag();
79759               }
79760           }
79761
79762
79763           function bindTypeahead(key, value) {
79764               if (isReadOnly(key.datum())) return;
79765
79766               var geometry = context.geometry(_entityID);
79767
79768               key.call(uiCombobox(context, 'tag-key')
79769                   .fetcher(function(value, callback) {
79770                       taginfo.keys({
79771                           debounce: true,
79772                           geometry: geometry,
79773                           query: value
79774                       }, function(err, data) {
79775                           if (!err) {
79776                               var filtered = data.filter(function(d) {
79777                                   return _tags[d.value] === undefined;
79778                               });
79779                               callback(sort(value, filtered));
79780                           }
79781                       });
79782                   }));
79783
79784               value.call(uiCombobox(context, 'tag-value')
79785                   .fetcher(function(value, callback) {
79786                       taginfo.values({
79787                           debounce: true,
79788                           key: utilGetSetValue(key),
79789                           geometry: geometry,
79790                           query: value
79791                       }, function(err, data) {
79792                           if (!err) callback(sort(value, data));
79793                       });
79794                   }));
79795
79796
79797               function sort(value, data) {
79798                   var sameletter = [];
79799                   var other = [];
79800                   for (var i = 0; i < data.length; i++) {
79801                       if (data[i].value.substring(0, value.length) === value) {
79802                           sameletter.push(data[i]);
79803                       } else {
79804                           other.push(data[i]);
79805                       }
79806                   }
79807                   return sameletter.concat(other);
79808               }
79809           }
79810
79811
79812           function unbind() {
79813               var row = select(this);
79814
79815               row.selectAll('input.key')
79816                   .call(uiCombobox.off);
79817
79818               row.selectAll('input.value')
79819                   .call(uiCombobox.off);
79820           }
79821
79822
79823           function keyChange(d) {
79824               var kOld = d.key;
79825               var kNew = this.value.trim();
79826               var row = this.parentNode.parentNode;
79827               var inputVal = select(row).selectAll('input.value');
79828               var vNew = utilGetSetValue(inputVal);
79829
79830               // if the key looks like "key=value", split them up - #5024
79831               if (kNew.indexOf('=') !== -1) {
79832                   var parts = kNew
79833                       .split('=')
79834                       .map(function(str) { return str.trim(); })
79835                       .filter(Boolean);
79836
79837                   if (parts.length === 2) {
79838                       kNew = parts[0];
79839                       vNew = parts[1];
79840                   }
79841               }
79842
79843               // allow no change if the key should be readonly
79844               if (isReadOnly({ key: kNew })) {
79845                   this.value = kOld;
79846                   return;
79847               }
79848
79849               // switch focus if key is already in use
79850               if (kNew && kNew !== kOld) {
79851                   if (_tags[kNew] !== undefined) {      // new key is already in use
79852                       this.value = kOld;                // reset the key
79853                       list.selectAll('input.value')
79854                           .each(function(d) {
79855                               if (d.key === kNew) {     // send focus to that other value combo instead
79856                                   var input = select(this).node();
79857                                   input.focus();
79858                                   input.select();
79859                               }
79860                           });
79861                       return;
79862                   }
79863               }
79864
79865               _pendingChange  = _pendingChange || {};
79866               if (kOld) {
79867                   _pendingChange[kOld] = undefined;
79868               }
79869               _pendingChange[kNew] = vNew;
79870
79871               d.key = kNew;    // update datum to avoid exit/enter on tag update
79872               d.value = vNew;
79873
79874               this.value = kNew;
79875               utilGetSetValue(inputVal, vNew);
79876
79877               scheduleChange();
79878           }
79879
79880
79881           function valueChange(d) {
79882               if (isReadOnly(d)) return;
79883
79884               _pendingChange  = _pendingChange || {};
79885               _pendingChange[d.key] = this.value;
79886               scheduleChange();
79887           }
79888
79889
79890           function removeTag(d) {
79891               if (isReadOnly(d)) return;
79892
79893               if (d.key === '') {    // removing the blank row
79894                   _showBlank = false;
79895                   content(wrap);
79896               } else {
79897                   _pendingChange  = _pendingChange || {};
79898                   _pendingChange[d.key] = undefined;
79899                   scheduleChange();
79900               }
79901           }
79902
79903
79904           function addTag() {
79905               // Delay render in case this click is blurring an edited combo.
79906               // Without the setTimeout, the `content` render would wipe out the pending tag change.
79907               window.setTimeout(function() {
79908                   _showBlank = true;
79909                   content(wrap);
79910                   list.selectAll('li:last-child input.key').node().focus();
79911               }, 20);
79912           }
79913
79914
79915           function scheduleChange() {
79916               // Delay change in case this change is blurring an edited combo. - #5878
79917               window.setTimeout(function() {
79918                   dispatch$1.call('change', this, _pendingChange);
79919                   _pendingChange = null;
79920               }, 10);
79921           }
79922
79923       }
79924
79925
79926       rawTagEditor.state = function(val) {
79927           if (!arguments.length) return _state;
79928           if (_state !== val) {
79929               _orderedKeys = [];
79930               _state = val;
79931           }
79932           return rawTagEditor;
79933       };
79934
79935
79936       rawTagEditor.preset = function(val) {
79937           if (!arguments.length) return _preset;
79938           _preset = val;
79939           if (_preset.isFallback()) {
79940               _expanded = true;
79941               _updatePreference = false;
79942           } else {
79943               _expanded = undefined;
79944               _updatePreference = true;
79945           }
79946           return rawTagEditor;
79947       };
79948
79949
79950       rawTagEditor.tags = function(val) {
79951           if (!arguments.length) return _tags;
79952           _tags = val;
79953           return rawTagEditor;
79954       };
79955
79956
79957       rawTagEditor.entityID = function(val) {
79958           if (!arguments.length) return _entityID;
79959           if (_entityID !== val) {
79960               _orderedKeys = [];
79961               _entityID = val;
79962           }
79963           return rawTagEditor;
79964       };
79965
79966
79967       rawTagEditor.expanded = function(val) {
79968           if (!arguments.length) return _expanded;
79969           _expanded = val;
79970           _updatePreference = false;
79971           return rawTagEditor;
79972       };
79973
79974
79975       rawTagEditor.readOnlyTags = function(val) {
79976           if (!arguments.length) return _readOnlyTags;
79977           _readOnlyTags = val;
79978           return rawTagEditor;
79979       };
79980
79981
79982       return utilRebind(rawTagEditor, dispatch$1, 'on');
79983   }
79984
79985   var _changeset$1;
79986   var readOnlyTags = [
79987       /^changesets_count$/,
79988       /^created_by$/,
79989       /^ideditor:/,
79990       /^imagery_used$/,
79991       /^host$/,
79992       /^locale$/
79993   ];
79994
79995   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
79996   // from https://stackoverflow.com/a/25575009
79997   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
79998
79999
80000   function uiCommit(context) {
80001       var dispatch$1 = dispatch('cancel', 'save');
80002       var _userDetails;
80003       var _selection;
80004
80005       var changesetEditor = uiChangesetEditor(context)
80006           .on('change', changeTags);
80007       var rawTagEditor = uiRawTagEditor(context)
80008           .on('change', changeTags);
80009       var commitChanges = uiCommitChanges(context);
80010       var commitWarnings = uiCommitWarnings(context);
80011
80012
80013       function commit(selection) {
80014           _selection = selection;
80015
80016           var osm = context.connection();
80017           if (!osm) return;
80018
80019           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
80020           var commentDate = +context.storage('commentDate') || 0;
80021           var currDate = Date.now();
80022           var cutoff = 2 * 86400 * 1000;   // 2 days
80023           if (commentDate > currDate || currDate - commentDate > cutoff) {
80024               context.storage('comment', null);
80025               context.storage('hashtags', null);
80026               context.storage('source', null);
80027           }
80028
80029           var tags;
80030           // Initialize changeset if one does not exist yet.
80031           // Also pull values from local storage.
80032           if (!_changeset$1) {
80033               var detected = utilDetect();
80034               tags = {
80035                   comment: context.storage('comment') || '',
80036                   created_by: ('iD ' + context.version).substr(0, 255),
80037                   host: detected.host.substr(0, 255),
80038                   locale: detected.locale.substr(0, 255)
80039               };
80040
80041               // call findHashtags initially - this will remove stored
80042               // hashtags if any hashtags are found in the comment - #4304
80043               findHashtags(tags, true);
80044
80045               var hashtags = context.storage('hashtags');
80046               if (hashtags) {
80047                   tags.hashtags = hashtags;
80048               }
80049
80050               var source = context.storage('source');
80051               if (source) {
80052                   tags.source = source;
80053               }
80054
80055               _changeset$1 = new osmChangeset({ tags: tags });
80056           }
80057
80058           tags = clone(_changeset$1.tags);
80059
80060           // assign tags for imagery used
80061           var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
80062           tags.imagery_used = imageryUsed || 'None';
80063
80064           // assign tags for closed issues and notes
80065           var osmClosed = osm.getClosedIDs();
80066           if (osmClosed.length) {
80067               tags['closed:note'] = osmClosed.join(';').substr(0, 255);
80068           }
80069           if (services.keepRight) {
80070               var krClosed = services.keepRight.getClosedIDs();
80071               if (krClosed.length) {
80072                   tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
80073               }
80074           }
80075           if (services.improveOSM) {
80076               var iOsmClosed = services.improveOSM.getClosedIDs();
80077               if (iOsmClosed.length) {
80078                   tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
80079               }
80080           }
80081
80082           _changeset$1 = _changeset$1.update({ tags: tags });
80083
80084           var header = selection.selectAll('.header')
80085               .data([0]);
80086
80087           var headerTitle = header.enter()
80088               .append('div')
80089               .attr('class', 'header fillL header-container');
80090
80091           headerTitle
80092               .append('div')
80093               .attr('class', 'header-block header-block-outer');
80094
80095           headerTitle
80096               .append('div')
80097               .attr('class', 'header-block')
80098               .append('h3')
80099               .text(t('commit.title'));
80100
80101           headerTitle
80102               .append('div')
80103               .attr('class', 'header-block header-block-outer header-block-close')
80104               .append('button')
80105               .attr('class', 'close')
80106               .on('click', function() { context.enter(modeBrowse(context)); })
80107               .call(svgIcon('#iD-icon-close'));
80108
80109           var body = selection.selectAll('.body')
80110               .data([0]);
80111
80112           body = body.enter()
80113               .append('div')
80114               .attr('class', 'body')
80115               .merge(body);
80116
80117
80118           // Changeset Section
80119           var changesetSection = body.selectAll('.changeset-editor')
80120               .data([0]);
80121
80122           changesetSection = changesetSection.enter()
80123               .append('div')
80124               .attr('class', 'modal-section changeset-editor')
80125               .merge(changesetSection);
80126
80127           changesetSection
80128               .call(changesetEditor
80129                   .changesetID(_changeset$1.id)
80130                   .tags(tags)
80131               );
80132
80133
80134           // Warnings
80135           body.call(commitWarnings);
80136
80137
80138           // Upload Explanation
80139           var saveSection = body.selectAll('.save-section')
80140               .data([0]);
80141
80142           saveSection = saveSection.enter()
80143               .append('div')
80144               .attr('class','modal-section save-section fillL cf')
80145               .merge(saveSection);
80146
80147           var prose = saveSection.selectAll('.commit-info')
80148               .data([0]);
80149
80150           prose = prose.enter()
80151               .append('p')
80152               .attr('class', 'commit-info')
80153               .text(t('commit.upload_explanation'))
80154               .merge(prose);
80155
80156           osm.userDetails(function(err, user) {
80157               if (err) return;
80158
80159               var userLink = select(document.createElement('div'));
80160
80161               _userDetails = user;
80162
80163               if (user.image_url) {
80164                   userLink
80165                       .append('img')
80166                       .attr('src', user.image_url)
80167                       .attr('class', 'icon pre-text user-icon');
80168               }
80169
80170               userLink
80171                   .append('a')
80172                   .attr('class', 'user-info')
80173                   .text(user.display_name)
80174                   .attr('href', osm.userURL(user.display_name))
80175                   .attr('tabindex', -1)
80176                   .attr('target', '_blank');
80177
80178               prose
80179                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
80180           });
80181
80182
80183           // Request Review
80184           var requestReview = saveSection.selectAll('.request-review')
80185               .data([0]);
80186
80187           // Enter
80188           var requestReviewEnter = requestReview.enter()
80189               .append('div')
80190               .attr('class', 'request-review');
80191
80192           var labelEnter = requestReviewEnter
80193               .append('label')
80194               .attr('for', 'commit-input-request-review');
80195
80196           labelEnter
80197               .append('input')
80198               .attr('type', 'checkbox')
80199               .attr('id', 'commit-input-request-review');
80200
80201           labelEnter
80202               .append('span')
80203               .text(t('commit.request_review'));
80204
80205           // Update
80206           requestReview = requestReview
80207               .merge(requestReviewEnter);
80208
80209           var requestReviewInput = requestReview.selectAll('input')
80210               .property('checked', isReviewRequested(_changeset$1.tags))
80211               .on('change', toggleRequestReview);
80212
80213
80214           // Buttons
80215           var buttonSection = saveSection.selectAll('.buttons')
80216               .data([0]);
80217
80218           // enter
80219           var buttonEnter = buttonSection.enter()
80220               .append('div')
80221               .attr('class', 'buttons fillL cf');
80222
80223           buttonEnter
80224               .append('button')
80225               .attr('class', 'secondary-action button cancel-button')
80226               .append('span')
80227               .attr('class', 'label')
80228               .text(t('commit.cancel'));
80229
80230           var uploadButton = buttonEnter
80231               .append('button')
80232               .attr('class', 'action button save-button');
80233
80234           uploadButton.append('span')
80235               .attr('class', 'label')
80236               .text(t('commit.save'));
80237
80238           var uploadBlockerTooltipText = getUploadBlockerMessage();
80239
80240           // update
80241           buttonSection = buttonSection
80242               .merge(buttonEnter);
80243
80244           buttonSection.selectAll('.cancel-button')
80245               .on('click.cancel', function() {
80246                   var selectedID = commitChanges.entityID();
80247                   dispatch$1.call('cancel', this, selectedID);
80248               });
80249
80250           buttonSection.selectAll('.save-button')
80251               .classed('disabled', uploadBlockerTooltipText !== null)
80252               .on('click.save', function() {
80253                   if (!select(this).classed('disabled')) {
80254                       this.blur();    // avoid keeping focus on the button - #4641
80255                       dispatch$1.call('save', this, _changeset$1);
80256                   }
80257               });
80258
80259           // remove any existing tooltip
80260           tooltip().destroyAny(buttonSection.selectAll('.save-button'));
80261
80262           if (uploadBlockerTooltipText) {
80263               buttonSection.selectAll('.save-button')
80264                   .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
80265           }
80266
80267           // Raw Tag Editor
80268           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
80269               .data([0]);
80270
80271           tagSection = tagSection.enter()
80272               .append('div')
80273               .attr('class', 'modal-section tag-section raw-tag-editor')
80274               .merge(tagSection);
80275
80276           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
80277           tagSection
80278               .call(rawTagEditor
80279                   .expanded(expanded)
80280                   .readOnlyTags(readOnlyTags)
80281                   .tags(clone(_changeset$1.tags))
80282               );
80283
80284
80285           // Change summary
80286           body.call(commitChanges);
80287
80288
80289           function toggleRequestReview() {
80290               var rr = requestReviewInput.property('checked');
80291               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
80292
80293               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
80294               tagSection
80295                   .call(rawTagEditor
80296                       .expanded(expanded)
80297                       .readOnlyTags(readOnlyTags)
80298                       .tags(clone(_changeset$1.tags))
80299                   );
80300           }
80301       }
80302
80303
80304       function getUploadBlockerMessage() {
80305           var errorCount = context.validator().getErrors().length;
80306           if (errorCount > 0) {
80307               return t('commit.outstanding_errors_message', { count: errorCount });
80308
80309           } else {
80310               var n = select('#preset-input-comment').node();
80311               var hasChangesetComment = n && n.value.length > 0;
80312               if (!hasChangesetComment) {
80313                   return t('commit.comment_needed_message');
80314               }
80315           }
80316           return null;
80317       }
80318
80319
80320       function changeTags(changed, onInput) {
80321           if (changed.hasOwnProperty('comment')) {
80322               if (changed.comment === undefined) {
80323                   changed.comment = '';
80324               }
80325               if (!onInput) {
80326                   context.storage('comment', changed.comment);
80327                   context.storage('commentDate', Date.now());
80328               }
80329           }
80330           if (changed.hasOwnProperty('source')) {
80331               if (changed.source === undefined) {
80332                   context.storage('source', null);
80333               } else if (!onInput) {
80334                   context.storage('source', changed.source);
80335                   context.storage('commentDate', Date.now());
80336               }
80337           }
80338
80339           updateChangeset(changed, onInput);
80340
80341           if (_selection) {
80342               _selection.call(commit);
80343           }
80344       }
80345
80346
80347       function findHashtags(tags, commentOnly) {
80348           var inComment = commentTags();
80349           var inHashTags = hashTags();
80350
80351           if (inComment !== null) {                    // when hashtags are detected in comment...
80352               context.storage('hashtags', null);       // always remove stored hashtags - #4304
80353               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
80354           }
80355           return unionBy(inComment, inHashTags, function (s) {
80356               return s.toLowerCase();
80357           });
80358
80359           // Extract hashtags from `comment`
80360           function commentTags() {
80361               return tags.comment
80362                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
80363                   .match(hashtagRegex);
80364           }
80365
80366           // Extract and clean hashtags from `hashtags`
80367           function hashTags() {
80368               var t = tags.hashtags || '';
80369               return t
80370                   .split(/[,;\s]+/)
80371                   .map(function (s) {
80372                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
80373                       var matched = s.match(hashtagRegex);
80374                       return matched && matched[0];
80375                   }).filter(Boolean);                       // exclude falsey
80376           }
80377       }
80378
80379
80380       function isReviewRequested(tags) {
80381           var rr = tags.review_requested;
80382           if (rr === undefined) return false;
80383           rr = rr.trim().toLowerCase();
80384           return !(rr === '' || rr === 'no');
80385       }
80386
80387
80388       function updateChangeset(changed, onInput) {
80389           var tags = clone(_changeset$1.tags);
80390
80391           forEach(changed, function(v, k) {
80392               k = k.trim().substr(0, 255);
80393               if (readOnlyTags.indexOf(k) !== -1) return;
80394
80395               if (k !== '' && v !== undefined) {
80396                   if (onInput) {
80397                       tags[k] = v;
80398                   } else {
80399                       tags[k] = v.trim().substr(0, 255);
80400                   }
80401               } else {
80402                   delete tags[k];
80403               }
80404           });
80405
80406           if (!onInput) {
80407               // when changing the comment, override hashtags with any found in comment.
80408               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
80409               var arr = findHashtags(tags, commentOnly);
80410               if (arr.length) {
80411                   tags.hashtags = arr.join(';').substr(0, 255);
80412                   context.storage('hashtags', tags.hashtags);
80413               } else {
80414                   delete tags.hashtags;
80415                   context.storage('hashtags', null);
80416               }
80417           }
80418
80419           // always update userdetails, just in case user reauthenticates as someone else
80420           if (_userDetails && _userDetails.changesets_count !== undefined) {
80421               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
80422               tags.changesets_count = String(changesetsCount);
80423
80424               // first 100 edits - new user
80425               if (changesetsCount <= 100) {
80426                   var s;
80427                   s = context.storage('walkthrough_completed');
80428                   if (s) {
80429                       tags['ideditor:walkthrough_completed'] = s;
80430                   }
80431
80432                   s = context.storage('walkthrough_progress');
80433                   if (s) {
80434                       tags['ideditor:walkthrough_progress'] = s;
80435                   }
80436
80437                   s = context.storage('walkthrough_started');
80438                   if (s) {
80439                       tags['ideditor:walkthrough_started'] = s;
80440                   }
80441               }
80442           } else {
80443               delete tags.changesets_count;
80444           }
80445
80446           if (!isEqual(_changeset$1.tags, tags)) {
80447               _changeset$1 = _changeset$1.update({ tags: tags });
80448           }
80449       }
80450
80451
80452       commit.reset = function() {
80453           _changeset$1 = null;
80454       };
80455
80456
80457       return utilRebind(commit, dispatch$1, 'on');
80458   }
80459
80460   function uiConflicts(context) {
80461       var dispatch$1 = dispatch('cancel', 'save');
80462       var keybinding = utilKeybinding('conflicts');
80463       var _origChanges;
80464       var _conflictList;
80465
80466
80467       function keybindingOn() {
80468           select(document)
80469               .call(keybinding.on('⎋', cancel, true));
80470       }
80471
80472       function keybindingOff() {
80473           select(document)
80474               .call(keybinding.unbind);
80475       }
80476
80477       function tryAgain() {
80478           keybindingOff();
80479           dispatch$1.call('save');
80480       }
80481
80482       function cancel() {
80483           keybindingOff();
80484           dispatch$1.call('cancel');
80485       }
80486
80487
80488       function conflicts(selection) {
80489           keybindingOn();
80490
80491           var headerEnter = selection.selectAll('.header')
80492               .data([0])
80493               .enter()
80494               .append('div')
80495               .attr('class', 'header fillL');
80496
80497           headerEnter
80498               .append('button')
80499               .attr('class', 'fr')
80500               .on('click', cancel)
80501               .call(svgIcon('#iD-icon-close'));
80502
80503           headerEnter
80504               .append('h3')
80505               .text(t('save.conflict.header'));
80506
80507           var bodyEnter = selection.selectAll('.body')
80508               .data([0])
80509               .enter()
80510               .append('div')
80511               .attr('class', 'body fillL');
80512
80513           var conflictsHelpEnter = bodyEnter
80514               .append('div')
80515               .attr('class', 'conflicts-help')
80516               .text(t('save.conflict.help'));
80517
80518
80519           // Download changes link
80520           var detected = utilDetect();
80521           var changeset = new osmChangeset();
80522
80523           delete changeset.id;  // Export without changeset_id
80524
80525           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
80526           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
80527           var fileName = 'changes.osc';
80528
80529           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
80530               .append('a')
80531               .attr('class', 'download-changes');
80532
80533           if (detected.download) {      // All except IE11 and Edge
80534               linkEnter                 // download the data as a file
80535                   .attr('href', window.URL.createObjectURL(blob))
80536                   .attr('download', fileName);
80537
80538           } else {                      // IE11 and Edge
80539               linkEnter                 // open data uri in a new tab
80540                   .attr('target', '_blank')
80541                   .on('click.download', function() {
80542                       navigator.msSaveBlob(blob, fileName);
80543                   });
80544           }
80545
80546           linkEnter
80547               .call(svgIcon('#iD-icon-load', 'inline'))
80548               .append('span')
80549               .text(t('save.conflict.download_changes'));
80550
80551
80552           bodyEnter
80553               .append('div')
80554               .attr('class', 'conflict-container fillL3')
80555               .call(showConflict, 0);
80556
80557           bodyEnter
80558               .append('div')
80559               .attr('class', 'conflicts-done')
80560               .attr('opacity', 0)
80561               .style('display', 'none')
80562               .text(t('save.conflict.done'));
80563
80564           var buttonsEnter = bodyEnter
80565               .append('div')
80566               .attr('class','buttons col12 joined conflicts-buttons');
80567
80568           buttonsEnter
80569               .append('button')
80570               .attr('disabled', _conflictList.length > 1)
80571               .attr('class', 'action conflicts-button col6')
80572               .text(t('save.title'))
80573               .on('click.try_again', tryAgain);
80574
80575           buttonsEnter
80576               .append('button')
80577               .attr('class', 'secondary-action conflicts-button col6')
80578               .text(t('confirm.cancel'))
80579               .on('click.cancel', cancel);
80580       }
80581
80582
80583       function showConflict(selection, index) {
80584           index = utilWrap(index, _conflictList.length);
80585
80586           var parent = select(selection.node().parentNode);
80587
80588           // enable save button if this is the last conflict being reviewed..
80589           if (index === _conflictList.length - 1) {
80590               window.setTimeout(function() {
80591                   parent.select('.conflicts-button')
80592                       .attr('disabled', null);
80593
80594                   parent.select('.conflicts-done')
80595                       .transition()
80596                       .attr('opacity', 1)
80597                       .style('display', 'block');
80598               }, 250);
80599           }
80600
80601           var conflict = selection
80602               .selectAll('.conflict')
80603               .data([_conflictList[index]]);
80604
80605           conflict.exit()
80606               .remove();
80607
80608           var conflictEnter = conflict.enter()
80609               .append('div')
80610               .attr('class', 'conflict');
80611
80612           conflictEnter
80613               .append('h4')
80614               .attr('class', 'conflict-count')
80615               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
80616
80617           conflictEnter
80618               .append('a')
80619               .attr('class', 'conflict-description')
80620               .attr('href', '#')
80621               .text(function(d) { return d.name; })
80622               .on('click', function(d) {
80623                   event.preventDefault();
80624                   zoomToEntity(d.id);
80625               });
80626
80627           var details = conflictEnter
80628               .append('div')
80629               .attr('class', 'conflict-detail-container');
80630
80631           details
80632               .append('ul')
80633               .attr('class', 'conflict-detail-list')
80634               .selectAll('li')
80635               .data(function(d) { return d.details || []; })
80636               .enter()
80637               .append('li')
80638               .attr('class', 'conflict-detail-item')
80639               .html(function(d) { return d; });
80640
80641           details
80642               .append('div')
80643               .attr('class', 'conflict-choices')
80644               .call(addChoices);
80645
80646           details
80647               .append('div')
80648               .attr('class', 'conflict-nav-buttons joined cf')
80649               .selectAll('button')
80650               .data(['previous', 'next'])
80651               .enter()
80652               .append('button')
80653               .text(function(d) { return t('save.conflict.' + d); })
80654               .attr('class', 'conflict-nav-button action col6')
80655               .attr('disabled', function(d, i) {
80656                   return (i === 0 && index === 0) ||
80657                       (i === 1 && index === _conflictList.length - 1) || null;
80658               })
80659               .on('click', function(d, i) {
80660                   event.preventDefault();
80661
80662                   var container = parent.selectAll('.conflict-container');
80663                   var sign = (i === 0 ? -1 : 1);
80664
80665                   container
80666                       .selectAll('.conflict')
80667                       .remove();
80668
80669                   container
80670                       .call(showConflict, index + sign);
80671               });
80672
80673       }
80674
80675
80676       function addChoices(selection) {
80677           var choices = selection
80678               .append('ul')
80679               .attr('class', 'layer-list')
80680               .selectAll('li')
80681               .data(function(d) { return d.choices || []; });
80682
80683           // enter
80684           var choicesEnter = choices.enter()
80685               .append('li')
80686               .attr('class', 'layer');
80687
80688           var labelEnter = choicesEnter
80689               .append('label');
80690
80691           labelEnter
80692               .append('input')
80693               .attr('type', 'radio')
80694               .attr('name', function(d) { return d.id; })
80695               .on('change', function(d, i) {
80696                   var ul = this.parentNode.parentNode.parentNode;
80697                   ul.__data__.chosen = i;
80698                   choose(ul, d);
80699               });
80700
80701           labelEnter
80702               .append('span')
80703               .text(function(d) { return d.text; });
80704
80705           // update
80706           choicesEnter
80707               .merge(choices)
80708               .each(function(d, i) {
80709                   var ul = this.parentNode;
80710                   if (ul.__data__.chosen === i) {
80711                       choose(ul, d);
80712                   }
80713               });
80714       }
80715
80716
80717       function choose(ul, datum) {
80718           if (event) event.preventDefault();
80719
80720           select(ul)
80721               .selectAll('li')
80722               .classed('active', function(d) { return d === datum; })
80723               .selectAll('input')
80724               .property('checked', function(d) { return d === datum; });
80725
80726           var extent = geoExtent();
80727           var entity;
80728
80729           entity = context.graph().hasEntity(datum.id);
80730           if (entity) extent._extend(entity.extent(context.graph()));
80731
80732           datum.action();
80733
80734           entity = context.graph().hasEntity(datum.id);
80735           if (entity) extent._extend(entity.extent(context.graph()));
80736
80737           zoomToEntity(datum.id, extent);
80738       }
80739
80740
80741       function zoomToEntity(id, extent) {
80742           context.surface().selectAll('.hover')
80743               .classed('hover', false);
80744
80745           var entity = context.graph().hasEntity(id);
80746           if (entity) {
80747               if (extent) {
80748                   context.map().trimmedExtent(extent);
80749               } else {
80750                   context.map().zoomToEase(entity);
80751               }
80752               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
80753                   .classed('hover', true);
80754           }
80755       }
80756
80757
80758       // The conflict list should be an array of objects like:
80759       // {
80760       //     id: id,
80761       //     name: entityName(local),
80762       //     details: merge.conflicts(),
80763       //     chosen: 1,
80764       //     choices: [
80765       //         choice(id, keepMine, forceLocal),
80766       //         choice(id, keepTheirs, forceRemote)
80767       //     ]
80768       // }
80769       conflicts.conflictList = function(_) {
80770           if (!arguments.length) return _conflictList;
80771           _conflictList = _;
80772           return conflicts;
80773       };
80774
80775
80776       conflicts.origChanges = function(_) {
80777           if (!arguments.length) return _origChanges;
80778           _origChanges = _;
80779           return conflicts;
80780       };
80781
80782
80783       return utilRebind(conflicts, dispatch$1, 'on');
80784   }
80785
80786   function uiDataEditor(context) {
80787       var dataHeader = uiDataHeader();
80788       var quickLinks = uiQuickLinks();
80789       var rawTagEditor = uiRawTagEditor(context);
80790       var _datum;
80791
80792
80793       function dataEditor(selection) {
80794           // quick links
80795           var choices = [{
80796               id: 'zoom_to',
80797               label: 'inspector.zoom_to.title',
80798               tooltip: function() {
80799                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
80800               },
80801               click: function zoomTo() {
80802                   context.mode().zoomToSelected();
80803               }
80804           }];
80805
80806
80807           var header = selection.selectAll('.header')
80808               .data([0]);
80809
80810           var headerEnter = header.enter()
80811               .append('div')
80812               .attr('class', 'header fillL');
80813
80814           headerEnter
80815               .append('button')
80816               .attr('class', 'fr data-editor-close')
80817               .on('click', function() {
80818                   context.enter(modeBrowse(context));
80819               })
80820               .call(svgIcon('#iD-icon-close'));
80821
80822           headerEnter
80823               .append('h3')
80824               .text(t('map_data.title'));
80825
80826
80827           var body = selection.selectAll('.body')
80828               .data([0]);
80829
80830           body = body.enter()
80831               .append('div')
80832               .attr('class', 'body')
80833               .merge(body);
80834
80835           var editor = body.selectAll('.data-editor')
80836               .data([0]);
80837
80838           editor.enter()
80839               .append('div')
80840               .attr('class', 'modal-section data-editor')
80841               .merge(editor)
80842               .call(dataHeader.datum(_datum))
80843               .call(quickLinks.choices(choices));
80844
80845           var rte = body.selectAll('.raw-tag-editor')
80846               .data([0]);
80847
80848           rte.enter()
80849               .append('div')
80850               .attr('class', 'raw-tag-editor inspector-inner data-editor')
80851               .merge(rte)
80852               .call(rawTagEditor
80853                   .expanded(true)
80854                   .readOnlyTags([/./])
80855                   .tags((_datum && _datum.properties) || {})
80856                   .state('hover')
80857               );
80858       }
80859
80860
80861       dataEditor.datum = function(val) {
80862           if (!arguments.length) return _datum;
80863           _datum = val;
80864           return this;
80865       };
80866
80867
80868       return dataEditor;
80869   }
80870
80871   function uiDataHeader() {
80872       var _datum;
80873
80874
80875       function dataHeader(selection) {
80876           var header = selection.selectAll('.data-header')
80877               .data(
80878                   (_datum ? [_datum] : []),
80879                   function(d) { return d.__featurehash__; }
80880               );
80881
80882           header.exit()
80883               .remove();
80884
80885           var headerEnter = header.enter()
80886               .append('div')
80887               .attr('class', 'data-header');
80888
80889           var iconEnter = headerEnter
80890               .append('div')
80891               .attr('class', 'data-header-icon');
80892
80893           iconEnter
80894               .append('div')
80895               .attr('class', 'preset-icon-28')
80896               .call(svgIcon('#iD-icon-data', 'note-fill'));
80897
80898           headerEnter
80899               .append('div')
80900               .attr('class', 'data-header-label')
80901               .text(t('map_data.layers.custom.title'));
80902       }
80903
80904
80905       dataHeader.datum = function(val) {
80906           if (!arguments.length) return _datum;
80907           _datum = val;
80908           return this;
80909       };
80910
80911
80912       return dataHeader;
80913   }
80914
80915   function uiEditMenu(context, operations) {
80916       var menu;
80917       var center = [0, 0];
80918       var offset = [0, 0];
80919       var tooltip;
80920
80921       var p = 8;               // top padding
80922       var m = 4;               // top margin
80923       var h = 15;              // height of icon
80924       var vpBottomMargin = 45; // viewport bottom margin
80925       var vpSideMargin = 35;   // viewport side margin
80926       var buttonWidth = 44;
80927       var buttonHeight = (2 * p + h);
80928       var menuWidth = buttonWidth;
80929       var menuHeight = (2 * m) + operations.length * buttonHeight;
80930       var menuSideMargin = 10;
80931       var tooltipWidth = 200;
80932       var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
80933
80934
80935       var editMenu = function (selection) {
80936           if (!operations.length) return;
80937
80938           selection.node().parentNode.focus();
80939
80940           var isRTL = textDirection === 'rtl';
80941           var viewport = context.surfaceRect();
80942
80943           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
80944               // menu is going left-to-right and near right viewport edge, go left instead
80945               isRTL = true;
80946           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
80947               // menu is going right-to-left and near left viewport edge, go right instead
80948               isRTL = false;
80949           }
80950
80951           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
80952
80953           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
80954               // menu is near bottom viewport edge, shift upwards
80955               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
80956           }
80957
80958           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
80959
80960           menu = selection
80961               .append('g')
80962               .attr('class', 'edit-menu')
80963               .attr('transform', 'translate(' + origin + ')')
80964               .attr('opacity', 0);
80965
80966           menu
80967               .transition()
80968               .attr('opacity', 1);
80969
80970           menu
80971               .append('rect')
80972               .attr('class', 'edit-menu-background')
80973               .attr('x', 4)
80974               .attr('rx', 4)
80975               .attr('ry', 4)
80976               .attr('width', menuWidth)
80977               .attr('height', menuHeight)
80978               .attr('stroke-linecap', 'round');
80979
80980
80981           var button = menu.selectAll('.edit-menu-item')
80982               .data(operations)
80983               .enter()
80984               .append('g')
80985               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
80986               .classed('disabled', function (d) { return d.disabled(); })
80987               .attr('transform', function (d, i) {
80988                   return 'translate(' + geoVecFloor([
80989                       0,
80990                       m + i * buttonHeight
80991                   ]).join(',') + ')';
80992               });
80993
80994           button
80995               .append('rect')
80996               .attr('x', 4)
80997               .attr('width', buttonWidth)
80998               .attr('height', buttonHeight)
80999               .on('click', click)
81000               .on('mousedown', mousedown)
81001               .on('mouseover', mouseover)
81002               .on('mouseout', mouseout);
81003
81004           button
81005               .append('use')
81006               .attr('width', '20')
81007               .attr('height', '20')
81008               .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
81009               .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
81010
81011           tooltip = select('#id-container')
81012               .append('div')
81013               .attr('class', 'tooltip-inner edit-menu-tooltip');
81014
81015
81016           function click(operation) {
81017               event.stopPropagation();
81018               if (operation.disabled()) return;
81019               operation();
81020               editMenu.close();
81021           }
81022
81023           function mousedown() {
81024               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
81025           }
81026
81027           function mouseover(d, i) {
81028               var tipX, tipY;
81029
81030               if (!isRTL) {
81031                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
81032               } else {
81033                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
81034               }
81035
81036               if (tipX + tooltipWidth > viewport.right) {
81037                   // tip is going left-to-right and near right viewport edge, go left instead
81038                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
81039               } else if (tipX < viewport.left) {
81040                   // tip is going right-to-left and near left viewport edge, go right instead
81041                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
81042               }
81043
81044               tipY = viewport.top + origin[1] + (i * buttonHeight);
81045               if (tipY + tooltipHeight > viewport.bottom) {
81046                   // tip is near bottom viewport edge, shift upwards
81047                   tipY -= tipY + tooltipHeight - viewport.bottom;
81048               }
81049
81050               tooltip
81051                   .style('left', tipX + 'px')
81052                   .style('top', tipY + 'px')
81053                   .style('display', 'block')
81054                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
81055           }
81056
81057           function mouseout() {
81058               tooltip.style('display', 'none');
81059           }
81060       };
81061
81062
81063       editMenu.close = function () {
81064           if (menu) {
81065               menu
81066                   .style('pointer-events', 'none')
81067                   .transition()
81068                   .attr('opacity', 0)
81069                   .remove();
81070           }
81071
81072           if (tooltip) {
81073               tooltip.remove();
81074           }
81075       };
81076
81077
81078       editMenu.center = function (_) {
81079           if (!arguments.length) return center;
81080           center = _;
81081           return editMenu;
81082       };
81083
81084
81085       return editMenu;
81086   }
81087
81088   function uiPresetIcon() {
81089       var preset, geometry;
81090
81091
81092       function presetIcon(selection) {
81093           selection.each(render);
81094       }
81095
81096
81097       function getIcon(p, geom) {
81098           if (p.icon)
81099               return p.icon;
81100           else if (geom === 'line')
81101               return 'iD-other-line';
81102           else if (geom === 'vertex')
81103               return p.isFallback() ? '' : 'temaki-vertex';
81104           else
81105               return 'maki-marker-stroked';
81106       }
81107
81108
81109       function render() {
81110           var selection = select(this);
81111           var p = preset.apply(this, arguments);
81112           var geom = geometry.apply(this, arguments);
81113           var picon = getIcon(p, geom);
81114           var isMaki = /^maki-/.test(picon);
81115           var isTemaki = /^temaki-/.test(picon);
81116           var isFa = /^fa[srb]-/.test(picon);
81117           var isPOI = isMaki || isTemaki || isFa;
81118           var isCategory = !p.setTags;
81119           var drawLine = geom === 'line' && !isCategory;
81120           var isFramed = (geom === 'area' || drawLine || geom === 'vertex');
81121
81122           var tags = !isCategory ? p.setTags({}, geom) : {};
81123           for (var k in tags) {
81124               if (tags[k] === '*') {
81125                   tags[k] = 'yes';
81126               }
81127           }
81128           var tagClasses = svgTagClasses().getClassesString(tags, '');
81129
81130           var fill = selection.selectAll('.preset-icon-fill')
81131               .data([0]);
81132
81133           fill = fill.enter()
81134               .append('div')
81135               .merge(fill);
81136
81137           fill
81138               .attr('class', function() {
81139                   return 'preset-icon-fill preset-icon-fill-' + geom + ' ' + tagClasses;
81140               });
81141
81142           var line = selection.selectAll('.preset-icon-line')
81143               .data(drawLine ? [0] : []);
81144
81145           line.exit()
81146               .remove();
81147
81148           // draw the line parametrically
81149           var w = 60, h = 60, y = 43, l = 36, r = 2.5;
81150           var x1 = (w - l)/2, x2 = x1 + l;
81151
81152           var lineEnter = line.enter()
81153               .append('svg')
81154               .attr('class', 'preset-icon-line')
81155               .attr('width', w)
81156               .attr('height', h)
81157               .attr('viewBox', '0 0 ' + w + ' ' + h);
81158
81159           lineEnter.append('path')
81160               .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
81161               .attr('class', 'line casing');
81162           lineEnter.append('path')
81163               .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
81164               .attr('class', 'line stroke');
81165           lineEnter.append('circle')
81166               .attr('class', 'vertex')
81167               .attr('cx', x1 - 1)
81168               .attr('cy', y)
81169               .attr('r', r);
81170           lineEnter.append('circle')
81171               .attr('class', 'vertex')
81172               .attr('cx', x2 + 1)
81173               .attr('cy', y)
81174               .attr('r', r);
81175
81176           line = lineEnter.merge(line);
81177
81178           line.selectAll('path.stroke')
81179               .attr('class', 'line stroke ' + tagClasses);
81180           line.selectAll('path.casing')
81181               .attr('class', 'line casing ' + tagClasses);
81182
81183
81184           var areaFrame = selection.selectAll('.preset-icon-frame')
81185               .data((geom === 'area') ? [0] : []);
81186
81187           areaFrame.exit()
81188               .remove();
81189
81190           areaFrame = areaFrame.enter()
81191               .append('div')
81192               .attr('class', 'preset-icon-frame')
81193               .call(svgIcon('#iD-preset-icon-frame'));
81194
81195
81196           var icon = selection.selectAll('.preset-icon')
81197               .data([0]);
81198
81199           icon = icon.enter()
81200               .append('div')
81201               .attr('class', 'preset-icon')
81202               .call(svgIcon(''))
81203               .merge(icon);
81204
81205           icon
81206               .attr('class', 'preset-icon ' + geom + '-geom ' + 'preset-icon-' +
81207                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
81208               );
81209
81210           icon.selectAll('svg')
81211               .attr('class', function() {
81212                   return 'icon ' + picon + ' ' + (isPOI && geom !== 'line'  ? '' : tagClasses);
81213               });
81214
81215           icon.selectAll('use')
81216               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
81217       }
81218
81219
81220       presetIcon.preset = function(val) {
81221           if (!arguments.length) return preset;
81222           preset = utilFunctor(val);
81223           return presetIcon;
81224       };
81225
81226
81227       presetIcon.geometry = function(val) {
81228           if (!arguments.length) return geometry;
81229           geometry = utilFunctor(val);
81230           return presetIcon;
81231       };
81232
81233       return presetIcon;
81234   }
81235
81236   function uiQuickLinks() {
81237       var _choices = [];
81238
81239
81240       function quickLinks(selection) {
81241           var container = selection.selectAll('.quick-links')
81242               .data([0]);
81243
81244           container = container.enter()
81245               .append('div')
81246               .attr('class', 'quick-links')
81247               .merge(container);
81248
81249           var items = container.selectAll('.quick-link')
81250               .data(_choices, function(d) { return d.id; });
81251
81252           items.exit()
81253               .remove();
81254
81255           items.enter()
81256               .append('a')
81257               .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
81258               .attr('href', '#')
81259               .text(function(d) { return t(d.label); })
81260               .each(function(d) {
81261                   if (typeof d.tooltip !== 'function') return;
81262                   select(this)
81263                       .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
81264               })
81265               .on('click', function(d) {
81266                   if (typeof d.click !== 'function') return;
81267                   event.preventDefault();
81268                   d.click(d);
81269               });
81270       }
81271
81272
81273       //  val should be an array of choices like:
81274       //    [{
81275       //       id: 'link-id',
81276       //       label: 'translation.key',
81277       //       tooltip: function(d),
81278       //       click: function(d)
81279       //    }, ..]
81280       quickLinks.choices = function(val) {
81281           if (!arguments.length) return _choices;
81282           _choices = val;
81283           return quickLinks;
81284       };
81285
81286
81287       return quickLinks;
81288   }
81289
81290   function uiRawMemberEditor(context) {
81291       var taginfo = services.taginfo;
81292       var _entityID;
81293
81294       function downloadMember(d) {
81295           event.preventDefault();
81296
81297           // display the loading indicator
81298           select(this.parentNode).classed('tag-reference-loading', true);
81299           context.loadEntity(d.id);
81300       }
81301
81302       function zoomToMember(d) {
81303           event.preventDefault();
81304
81305           var entity = context.entity(d.id);
81306           context.map().zoomTo(entity);
81307
81308           // highlight the feature in case it wasn't previously on-screen
81309           utilHighlightEntities([d.id], true, context);
81310       }
81311
81312
81313       function selectMember(d) {
81314           event.preventDefault();
81315
81316           // remove the hover-highlight styling
81317           utilHighlightEntities([d.id], false, context);
81318
81319           var entity = context.entity(d.id);
81320           var mapExtent = context.map().extent();
81321           if (!entity.intersects(mapExtent, context.graph())) {
81322               // zoom to the entity if its extent is not visible now
81323               context.map().zoomToEase(entity);
81324           }
81325
81326           context.enter(modeSelect(context, [d.id]));
81327       }
81328
81329
81330       function changeRole(d) {
81331           var oldRole = d.role;
81332           var newRole = select(this).property('value');
81333
81334           if (oldRole !== newRole) {
81335               var member = { id: d.id, type: d.type, role: newRole };
81336               context.perform(
81337                   actionChangeMember(d.relation.id, member, d.index),
81338                   t('operations.change_role.annotation')
81339               );
81340           }
81341       }
81342
81343
81344       function deleteMember(d) {
81345           context.perform(
81346               actionDeleteMember(d.relation.id, d.index),
81347               t('operations.delete_member.annotation')
81348           );
81349
81350           if (!context.hasEntity(d.relation.id)) {
81351               context.enter(modeBrowse(context));
81352           }
81353
81354           utilHighlightEntities([d.id], false, context);
81355       }
81356
81357
81358       function rawMemberEditor(selection) {
81359           var entity = context.entity(_entityID);
81360           var memberships = [];
81361
81362           entity.members.slice(0, 1000).forEach(function(member, index) {
81363               memberships.push({
81364                   index: index,
81365                   id: member.id,
81366                   type: member.type,
81367                   role: member.role,
81368                   relation: entity,
81369                   member: context.hasEntity(member.id)
81370               });
81371           });
81372
81373           var gt = entity.members.length > 1000 ? '>' : '';
81374           selection.call(uiDisclosure(context, 'raw_member_editor', true)
81375               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
81376               .expanded(true)
81377               .updatePreference(false)
81378               .on('toggled', function(expanded) {
81379                   if (expanded) {
81380                       selection.node().parentNode.scrollTop += 200;
81381                   }
81382               })
81383               .content(content)
81384           );
81385
81386
81387           function content(selection) {
81388               var list = selection.selectAll('.member-list')
81389                   .data([0]);
81390
81391               list = list.enter()
81392                   .append('ul')
81393                   .attr('class', 'member-list')
81394                   .merge(list);
81395
81396
81397               var items = list.selectAll('li')
81398                   .data(memberships, function(d) {
81399                       return osmEntity.key(d.relation) + ',' + d.index + ',' +
81400                           (d.member ? osmEntity.key(d.member) : 'incomplete');
81401                   });
81402
81403               items.exit()
81404                   .each(unbind)
81405                   .remove();
81406
81407               var itemsEnter = items.enter()
81408                   .append('li')
81409                   .attr('class', 'member-row form-field')
81410                   .classed('member-incomplete', function(d) { return !d.member; });
81411
81412               itemsEnter
81413                   .each(function(d) {
81414                       var item = select(this);
81415
81416                       var label = item
81417                           .append('label')
81418                           .attr('class', 'form-field-label');
81419
81420                       if (d.member) {
81421                           // highlight the member feature in the map while hovering on the list item
81422                           item
81423                               .on('mouseover', function() {
81424                                   utilHighlightEntities([d.id], true, context);
81425                               })
81426                               .on('mouseout', function() {
81427                                   utilHighlightEntities([d.id], false, context);
81428                               });
81429
81430                           var labelLink = label
81431                               .append('span')
81432                               .attr('class', 'label-text')
81433                               .append('a')
81434                               .attr('href', '#')
81435                               .on('click', selectMember);
81436
81437                           labelLink
81438                               .append('span')
81439                               .attr('class', 'member-entity-type')
81440                               .text(function(d) {
81441                                   var matched = context.presets().match(d.member, context.graph());
81442                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
81443                               });
81444
81445                           labelLink
81446                               .append('span')
81447                               .attr('class', 'member-entity-name')
81448                               .text(function(d) { return utilDisplayName(d.member); });
81449
81450                           label
81451                               .append('button')
81452                               .attr('class', 'member-zoom')
81453                               .attr('title', t('icons.zoom_to'))
81454                               .attr('tabindex', -1)
81455                               .call(svgIcon('#iD-icon-geolocate'))
81456                               .on('click', zoomToMember);
81457
81458                       } else {
81459                           var labelText = label
81460                               .append('span')
81461                               .attr('class', 'label-text');
81462
81463                           labelText
81464                               .append('span')
81465                               .attr('class', 'member-entity-type')
81466                               .text(t('inspector.' + d.type, { id: d.id }));
81467
81468                           labelText
81469                               .append('span')
81470                               .attr('class', 'member-entity-name')
81471                               .text(t('inspector.incomplete', { id: d.id }));
81472
81473                           label
81474                               .append('button')
81475                               .attr('class', 'member-download')
81476                               .attr('title', t('icons.download'))
81477                               .attr('tabindex', -1)
81478                               .call(svgIcon('#iD-icon-load'))
81479                               .on('click', downloadMember);
81480                       }
81481                   });
81482
81483               var wrapEnter = itemsEnter
81484                   .append('div')
81485                   .attr('class', 'form-field-input-wrap form-field-input-member');
81486
81487               wrapEnter
81488                   .append('input')
81489                   .attr('class', 'member-role')
81490                   .property('type', 'text')
81491                   .attr('maxlength', 255)
81492                   .attr('placeholder', t('inspector.role'))
81493                   .call(utilNoAuto);
81494
81495               wrapEnter
81496                   .append('button')
81497                   .attr('tabindex', -1)
81498                   .attr('title', t('icons.remove'))
81499                   .attr('class', 'remove form-field-button member-delete')
81500                   .call(svgIcon('#iD-operation-delete'));
81501
81502               if (taginfo) {
81503                   wrapEnter.each(bindTypeahead);
81504               }
81505
81506
81507               // update
81508               items = items
81509                   .merge(itemsEnter);
81510
81511               items.select('input.member-role')
81512                   .property('value', function(d) { return d.role; })
81513                   .on('blur', changeRole)
81514                   .on('change', changeRole);
81515
81516               items.select('button.member-delete')
81517                   .on('click', deleteMember);
81518
81519
81520
81521               function bindTypeahead(d) {
81522                   var row = select(this);
81523                   var role = row.selectAll('input.member-role');
81524                   var origValue = role.property('value');
81525
81526                   function sort(value, data) {
81527                       var sameletter = [];
81528                       var other = [];
81529                       for (var i = 0; i < data.length; i++) {
81530                           if (data[i].value.substring(0, value.length) === value) {
81531                               sameletter.push(data[i]);
81532                           } else {
81533                               other.push(data[i]);
81534                           }
81535                       }
81536                       return sameletter.concat(other);
81537                   }
81538
81539                   role.call(uiCombobox(context, 'member-role')
81540                       .fetcher(function(role, callback) {
81541                           // The `geometry` param is used in the `taginfo.js` interface for
81542                           // filtering results, as a key into the `tag_members_fractions`
81543                           // object.  If we don't know the geometry because the member is
81544                           // not yet downloaded, it's ok to guess based on type.
81545                           var geometry;
81546                           if (d.member) {
81547                               geometry = context.geometry(d.member.id);
81548                           } else if (d.type === 'relation') {
81549                               geometry = 'relation';
81550                           } else if (d.type === 'way') {
81551                               geometry = 'line';
81552                           } else {
81553                               geometry = 'point';
81554                           }
81555
81556                           var rtype = entity.tags.type;
81557                           taginfo.roles({
81558                               debounce: true,
81559                               rtype: rtype || '',
81560                               geometry: geometry,
81561                               query: role
81562                           }, function(err, data) {
81563                               if (!err) callback(sort(role, data));
81564                           });
81565                       })
81566                       .on('cancel', function() {
81567                           role.property('value', origValue);
81568                       })
81569                   );
81570               }
81571
81572
81573               function unbind() {
81574                   var row = select(this);
81575
81576                   row.selectAll('input.member-role')
81577                       .call(uiCombobox.off);
81578               }
81579           }
81580       }
81581
81582
81583       rawMemberEditor.entityID = function(val) {
81584           if (!arguments.length) return _entityID;
81585           _entityID = val;
81586           return rawMemberEditor;
81587       };
81588
81589
81590       return rawMemberEditor;
81591   }
81592
81593   function uiRawMembershipEditor(context) {
81594       var taginfo = services.taginfo;
81595       var nearbyCombo = uiCombobox(context, 'parent-relation')
81596           .minItems(1)
81597           .fetcher(fetchNearbyRelations);
81598       var _inChange = false;
81599       var _entityID;
81600       var _showBlank;
81601
81602
81603       function selectRelation(d) {
81604           event.preventDefault();
81605
81606           // remove the hover-highlight styling
81607           utilHighlightEntities([d.relation.id], false, context);
81608
81609           context.enter(modeSelect(context, [d.relation.id]));
81610       }
81611
81612
81613       function changeRole(d) {
81614           if (d === 0) return;    // called on newrow (shoudn't happen)
81615           if (_inChange) return;  // avoid accidental recursive call #5731
81616
81617           var oldRole = d.member.role;
81618           var newRole = select(this).property('value');
81619
81620           if (oldRole !== newRole) {
81621               _inChange = true;
81622               context.perform(
81623                   actionChangeMember(d.relation.id, assignIn({}, d.member, { role: newRole }), d.index),
81624                   t('operations.change_role.annotation')
81625               );
81626           }
81627           _inChange = false;
81628       }
81629
81630
81631       function addMembership(d, role) {
81632           this.blur();           // avoid keeping focus on the button
81633           _showBlank = false;
81634
81635           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
81636
81637           if (d.relation) {
81638               context.perform(
81639                   actionAddMember(d.relation.id, member),
81640                   t('operations.add_member.annotation')
81641               );
81642
81643           } else {
81644               var relation = osmRelation();
81645               context.perform(
81646                   actionAddEntity(relation),
81647                   actionAddMember(relation.id, member),
81648                   t('operations.add.annotation.relation')
81649               );
81650
81651               context.enter(modeSelect(context, [relation.id]).newFeature(true));
81652           }
81653       }
81654
81655
81656       function deleteMembership(d) {
81657           this.blur();           // avoid keeping focus on the button
81658           if (d === 0) return;   // called on newrow (shoudn't happen)
81659
81660           context.perform(
81661               actionDeleteMember(d.relation.id, d.index),
81662               t('operations.delete_member.annotation')
81663           );
81664       }
81665
81666
81667       function fetchNearbyRelations(q, callback) {
81668           var newRelation = { relation: null, value: t('inspector.new_relation') };
81669           var result = [];
81670           var graph = context.graph();
81671
81672           context.intersects(context.extent()).forEach(function(entity) {
81673               if (entity.type !== 'relation' || entity.id === _entityID) return;
81674
81675               var matched = context.presets().match(entity, graph);
81676               var presetName = (matched && matched.name()) || t('inspector.relation');
81677               var entityName = utilDisplayName(entity) || '';
81678
81679               var value = presetName + ' ' + entityName;
81680               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
81681
81682               result.push({ relation: entity, value: value });
81683           });
81684
81685           result.sort(function(a, b) {
81686               return osmRelation.creationOrder(a.relation, b.relation);
81687           });
81688
81689           // Dedupe identical names by appending relation id - see #2891
81690           var dupeGroups = filter(
81691               groupBy(result, 'value'),
81692               function(v) { return v.length > 1; }
81693           );
81694
81695           dupeGroups.forEach(function(group) {
81696               group.forEach(function(obj) {
81697                   obj.value += ' ' + obj.relation.id;
81698               });
81699           });
81700
81701           result.forEach(function(obj) {
81702               obj.title = obj.value;
81703           });
81704
81705           result.unshift(newRelation);
81706           callback(result);
81707       }
81708
81709
81710       function rawMembershipEditor(selection) {
81711           var entity = context.entity(_entityID);
81712           var parents = context.graph().parentRelations(entity);
81713           var memberships = [];
81714
81715           parents.slice(0, 1000).forEach(function(relation) {
81716               relation.members.forEach(function(member, index) {
81717                   if (member.id === entity.id) {
81718                       memberships.push({ relation: relation, member: member, index: index });
81719                   }
81720               });
81721           });
81722
81723           var gt = parents.length > 1000 ? '>' : '';
81724           selection.call(uiDisclosure(context, 'raw_membership_editor', true)
81725               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
81726               .expanded(true)
81727               .updatePreference(false)
81728               .on('toggled', function(expanded) {
81729                   if (expanded) { selection.node().parentNode.scrollTop += 200; }
81730               })
81731               .content(content)
81732           );
81733
81734
81735           function content(selection) {
81736               var list = selection.selectAll('.member-list')
81737                   .data([0]);
81738
81739               list = list.enter()
81740                   .append('ul')
81741                   .attr('class', 'member-list')
81742                   .merge(list);
81743
81744
81745               var items = list.selectAll('li.member-row-normal')
81746                   .data(memberships, function(d) {
81747                       return osmEntity.key(d.relation) + ',' + d.index;
81748                   });
81749
81750               items.exit()
81751                   .each(unbind)
81752                   .remove();
81753
81754               // Enter
81755               var itemsEnter = items.enter()
81756                   .append('li')
81757                   .attr('class', 'member-row member-row-normal form-field');
81758
81759               itemsEnter.each(function(d){
81760                   // highlight the relation in the map while hovering on the list item
81761                   select(this)
81762                       .on('mouseover', function() {
81763                           utilHighlightEntities([d.relation.id], true, context);
81764                       })
81765                       .on('mouseout', function() {
81766                           utilHighlightEntities([d.relation.id], false, context);
81767                       });
81768               });
81769
81770               var labelEnter = itemsEnter
81771                   .append('label')
81772                   .attr('class', 'form-field-label')
81773                   .append('span')
81774                   .attr('class', 'label-text')
81775                   .append('a')
81776                   .attr('href', '#')
81777                   .on('click', selectRelation);
81778
81779               labelEnter
81780                   .append('span')
81781                   .attr('class', 'member-entity-type')
81782                   .text(function(d) {
81783                       var matched = context.presets().match(d.relation, context.graph());
81784                       return (matched && matched.name()) || t('inspector.relation');
81785                   });
81786
81787               labelEnter
81788                   .append('span')
81789                   .attr('class', 'member-entity-name')
81790                   .text(function(d) { return utilDisplayName(d.relation); });
81791
81792               var wrapEnter = itemsEnter
81793                   .append('div')
81794                   .attr('class', 'form-field-input-wrap form-field-input-member');
81795
81796               wrapEnter
81797                   .append('input')
81798                   .attr('class', 'member-role')
81799                   .property('type', 'text')
81800                   .attr('maxlength', 255)
81801                   .attr('placeholder', t('inspector.role'))
81802                   .call(utilNoAuto)
81803                   .property('value', function(d) { return d.member.role; })
81804                   .on('blur', changeRole)
81805                   .on('change', changeRole);
81806
81807               wrapEnter
81808                   .append('button')
81809                   .attr('tabindex', -1)
81810                   .attr('class', 'remove form-field-button member-delete')
81811                   .call(svgIcon('#iD-operation-delete'))
81812                   .on('click', deleteMembership);
81813
81814               if (taginfo) {
81815                   wrapEnter.each(bindTypeahead);
81816               }
81817
81818
81819               var newMembership = list.selectAll('.member-row-new')
81820                   .data(_showBlank ? [0] : []);
81821
81822               // Exit
81823               newMembership.exit()
81824                   .remove();
81825
81826               // Enter
81827               var newMembershipEnter = newMembership.enter()
81828                   .append('li')
81829                   .attr('class', 'member-row member-row-new form-field');
81830
81831               newMembershipEnter
81832                   .append('label')
81833                   .attr('class', 'form-field-label')
81834                   .append('input')
81835                   .attr('placeholder', t('inspector.choose_relation'))
81836                   .attr('type', 'text')
81837                   .attr('class', 'member-entity-input')
81838                   .call(utilNoAuto);
81839
81840               var newWrapEnter = newMembershipEnter
81841                   .append('div')
81842                   .attr('class', 'form-field-input-wrap form-field-input-member');
81843
81844               newWrapEnter
81845                   .append('input')
81846                   .attr('class', 'member-role')
81847                   .property('type', 'text')
81848                   .attr('maxlength', 255)
81849                   .attr('placeholder', t('inspector.role'))
81850                   .call(utilNoAuto);
81851
81852               newWrapEnter
81853                   .append('button')
81854                   .attr('tabindex', -1)
81855                   .attr('class', 'remove form-field-button member-delete')
81856                   .call(svgIcon('#iD-operation-delete'))
81857                   .on('click', function() {
81858                       list.selectAll('.member-row-new')
81859                           .remove();
81860                   });
81861
81862               // Update
81863               newMembership = newMembership
81864                   .merge(newMembershipEnter);
81865
81866               newMembership.selectAll('.member-entity-input')
81867                   .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
81868                   .call(nearbyCombo
81869                       .on('accept', acceptEntity)
81870                       .on('cancel', cancelEntity)
81871                   );
81872
81873
81874               // Container for the Add button
81875               var addRow = selection.selectAll('.add-row')
81876                   .data([0]);
81877
81878               // enter
81879               var addRowEnter = addRow.enter()
81880                   .append('div')
81881                   .attr('class', 'add-row');
81882
81883               addRowEnter
81884                   .append('button')
81885                   .attr('class', 'add-relation')
81886                   .call(svgIcon('#iD-icon-plus', 'light'));
81887
81888               addRowEnter
81889                   .append('div')
81890                   .attr('class', 'space-value');   // preserve space
81891
81892               addRowEnter
81893                   .append('div')
81894                   .attr('class', 'space-buttons');  // preserve space
81895
81896               // update
81897               addRow = addRow
81898                   .merge(addRowEnter);
81899
81900               addRow.select('.add-relation')
81901                   .on('click', function() {
81902                       _showBlank = true;
81903                       content(selection);
81904                       list.selectAll('.member-entity-input').node().focus();
81905                   });
81906
81907
81908               function acceptEntity(d) {
81909                   if (!d) {
81910                       cancelEntity();
81911                       return;
81912                   }
81913                   var role = list.selectAll('.member-row-new .member-role').property('value');
81914                   addMembership(d, role);
81915               }
81916
81917
81918               function cancelEntity() {
81919                   var input = newMembership.selectAll('.member-entity-input');
81920                   input.property('value', '');
81921               }
81922
81923
81924               function bindTypeahead(d) {
81925                   var row = select(this);
81926                   var role = row.selectAll('input.member-role');
81927                   var origValue = role.property('value');
81928
81929                   function sort(value, data) {
81930                       var sameletter = [];
81931                       var other = [];
81932                       for (var i = 0; i < data.length; i++) {
81933                           if (data[i].value.substring(0, value.length) === value) {
81934                               sameletter.push(data[i]);
81935                           } else {
81936                               other.push(data[i]);
81937                           }
81938                       }
81939                       return sameletter.concat(other);
81940                   }
81941
81942                   role.call(uiCombobox(context, 'member-role')
81943                       .fetcher(function(role, callback) {
81944                           var rtype = d.relation.tags.type;
81945                           taginfo.roles({
81946                               debounce: true,
81947                               rtype: rtype || '',
81948                               geometry: context.geometry(_entityID),
81949                               query: role
81950                           }, function(err, data) {
81951                               if (!err) callback(sort(role, data));
81952                           });
81953                       })
81954                       .on('cancel', function() {
81955                           role.property('value', origValue);
81956                       })
81957                   );
81958               }
81959
81960
81961               function unbind() {
81962                   var row = select(this);
81963
81964                   row.selectAll('input.member-role')
81965                       .call(uiCombobox.off);
81966               }
81967           }
81968       }
81969
81970
81971       rawMembershipEditor.entityID = function(val) {
81972           if (!arguments.length) return _entityID;
81973           _entityID = val;
81974           _showBlank = false;
81975           return rawMembershipEditor;
81976       };
81977
81978
81979       return rawMembershipEditor;
81980   }
81981
81982   // Pass `which` object of the form:
81983   // {
81984   //   key: 'string',     // required
81985   //   value: 'string'    // optional
81986   // }
81987   //   -or-
81988   // {
81989   //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
81990   // }
81991   //   -or-
81992   // {
81993   //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
81994   // }
81995   //
81996   function uiTagReference(what) {
81997       var wikibase = what.qid ? services.wikidata : services.osmWikibase;
81998       var tagReference = {};
81999
82000       var _button = select(null);
82001       var _body = select(null);
82002       var _loaded;
82003       var _showing;
82004
82005
82006       function load() {
82007           if (!wikibase) return;
82008
82009           _button
82010               .classed('tag-reference-loading', true);
82011
82012           wikibase.getDocs(what, gotDocs);
82013       }
82014
82015
82016       function gotDocs(err, docs) {
82017           _body.html('');
82018
82019           if (!docs || !docs.title) {
82020               _body
82021                   .append('p')
82022                   .attr('class', 'tag-reference-description')
82023                   .text(t('inspector.no_documentation_key'));
82024               done();
82025               return;
82026           }
82027
82028           if (docs.imageURL) {
82029               _body
82030                   .append('img')
82031                   .attr('class', 'tag-reference-wiki-image')
82032                   .attr('src', docs.imageURL)
82033                   .on('load', function() { done(); })
82034                   .on('error', function() { select(this).remove(); done(); });
82035           } else {
82036               done();
82037           }
82038
82039           _body
82040               .append('p')
82041               .attr('class', 'tag-reference-description')
82042               .text(docs.description || t('inspector.no_documentation_key'))
82043               .append('a')
82044               .attr('class', 'tag-reference-edit')
82045               .attr('target', '_blank')
82046               .attr('tabindex', -1)
82047               .attr('title', t('inspector.edit_reference'))
82048               .attr('href', docs.editURL)
82049               .call(svgIcon('#iD-icon-edit', 'inline'));
82050
82051           if (docs.wiki) {
82052               _body
82053                 .append('a')
82054                 .attr('class', 'tag-reference-link')
82055                 .attr('target', '_blank')
82056                 .attr('tabindex', -1)
82057                 .attr('href', docs.wiki.url)
82058                 .call(svgIcon('#iD-icon-out-link', 'inline'))
82059                 .append('span')
82060                 .text(t(docs.wiki.text));
82061           }
82062
82063           // Add link to info about "good changeset comments" - #2923
82064           if (what.key === 'comment') {
82065               _body
82066                   .append('a')
82067                   .attr('class', 'tag-reference-comment-link')
82068                   .attr('target', '_blank')
82069                   .attr('tabindex', -1)
82070                   .call(svgIcon('#iD-icon-out-link', 'inline'))
82071                   .attr('href', t('commit.about_changeset_comments_link'))
82072                   .append('span')
82073                   .text(t('commit.about_changeset_comments'));
82074           }
82075       }
82076
82077
82078       function done() {
82079           _loaded = true;
82080
82081           _button
82082               .classed('tag-reference-loading', false);
82083
82084           _body
82085               .classed('expanded', true)
82086               .transition()
82087               .duration(200)
82088               .style('max-height', '200px')
82089               .style('opacity', '1');
82090
82091           _showing = true;
82092       }
82093
82094
82095       function hide() {
82096           _body
82097               .transition()
82098               .duration(200)
82099               .style('max-height', '0px')
82100               .style('opacity', '0')
82101               .on('end', function () {
82102                   _body.classed('expanded', false);
82103               });
82104
82105           _showing = false;
82106       }
82107
82108
82109       tagReference.button = function(selection) {
82110           _button = selection.selectAll('.tag-reference-button')
82111               .data([0]);
82112
82113           _button = _button.enter()
82114               .append('button')
82115               .attr('class', 'tag-reference-button')
82116               .attr('title', t('icons.information'))
82117               .attr('tabindex', -1)
82118               .call(svgIcon('#iD-icon-inspect'))
82119               .merge(_button);
82120
82121           _button
82122               .on('click', function () {
82123                   event.stopPropagation();
82124                   event.preventDefault();
82125                   this.blur();    // avoid keeping focus on the button - #4641
82126                   if (_showing) {
82127                       hide();
82128                   } else if (_loaded) {
82129                       done();
82130                   } else {
82131                       load();
82132                   }
82133               });
82134       };
82135
82136
82137       tagReference.body = function(selection) {
82138           var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
82139           _body = selection.selectAll('.tag-reference-body')
82140               .data([itemID], function(d) { return d; });
82141
82142           _body.exit()
82143               .remove();
82144
82145           _body = _body.enter()
82146               .append('div')
82147               .attr('class', 'tag-reference-body')
82148               .style('max-height', '0')
82149               .style('opacity', '0')
82150               .merge(_body);
82151
82152           if (_showing === false) {
82153               hide();
82154           }
82155       };
82156
82157
82158       tagReference.showing = function(val) {
82159           if (!arguments.length) return _showing;
82160           _showing = val;
82161           return tagReference;
82162       };
82163
82164
82165       return tagReference;
82166   }
82167
82168   // This currently only works with the 'restrictions' field
82169   // It borrows some code from uiHelp
82170
82171   function uiFieldHelp(context, fieldName) {
82172       var fieldHelp = {};
82173       var _inspector = select(null);
82174       var _wrap = select(null);
82175       var _body = select(null);
82176
82177       var fieldHelpKeys = {
82178           restrictions: [
82179               ['about',[
82180                   'about',
82181                   'from_via_to',
82182                   'maxdist',
82183                   'maxvia'
82184               ]],
82185               ['inspecting',[
82186                   'about',
82187                   'from_shadow',
82188                   'allow_shadow',
82189                   'restrict_shadow',
82190                   'only_shadow',
82191                   'restricted',
82192                   'only'
82193               ]],
82194               ['modifying',[
82195                   'about',
82196                   'indicators',
82197                   'allow_turn',
82198                   'restrict_turn',
82199                   'only_turn'
82200               ]],
82201               ['tips',[
82202                   'simple',
82203                   'simple_example',
82204                   'indirect',
82205                   'indirect_example',
82206                   'indirect_noedit'
82207               ]]
82208           ]
82209       };
82210
82211       var fieldHelpHeadings = {};
82212
82213       var replacements = {
82214           distField: t('restriction.controls.distance'),
82215           viaField: t('restriction.controls.via'),
82216           fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
82217           allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
82218           restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
82219           onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
82220           allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
82221           restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
82222           onlyTurn: icon('#iD-turn-only', 'pre-text turn')
82223       };
82224
82225
82226       // For each section, squash all the texts into a single markdown document
82227       var docs = fieldHelpKeys[fieldName].map(function(key) {
82228           var helpkey = 'help.field.' + fieldName + '.' + key[0];
82229           var text = key[1].reduce(function(all, part) {
82230               var subkey = helpkey + '.' + part;
82231               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
82232               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
82233               return all + hhh + t(subkey, replacements) + '\n\n';
82234           }, '');
82235
82236           return {
82237               key: helpkey,
82238               title: t(helpkey + '.title'),
82239               html: marked(text.trim())
82240           };
82241       });
82242
82243
82244       function show() {
82245           updatePosition();
82246
82247           _body
82248               .classed('hide', false)
82249               .style('opacity', '0')
82250               .transition()
82251               .duration(200)
82252               .style('opacity', '1');
82253       }
82254
82255
82256       function hide() {
82257           _body
82258               .classed('hide', true)
82259               .transition()
82260               .duration(200)
82261               .style('opacity', '0')
82262               .on('end', function () {
82263                   _body.classed('hide', true);
82264               });
82265       }
82266
82267
82268       function clickHelp(index) {
82269           var d = docs[index];
82270           var tkeys = fieldHelpKeys[fieldName][index][1];
82271
82272           _body.selectAll('.field-help-nav-item')
82273               .classed('active', function(d, i) { return i === index; });
82274
82275           var content = _body.selectAll('.field-help-content')
82276               .html(d.html);
82277
82278           // class the paragraphs so we can find and style them
82279           content.selectAll('p')
82280               .attr('class', function(d, i) { return tkeys[i]; });
82281
82282           // insert special content for certain help sections
82283           if (d.key === 'help.field.restrictions.inspecting') {
82284               content
82285                   .insert('img', 'p.from_shadow')
82286                   .attr('class', 'field-help-image cf')
82287                   .attr('src', context.imagePath('tr_inspect.gif'));
82288
82289           } else if (d.key === 'help.field.restrictions.modifying') {
82290               content
82291                   .insert('img', 'p.allow_turn')
82292                   .attr('class', 'field-help-image cf')
82293                   .attr('src', context.imagePath('tr_modify.gif'));
82294           }
82295       }
82296
82297
82298       fieldHelp.button = function(selection) {
82299           if (_body.empty()) return;
82300
82301           var button = selection.selectAll('.field-help-button')
82302               .data([0]);
82303
82304           // enter/update
82305           button.enter()
82306               .append('button')
82307               .attr('class', 'field-help-button')
82308               .attr('tabindex', -1)
82309               .call(svgIcon('#iD-icon-help'))
82310               .merge(button)
82311               .on('click', function () {
82312                   event.stopPropagation();
82313                   event.preventDefault();
82314                   if (_body.classed('hide')) {
82315                       show();
82316                   } else {
82317                       hide();
82318                   }
82319               });
82320       };
82321
82322
82323       function updatePosition() {
82324           var wrap = _wrap.node();
82325           var inspector = _inspector.node();
82326           var wRect = wrap.getBoundingClientRect();
82327           var iRect = inspector.getBoundingClientRect();
82328
82329           _body
82330               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
82331       }
82332
82333
82334       fieldHelp.body = function(selection) {
82335           // This control expects the field to have a form-field-input-wrap div
82336           _wrap = selection.selectAll('.form-field-input-wrap');
82337           if (_wrap.empty()) return;
82338
82339           // absolute position relative to the inspector, so it "floats" above the fields
82340           _inspector = select('#sidebar .entity-editor-pane .inspector-body');
82341           if (_inspector.empty()) return;
82342
82343           _body = _inspector.selectAll('.field-help-body')
82344               .data([0]);
82345
82346           var enter = _body.enter()
82347               .append('div')
82348               .attr('class', 'field-help-body hide');   // initially hidden
82349
82350           var titleEnter = enter
82351               .append('div')
82352               .attr('class', 'field-help-title cf');
82353
82354           titleEnter
82355               .append('h2')
82356               .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
82357               .text(t('help.field.' + fieldName + '.title'));
82358
82359           titleEnter
82360               .append('button')
82361               .attr('class', 'fr close')
82362               .on('click', function() {
82363                   event.stopPropagation();
82364                   event.preventDefault();
82365                   hide();
82366               })
82367               .call(svgIcon('#iD-icon-close'));
82368
82369           var navEnter = enter
82370               .append('div')
82371               .attr('class', 'field-help-nav cf');
82372
82373           var titles = docs.map(function(d) { return d.title; });
82374           navEnter.selectAll('.field-help-nav-item')
82375               .data(titles)
82376               .enter()
82377               .append('div')
82378               .attr('class', 'field-help-nav-item')
82379               .text(function(d) { return d; })
82380               .on('click', function(d, i) {
82381                   event.stopPropagation();
82382                   event.preventDefault();
82383                   clickHelp(i);
82384               });
82385
82386           enter
82387               .append('div')
82388               .attr('class', 'field-help-content');
82389
82390           _body = _body
82391               .merge(enter);
82392
82393           clickHelp(0);
82394       };
82395
82396
82397       return fieldHelp;
82398   }
82399
82400   function uiFieldCheck(field, context) {
82401       var dispatch$1 = dispatch('change');
82402       var options = field.strings && field.strings.options;
82403       var values = [];
82404       var texts = [];
82405
82406       var input = select(null);
82407       var text = select(null);
82408       var label = select(null);
82409       var reverser = select(null);
82410
82411       var _impliedYes;
82412       var _entityID;
82413       var _value;
82414
82415
82416       if (options) {
82417           for (var k in options) {
82418               values.push(k === 'undefined' ? undefined : k);
82419               texts.push(field.t('options.' + k, { 'default': options[k] }));
82420           }
82421       } else {
82422           values = [undefined, 'yes'];
82423           texts = [t('inspector.unknown'), t('inspector.check.yes')];
82424           if (field.type !== 'defaultCheck') {
82425               values.push('no');
82426               texts.push(t('inspector.check.no'));
82427           }
82428       }
82429
82430
82431       // Checks tags to see whether an undefined value is "Assumed to be Yes"
82432       function checkImpliedYes() {
82433           _impliedYes = (field.id === 'oneway_yes');
82434
82435           // hack: pretend `oneway` field is a `oneway_yes` field
82436           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
82437           if (field.id === 'oneway') {
82438               var entity = context.entity(_entityID);
82439               for (var key in entity.tags) {
82440                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
82441                       _impliedYes = true;
82442                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
82443                       break;
82444                   }
82445               }
82446           }
82447       }
82448
82449
82450       function reverserHidden() {
82451           if (!select('div.inspector-hover').empty()) return true;
82452           return !(_value === 'yes' || (_impliedYes && !_value));
82453       }
82454
82455
82456       function reverserSetText(selection) {
82457           var entity = context.hasEntity(_entityID);
82458           if (reverserHidden() || !entity) return selection;
82459
82460           var first = entity.first();
82461           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
82462           var pseudoDirection = first < last;
82463           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
82464
82465           selection.selectAll('.reverser-span')
82466               .text(t('inspector.check.reverser'))
82467               .call(svgIcon(icon, 'inline'));
82468
82469           return selection;
82470       }
82471
82472
82473       var check = function(selection) {
82474           checkImpliedYes();
82475
82476           label = selection.selectAll('.form-field-input-wrap')
82477               .data([0]);
82478
82479           var enter = label.enter()
82480               .append('label')
82481               .attr('class', 'form-field-input-wrap form-field-input-check');
82482
82483           enter
82484               .append('input')
82485               .property('indeterminate', field.type !== 'defaultCheck')
82486               .attr('type', 'checkbox')
82487               .attr('id', 'preset-input-' + field.safeid);
82488
82489           enter
82490               .append('span')
82491               .text(texts[0])
82492               .attr('class', 'value');
82493
82494           if (field.type === 'onewayCheck') {
82495               enter
82496                   .append('a')
82497                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
82498                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
82499                   .attr('href', '#')
82500                   .append('span')
82501                   .attr('class', 'reverser-span');
82502           }
82503
82504           label = label.merge(enter);
82505           input = label.selectAll('input');
82506           text = label.selectAll('span.value');
82507
82508           input
82509               .on('click', function() {
82510                   event.stopPropagation();
82511                   var t = {};
82512                   t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
82513
82514                   // Don't cycle through `alternating` or `reversible` states - #4970
82515                   // (They are supported as translated strings, but should not toggle with clicks)
82516                   if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
82517                       t[field.key] = values[0];
82518                   }
82519
82520                   dispatch$1.call('change', this, t);
82521               });
82522
82523           if (field.type === 'onewayCheck') {
82524               reverser = label.selectAll('.reverser');
82525
82526               reverser
82527                   .call(reverserSetText)
82528                   .on('click', function() {
82529                       event.preventDefault();
82530                       event.stopPropagation();
82531                       context.perform(
82532                           actionReverse(_entityID),
82533                           t('operations.reverse.annotation')
82534                       );
82535                       select(this)
82536                           .call(reverserSetText);
82537                   });
82538           }
82539       };
82540
82541
82542       check.entity = function(_) {
82543           if (!arguments.length) return context.hasEntity(_entityID);
82544           _entityID = _.id;
82545           return check;
82546       };
82547
82548
82549       check.tags = function(tags) {
82550
82551           function isChecked(val) {
82552               return val !== 'no' && val !== '' && val !== undefined && val !== null;
82553           }
82554
82555           function textFor(val) {
82556               if (val === '') val = undefined;
82557               var index = values.indexOf(val);
82558               return (index !== -1 ? texts[index] : ('"' + val + '"'));
82559           }
82560
82561           checkImpliedYes();
82562           _value = tags[field.key] && tags[field.key].toLowerCase();
82563
82564           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
82565               _value = 'yes';
82566           }
82567
82568           input
82569               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
82570               .property('checked', isChecked(_value));
82571
82572           text
82573               .text(textFor(_value));
82574
82575           label
82576               .classed('set', !!_value);
82577
82578           if (field.type === 'onewayCheck') {
82579               reverser
82580                   .classed('hide', reverserHidden())
82581                   .call(reverserSetText);
82582           }
82583       };
82584
82585
82586       check.focus = function() {
82587           input.node().focus();
82588       };
82589
82590       return utilRebind(check, dispatch$1, 'on');
82591   }
82592
82593   /** Used for built-in method references. */
82594   var arrayProto$1 = Array.prototype;
82595
82596   /** Built-in value references. */
82597   var splice$1 = arrayProto$1.splice;
82598
82599   /**
82600    * The base implementation of `_.pullAt` without support for individual
82601    * indexes or capturing the removed elements.
82602    *
82603    * @private
82604    * @param {Array} array The array to modify.
82605    * @param {number[]} indexes The indexes of elements to remove.
82606    * @returns {Array} Returns `array`.
82607    */
82608   function basePullAt(array, indexes) {
82609     var length = array ? indexes.length : 0,
82610         lastIndex = length - 1;
82611
82612     while (length--) {
82613       var index = indexes[length];
82614       if (length == lastIndex || index !== previous) {
82615         var previous = index;
82616         if (isIndex(index)) {
82617           splice$1.call(array, index, 1);
82618         } else {
82619           baseUnset(array, index);
82620         }
82621       }
82622     }
82623     return array;
82624   }
82625
82626   /**
82627    * Removes all elements from `array` that `predicate` returns truthy for
82628    * and returns an array of the removed elements. The predicate is invoked
82629    * with three arguments: (value, index, array).
82630    *
82631    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
82632    * to pull elements from an array by value.
82633    *
82634    * @static
82635    * @memberOf _
82636    * @since 2.0.0
82637    * @category Array
82638    * @param {Array} array The array to modify.
82639    * @param {Function} [predicate=_.identity] The function invoked per iteration.
82640    * @returns {Array} Returns the new array of removed elements.
82641    * @example
82642    *
82643    * var array = [1, 2, 3, 4];
82644    * var evens = _.remove(array, function(n) {
82645    *   return n % 2 == 0;
82646    * });
82647    *
82648    * console.log(array);
82649    * // => [1, 3]
82650    *
82651    * console.log(evens);
82652    * // => [2, 4]
82653    */
82654   function remove$8(array, predicate) {
82655     var result = [];
82656     if (!(array && array.length)) {
82657       return result;
82658     }
82659     var index = -1,
82660         indexes = [],
82661         length = array.length;
82662
82663     predicate = baseIteratee(predicate, 3);
82664     while (++index < length) {
82665       var value = array[index];
82666       if (predicate(value, index, array)) {
82667         result.push(value);
82668         indexes.push(index);
82669       }
82670     }
82671     basePullAt(array, indexes);
82672     return result;
82673   }
82674
82675   function uiFieldCombo(field, context) {
82676       var dispatch$1 = dispatch('change');
82677       var nominatim = services.geocoder;
82678       var taginfo = services.taginfo;
82679       var isMulti = (field.type === 'multiCombo');
82680       var isNetwork = (field.type === 'networkCombo');
82681       var isSemi = (field.type === 'semiCombo');
82682       var optstrings = field.strings && field.strings.options;
82683       var optarray = field.options;
82684       var snake_case = (field.snake_case || (field.snake_case === undefined));
82685       var caseSensitive = field.caseSensitive;
82686       var combobox = uiCombobox(context, 'combo-' + field.safeid)
82687           .caseSensitive(caseSensitive)
82688           .minItems(isMulti || isSemi ? 1 : 2);
82689       var container = select(null);
82690       var inputWrap = select(null);
82691       var input = select(null);
82692       var _comboData = [];
82693       var _multiData = [];
82694       var _entity;
82695       var _country;
82696
82697       // ensure multiCombo field.key ends with a ':'
82698       if (isMulti && /[^:]$/.test(field.key)) {
82699           field.key += ':';
82700       }
82701
82702
82703       function snake(s) {
82704           return s.replace(/\s+/g, '_');
82705       }
82706
82707       function unsnake(s) {
82708           return s.replace(/_+/g, ' ');
82709       }
82710
82711       function clean(s) {
82712           return s.split(';')
82713               .map(function(s) { return s.trim(); })
82714               .join(';');
82715       }
82716
82717
82718       // returns the tag value for a display value
82719       // (for multiCombo, dval should be the key suffix, not the entire key)
82720       function tagValue(dval) {
82721           dval = clean(dval || '');
82722
82723           if (optstrings) {
82724               var found = find$1(_comboData, function(o) {
82725                   return o.key && clean(o.value) === dval;
82726               });
82727               if (found) {
82728                   return found.key;
82729               }
82730           }
82731
82732           if (field.type === 'typeCombo' && !dval) {
82733               return 'yes';
82734           }
82735
82736           return (snake_case ? snake(dval) : dval) || undefined;
82737       }
82738
82739
82740       // returns the display value for a tag value
82741       // (for multiCombo, tval should be the key suffix, not the entire key)
82742       function displayValue(tval) {
82743           tval = tval || '';
82744
82745           if (optstrings) {
82746               var found = find$1(_comboData, function(o) { return o.key === tval && o.value; });
82747               if (found) {
82748                   return found.value;
82749               }
82750           }
82751
82752           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
82753               return '';
82754           }
82755
82756           return snake_case ? unsnake(tval) : tval;
82757       }
82758
82759
82760       function objectDifference(a, b) {
82761           return reject(a, function(d1) {
82762               return some(b, function(d2) { return d1.value === d2.value; });
82763           });
82764       }
82765
82766
82767       function initCombo(selection, attachTo) {
82768           if (optstrings) {
82769               selection.attr('readonly', 'readonly');
82770               selection.call(combobox, attachTo);
82771               setStaticValues(setPlaceholder);
82772
82773           } else if (optarray) {
82774               selection.call(combobox, attachTo);
82775               setStaticValues(setPlaceholder);
82776
82777           } else if (taginfo) {
82778               selection.call(combobox.fetcher(setTaginfoValues), attachTo);
82779               setTaginfoValues('', setPlaceholder);
82780           }
82781       }
82782
82783
82784       function setStaticValues(callback) {
82785           if (!(optstrings || optarray)) return;
82786
82787           if (optstrings) {
82788               _comboData = Object.keys(optstrings).map(function(k) {
82789                   var v = field.t('options.' + k, { 'default': optstrings[k] });
82790                   return {
82791                       key: k,
82792                       value: v,
82793                       title: v
82794                   };
82795               });
82796
82797           } else if (optarray) {
82798               _comboData = optarray.map(function(k) {
82799                   var v = snake_case ? unsnake(k) : k;
82800                   return {
82801                       key: k,
82802                       value: v,
82803                       title: v
82804                   };
82805               });
82806           }
82807
82808           combobox.data(objectDifference(_comboData, _multiData));
82809           if (callback) callback(_comboData);
82810       }
82811
82812
82813       function setTaginfoValues(q, callback) {
82814           var fn = isMulti ? 'multikeys' : 'values';
82815           var query = (isMulti ? field.key : '') + q;
82816           var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
82817           if (hasCountryPrefix) {
82818               query = _country + ':';
82819           }
82820
82821           var params = {
82822               debounce: (q !== ''),
82823               key: field.key,
82824               query: query
82825           };
82826
82827           if (_entity) {
82828               params.geometry = context.geometry(_entity.id);
82829           }
82830
82831           taginfo[fn](params, function(err, data) {
82832               if (err) return;
82833               if (hasCountryPrefix) {
82834                   data = filter(data, function(d) {
82835                       return d.value.toLowerCase().indexOf(_country + ':') === 0;
82836                   });
82837               }
82838
82839               // hide the caret if there are no suggestions
82840               container.classed('empty-combobox', data.length === 0);
82841
82842               _comboData = map$3(data, function(d) {
82843                   var k = d.value;
82844                   if (isMulti) k = k.replace(field.key, '');
82845                   var v = snake_case ? unsnake(k) : k;
82846                   return {
82847                       key: k,
82848                       value: v,
82849                       title: isMulti ? v : d.title
82850                   };
82851               });
82852
82853               _comboData = objectDifference(_comboData, _multiData);
82854               if (callback) callback(_comboData);
82855           });
82856       }
82857
82858
82859       function setPlaceholder(d) {
82860           var ph;
82861
82862           if (isMulti || isSemi) {
82863               ph = field.placeholder() || t('inspector.add');
82864           } else {
82865               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
82866                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
82867               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
82868           }
82869
82870           if (!/(…|\.\.\.)$/.test(ph)) {
82871               ph += '…';
82872           }
82873
82874           container.selectAll('input')
82875               .attr('placeholder', ph);
82876       }
82877
82878
82879       function change() {
82880           var val = tagValue(utilGetSetValue(input));
82881           var t = {};
82882
82883           if (isMulti || isSemi) {
82884               if (!val) return;
82885               container.classed('active', false);
82886               utilGetSetValue(input, '');
82887
82888               if (isMulti) {
82889                   var key = field.key + val;
82890                   if (_entity) {
82891                       // don't set a multicombo value to 'yes' if it already has a non-'no' value
82892                       // e.g. `language:de=main`
82893                       var old = _entity.tags[key] || '';
82894                       if (old && old.toLowerCase() !== 'no') return;
82895                   }
82896                   field.keys.push(key);
82897                   t[key] = 'yes';
82898
82899               } else if (isSemi) {
82900                   var arr = _multiData.map(function(d) { return d.key; });
82901                   arr.push(val);
82902                   t[field.key] = compact(uniq(arr)).join(';');
82903               }
82904
82905               window.setTimeout(function() { input.node().focus(); }, 10);
82906
82907           } else {
82908               t[field.key] = val;
82909           }
82910
82911           dispatch$1.call('change', this, t);
82912       }
82913
82914
82915       function removeMultikey(d) {
82916           event.stopPropagation();
82917           var t = {};
82918           if (isMulti) {
82919               t[d.key] = undefined;
82920           } else if (isSemi) {
82921               remove$8(_multiData, function(md) { return md.key === d.key; });
82922               var arr = _multiData.map(function(md) { return md.key; });
82923               arr = compact(uniq(arr));
82924               t[field.key] = arr.length ? arr.join(';') : undefined;
82925           }
82926           dispatch$1.call('change', this, t);
82927       }
82928
82929
82930       function combo(selection) {
82931           container = selection.selectAll('.form-field-input-wrap')
82932               .data([0]);
82933
82934           var type = (isMulti || isSemi) ? 'multicombo': 'combo';
82935           container = container.enter()
82936               .append('div')
82937               .attr('class', 'form-field-input-wrap form-field-input-' + type)
82938               .merge(container);
82939
82940           if (isMulti || isSemi) {
82941               container = container.selectAll('.chiplist')
82942                   .data([0]);
82943
82944               var listClass = 'chiplist';
82945
82946               // Use a separate line for each value in the Destinations field
82947               // to mimic highway exit signs
82948               if (field.id === 'destination_oneway') {
82949                   listClass += ' full-line-chips';
82950               }
82951
82952               container = container.enter()
82953                   .append('ul')
82954                   .attr('class', listClass)
82955                   .on('click', function() {
82956                       window.setTimeout(function() { input.node().focus(); }, 10);
82957                   })
82958                   .merge(container);
82959
82960
82961               inputWrap = container.selectAll('.input-wrap')
82962                   .data([0]);
82963
82964               inputWrap = inputWrap.enter()
82965                   .append('li')
82966                   .attr('class', 'input-wrap')
82967                   .merge(inputWrap);
82968
82969               input = inputWrap.selectAll('input')
82970                   .data([0]);
82971           } else {
82972               input = container.selectAll('input')
82973                   .data([0]);
82974           }
82975
82976           input = input.enter()
82977               .append('input')
82978               .attr('type', 'text')
82979               .attr('id', 'preset-input-' + field.safeid)
82980               .call(utilNoAuto)
82981               .call(initCombo, selection)
82982               .merge(input);
82983
82984           if (isNetwork && nominatim && _entity) {
82985               var center = _entity.extent(context.graph()).center();
82986               nominatim.countryCode(center, function (err, code) {
82987                   _country = code;
82988               });
82989           }
82990
82991           input
82992               .on('change', change)
82993               .on('blur', change);
82994
82995           input
82996               .on('keydown.field', function() {
82997                   switch (event.keyCode) {
82998                       case 13: // ↩ Return
82999                           input.node().blur(); // blurring also enters the value
83000                           event.stopPropagation();
83001                           break;
83002                   }
83003               });
83004
83005           if (isMulti || isSemi) {
83006               combobox
83007                   .on('accept', function() {
83008                       input.node().blur();
83009                       input.node().focus();
83010                   });
83011
83012               input
83013                   .on('focus', function() { container.classed('active', true); });
83014           }
83015       }
83016
83017
83018       combo.tags = function(tags) {
83019           if (isMulti || isSemi) {
83020               _multiData = [];
83021
83022               if (isMulti) {
83023                   // Build _multiData array containing keys already set..
83024                   for (var k in tags) {
83025                       if (k.indexOf(field.key) !== 0) continue;
83026                       var v = (tags[k] || '').toLowerCase();
83027                       if (v === '' || v === 'no') continue;
83028
83029                       var suffix = k.substring(field.key.length);
83030                       _multiData.push({
83031                           key: k,
83032                           value: displayValue(suffix)
83033                       });
83034                   }
83035
83036                   // Set keys for form-field modified (needed for undo and reset buttons)..
83037                   field.keys = map$3(_multiData, 'key');
83038
83039               } else if (isSemi) {
83040                   var arr = compact(uniq((tags[field.key] || '').split(';')));
83041                   _multiData = arr.map(function(k) {
83042                       return {
83043                           key: k,
83044                           value: displayValue(k)
83045                       };
83046                   });
83047               }
83048
83049               // Exclude existing multikeys from combo options..
83050               var available = objectDifference(_comboData, _multiData);
83051               combobox.data(available);
83052
83053               // Hide 'Add' button if this field uses fixed set of
83054               // translateable optstrings and they're all currently used..
83055               container.selectAll('.combobox-input, .combobox-caret')
83056                   .classed('hide', optstrings && !available.length);
83057
83058
83059               // Render chips
83060               var chips = container.selectAll('.chips')
83061                   .data(_multiData);
83062
83063               chips.exit()
83064                   .remove();
83065
83066               var enter = chips.enter()
83067                   .insert('li', '.input-wrap')
83068                   .attr('class', 'chips');
83069
83070               enter.append('span');
83071               enter.append('a');
83072
83073               chips = chips.merge(enter);
83074
83075               chips.select('span')
83076                   .text(function(d) { return d.value; });
83077
83078               chips.select('a')
83079                   .on('click', removeMultikey)
83080                   .attr('class', 'remove')
83081                   .text('×');
83082
83083           } else {
83084               utilGetSetValue(input, displayValue(tags[field.key]));
83085           }
83086       };
83087
83088
83089       combo.focus = function() {
83090           input.node().focus();
83091       };
83092
83093
83094       combo.entity = function(val) {
83095           if (!arguments.length) return _entity;
83096           _entity = val;
83097           return combo;
83098       };
83099
83100
83101       return utilRebind(combo, dispatch$1, 'on');
83102   }
83103
83104   function uiFieldText(field, context) {
83105       var dispatch$1 = dispatch('change');
83106       var nominatim = services.geocoder;
83107       var input = select(null);
83108       var _entity;
83109       var _brandTip;
83110
83111       if (field.id === 'brand') {
83112           _brandTip = tooltip()
83113               .title(t('inspector.lock.suggestion', { label: field.label }))
83114               .placement('bottom');
83115       }
83116
83117
83118       function i(selection) {
83119           var preset = _entity && context.presets().match(_entity, context.graph());
83120           var isSuggestion = preset && preset.suggestion && field.id === 'brand';
83121
83122           var wrap = selection.selectAll('.form-field-input-wrap')
83123               .data([0]);
83124
83125           wrap = wrap.enter()
83126               .append('div')
83127               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83128               .merge(wrap);
83129
83130           var fieldID = 'preset-input-' + field.safeid;
83131
83132           input = wrap.selectAll('input')
83133               .data([0]);
83134
83135           input = input.enter()
83136               .append('input')
83137               .attr('type', field.type)
83138               .attr('id', fieldID)
83139               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
83140               .classed(field.type, true)
83141               .call(utilNoAuto)
83142               .merge(input);
83143
83144           input
83145               .classed('disabled', !!isSuggestion)
83146               .attr('readonly', isSuggestion || null)
83147               .on('input', change(true))
83148               .on('blur', change())
83149               .on('change', change());
83150
83151
83152           if (field.type === 'tel' && nominatim && _entity) {
83153               var center = _entity.extent(context.graph()).center();
83154               nominatim.countryCode(center, function (err, countryCode) {
83155                   if (err || !dataPhoneFormats[countryCode]) return;
83156                   wrap.selectAll('#' + fieldID)
83157                       .attr('placeholder', dataPhoneFormats[countryCode]);
83158               });
83159
83160           } else if (field.type === 'number') {
83161               var rtl = (textDirection === 'rtl');
83162
83163               input.attr('type', 'text');
83164
83165               var buttons = wrap.selectAll('.increment, .decrement')
83166                   .data(rtl ? [1, -1] : [-1, 1]);
83167
83168               buttons.enter()
83169                   .append('button')
83170                   .attr('tabindex', -1)
83171                   .attr('class', function(d) {
83172                       var which = (d === 1 ? 'increment' : 'decrement');
83173                       return 'form-field-button ' + which;
83174                   })
83175                   .merge(buttons)
83176                   .on('click', function(d) {
83177                       event.preventDefault();
83178                       var raw_vals = input.node().value || '0';
83179                       var vals = raw_vals.split(';');
83180                       vals = vals.map(function(v) {
83181                           var num = parseFloat(v.trim(), 10);
83182                           return isFinite(num) ? clamped(num + d) : v.trim();
83183                       });
83184                       input.node().value = vals.join(';');
83185                       change()();
83186                   });
83187
83188           } else if (preset && field.id === 'brand') {
83189               var pTag = preset.id.split('/', 2);
83190               var pKey = pTag[0];
83191               if (isSuggestion) {
83192                   // A "suggestion" preset (brand name)
83193                   // Put suggestion keys in `field.keys` so delete button can remove them all.
83194                   field.keys = Object.keys(preset.removeTags)
83195                       .filter(function(k) { return k !== pKey && k !== 'name'; });
83196               }
83197
83198               wrap.call(isSuggestion ? _brandTip : _brandTip.destroy);
83199           }
83200       }
83201
83202
83203       // clamp number to min/max
83204       function clamped(num) {
83205           if (field.minValue !== undefined) {
83206               num = Math.max(num, field.minValue);
83207           }
83208           if (field.maxValue !== undefined) {
83209               num = Math.min(num, field.maxValue);
83210           }
83211           return num;
83212       }
83213
83214
83215       function change(onInput) {
83216           return function() {
83217               var t = {};
83218               var val = utilGetSetValue(input).trim() || undefined;
83219
83220               if (!onInput) {
83221                   if (field.type === 'number' && val !== undefined) {
83222                       var vals = val.split(';');
83223                       vals = vals.map(function(v) {
83224                           var num = parseFloat(v.trim(), 10);
83225                           return isFinite(num) ? clamped(num) : v.trim();
83226                       });
83227                       val = vals.join(';');
83228                   }
83229                   utilGetSetValue(input, val || '');
83230               }
83231               t[field.key] = val;
83232               dispatch$1.call('change', this, t, onInput);
83233           };
83234       }
83235
83236
83237       i.entity = function(val) {
83238           if (!arguments.length) return _entity;
83239           _entity = val;
83240           return i;
83241       };
83242
83243
83244       i.tags = function(tags) {
83245           utilGetSetValue(input, tags[field.key] || '');
83246       };
83247
83248
83249       i.focus = function() {
83250           var node = input.node();
83251           if (node) node.focus();
83252       };
83253
83254       return utilRebind(i, dispatch$1, 'on');
83255   }
83256
83257   function uiFieldAccess(field, context) {
83258       var dispatch$1 = dispatch('change');
83259       var items = select(null);
83260
83261       function access(selection) {
83262           var wrap = selection.selectAll('.form-field-input-wrap')
83263               .data([0]);
83264
83265           wrap = wrap.enter()
83266               .append('div')
83267               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83268               .merge(wrap);
83269
83270           var list = wrap.selectAll('ul')
83271               .data([0]);
83272
83273           list = list.enter()
83274               .append('ul')
83275               .attr('class', 'labeled-inputs')
83276               .merge(list);
83277
83278
83279           items = list.selectAll('li')
83280               .data(field.keys);
83281
83282           // Enter
83283           var enter = items.enter()
83284               .append('li')
83285               .attr('class', function(d) { return 'preset-access-' + d; });
83286
83287           enter
83288               .append('span')
83289               .attr('class', 'label preset-label-access')
83290               .attr('for', function(d) { return 'preset-input-access-' + d; })
83291               .text(function(d) { return field.t('types.' + d); });
83292
83293           enter
83294               .append('div')
83295               .attr('class', 'preset-input-access-wrap')
83296               .append('input')
83297               .attr('type', 'text')
83298               .attr('class', 'preset-input-access')
83299               .attr('id', function(d) { return 'preset-input-access-' + d; })
83300               .call(utilNoAuto)
83301               .each(function(d) {
83302                   select(this)
83303                       .call(uiCombobox(context, 'access-' + d)
83304                           .data(access.options(d))
83305                       );
83306               });
83307
83308
83309           // Update
83310           items = items.merge(enter);
83311
83312           wrap.selectAll('.preset-input-access')
83313               .on('change', change)
83314               .on('blur', change);
83315       }
83316
83317
83318       function change(d) {
83319           var tag = {};
83320           tag[d] = utilGetSetValue(select(this)) || undefined;
83321           dispatch$1.call('change', this, tag);
83322       }
83323
83324
83325       access.options = function(type) {
83326           var options = ['no', 'permissive', 'private', 'permit', 'destination'];
83327
83328           if (type !== 'access') {
83329               options.unshift('yes');
83330               options.push('designated');
83331
83332               if (type === 'bicycle') {
83333                   options.push('dismount');
83334               }
83335           }
83336
83337           return options.map(function(option) {
83338               return {
83339                   title: field.t('options.' + option + '.description'),
83340                   value: option
83341               };
83342           });
83343       };
83344
83345
83346       var placeholders = {
83347           footway: {
83348               foot: 'designated',
83349               motor_vehicle: 'no'
83350           },
83351           steps: {
83352               foot: 'yes',
83353               motor_vehicle: 'no',
83354               bicycle: 'no',
83355               horse: 'no'
83356           },
83357           pedestrian: {
83358               foot: 'yes',
83359               motor_vehicle: 'no'
83360           },
83361           cycleway: {
83362               motor_vehicle: 'no',
83363               bicycle: 'designated'
83364           },
83365           bridleway: {
83366               motor_vehicle: 'no',
83367               horse: 'designated'
83368           },
83369           path: {
83370               foot: 'yes',
83371               motor_vehicle: 'no',
83372               bicycle: 'yes',
83373               horse: 'yes'
83374           },
83375           motorway: {
83376               foot: 'no',
83377               motor_vehicle: 'yes',
83378               bicycle: 'no',
83379               horse: 'no'
83380           },
83381           trunk: {
83382               motor_vehicle: 'yes'
83383           },
83384           primary: {
83385               foot: 'yes',
83386               motor_vehicle: 'yes',
83387               bicycle: 'yes',
83388               horse: 'yes'
83389           },
83390           secondary: {
83391               foot: 'yes',
83392               motor_vehicle: 'yes',
83393               bicycle: 'yes',
83394               horse: 'yes'
83395           },
83396           tertiary: {
83397               foot: 'yes',
83398               motor_vehicle: 'yes',
83399               bicycle: 'yes',
83400               horse: 'yes'
83401           },
83402           residential: {
83403               foot: 'yes',
83404               motor_vehicle: 'yes',
83405               bicycle: 'yes',
83406               horse: 'yes'
83407           },
83408           unclassified: {
83409               foot: 'yes',
83410               motor_vehicle: 'yes',
83411               bicycle: 'yes',
83412               horse: 'yes'
83413           },
83414           service: {
83415               foot: 'yes',
83416               motor_vehicle: 'yes',
83417               bicycle: 'yes',
83418               horse: 'yes'
83419           },
83420           motorway_link: {
83421               foot: 'no',
83422               motor_vehicle: 'yes',
83423               bicycle: 'no',
83424               horse: 'no'
83425           },
83426           trunk_link: {
83427               motor_vehicle: 'yes'
83428           },
83429           primary_link: {
83430               foot: 'yes',
83431               motor_vehicle: 'yes',
83432               bicycle: 'yes',
83433               horse: 'yes'
83434           },
83435           secondary_link: {
83436               foot: 'yes',
83437               motor_vehicle: 'yes',
83438               bicycle: 'yes',
83439               horse: 'yes'
83440           },
83441           tertiary_link: {
83442               foot: 'yes',
83443               motor_vehicle: 'yes',
83444               bicycle: 'yes',
83445               horse: 'yes'
83446           }
83447       };
83448
83449
83450       access.tags = function(tags) {
83451           utilGetSetValue(items.selectAll('.preset-input-access'),
83452               function(d) { return tags[d] || ''; })
83453               .attr('placeholder', function() {
83454                   return tags.access ? tags.access : field.placeholder();
83455               });
83456
83457           items.selectAll('#preset-input-access-access')
83458               .attr('placeholder', 'yes');
83459
83460           var which = tags.highway;
83461           if (!placeholders[which]) return;
83462
83463           var keys = Object.keys(placeholders[which]);
83464           keys.forEach(function(k) {
83465               var v = placeholders[which][k];
83466               items.selectAll('#preset-input-access-' + k)
83467                   .attr('placeholder', tags.access || v);
83468           });
83469       };
83470
83471
83472       access.focus = function() {
83473           items.selectAll('.preset-input-access')
83474               .node().focus();
83475       };
83476
83477
83478       return utilRebind(access, dispatch$1, 'on');
83479   }
83480
83481   function uiFieldAddress(field, context) {
83482       var dispatch$1 = dispatch('init', 'change');
83483       var nominatim = services.geocoder;
83484       var wrap = select(null);
83485       var _isInitialized = false;
83486       var _entity;
83487
83488       function getNearStreets() {
83489           var extent = _entity.extent(context.graph());
83490           var l = extent.center();
83491           var box = geoExtent(l).padByMeters(200);
83492
83493           var streets = context.intersects(box)
83494               .filter(isAddressable)
83495               .map(function(d) {
83496                   var loc = context.projection([
83497                       (extent[0][0] + extent[1][0]) / 2,
83498                       (extent[0][1] + extent[1][1]) / 2
83499                   ]);
83500                   var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
83501
83502                   return {
83503                       title: d.tags.name,
83504                       value: d.tags.name,
83505                       dist: choice.distance
83506                   };
83507               })
83508               .sort(function(a, b) {
83509                   return a.dist - b.dist;
83510               });
83511
83512           return uniqBy(streets, 'value');
83513
83514           function isAddressable(d) {
83515               return d.tags.highway && d.tags.name && d.type === 'way';
83516           }
83517       }
83518
83519
83520       function getNearCities() {
83521           var extent = _entity.extent(context.graph());
83522           var l = extent.center();
83523           var box = geoExtent(l).padByMeters(200);
83524
83525           var cities = context.intersects(box)
83526               .filter(isAddressable)
83527               .map(function(d) {
83528                   return {
83529                       title: d.tags['addr:city'] || d.tags.name,
83530                       value: d.tags['addr:city'] || d.tags.name,
83531                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
83532                   };
83533               })
83534               .sort(function(a, b) {
83535                   return a.dist - b.dist;
83536               });
83537
83538           return uniqBy(cities, 'value');
83539
83540
83541           function isAddressable(d) {
83542               if (d.tags.name) {
83543                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
83544                       return true;
83545                   if (d.tags.border_type === 'city')
83546                       return true;
83547                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
83548                       return true;
83549               }
83550
83551               if (d.tags['addr:city'])
83552                   return true;
83553
83554               return false;
83555           }
83556       }
83557
83558       function getNearValues(key) {
83559           var extent = _entity.extent(context.graph());
83560           var l = extent.center();
83561           var box = geoExtent(l).padByMeters(200);
83562
83563           var results = context.intersects(box)
83564               .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
83565               .map(function(d) {
83566                   return {
83567                       title: d.tags[key],
83568                       value: d.tags[key],
83569                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
83570                   };
83571               })
83572               .sort(function(a, b) {
83573                   return a.dist - b.dist;
83574               });
83575
83576           return uniqBy(results, 'value');
83577       }
83578
83579
83580       function countryCallback(err, countryCode) {
83581           if (err) return;
83582
83583           var addressFormat = find$1(dataAddressFormats, function (a) {
83584               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
83585           }) || dataAddressFormats[0];
83586
83587           var dropdowns = addressFormat.dropdowns || [
83588               'city', 'county', 'country', 'district', 'hamlet',
83589               'neighbourhood', 'place', 'postcode', 'province',
83590               'quarter', 'state', 'street', 'subdistrict', 'suburb'
83591           ];
83592
83593           var widths = addressFormat.widths || {
83594               housenumber: 1/3, street: 2/3,
83595               city: 2/3, state: 1/4, postcode: 1/3
83596           };
83597
83598           function row(r) {
83599               // Normalize widths.
83600               var total = reduce(r, function(sum, key) {
83601                   return sum + (widths[key] || 0.5);
83602               }, 0);
83603
83604               return r.map(function(key) {
83605                   return {
83606                       id: key,
83607                       width: (widths[key] || 0.5) / total
83608                   };
83609               });
83610           }
83611
83612           wrap.selectAll('.addr-row')
83613               .data(addressFormat.format)
83614               .enter()
83615               .append('div')
83616               .attr('class', 'addr-row')
83617               .selectAll('input')
83618               .data(row)
83619               .enter()
83620               .append('input')
83621               .property('type', 'text')
83622               .attr('placeholder', function (d) {
83623                   var localkey = d.id + '!' + countryCode.toLowerCase();
83624                   var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
83625                   return field.t('placeholders.' + tkey);
83626               })
83627               .attr('class', function (d) { return 'addr-' + d.id; })
83628               .call(utilNoAuto)
83629               .each(addDropdown)
83630               .style('width', function (d) { return d.width * 100 + '%'; });
83631
83632
83633           function addDropdown(d) {
83634               if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
83635
83636               var nearValues = (d.id === 'street') ? getNearStreets
83637                   : (d.id === 'city') ? getNearCities
83638                   : getNearValues;
83639
83640               select(this)
83641                   .call(uiCombobox(context, 'address-' + d.id)
83642                       .minItems(1)
83643                       .caseSensitive(true)
83644                       .fetcher(function(value, callback) {
83645                           callback(nearValues('addr:' + d.id));
83646                       })
83647                   );
83648           }
83649
83650           wrap.selectAll('input')
83651               .on('blur', change())
83652               .on('change', change());
83653
83654           wrap.selectAll('input:not(.combobox-input)')
83655               .on('input', change(true));
83656
83657           dispatch$1.call('init');
83658           _isInitialized = true;
83659       }
83660
83661
83662       function address(selection) {
83663           _isInitialized = false;
83664
83665           wrap = selection.selectAll('.form-field-input-wrap')
83666               .data([0]);
83667
83668           wrap = wrap.enter()
83669               .append('div')
83670               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83671               .merge(wrap);
83672
83673           if (nominatim && _entity) {
83674               var center = _entity.extent(context.graph()).center();
83675               nominatim.countryCode(center, countryCallback);
83676           }
83677       }
83678
83679
83680       function change(onInput) {
83681           return function() {
83682               var tags = {};
83683
83684               wrap.selectAll('input')
83685                   .each(function (field) {
83686                       tags['addr:' + field.id] = this.value || undefined;
83687                   });
83688
83689               dispatch$1.call('change', this, tags, onInput);
83690           };
83691       }
83692
83693
83694       function updateTags(tags) {
83695           utilGetSetValue(wrap.selectAll('input'), function (field) {
83696               return tags['addr:' + field.id] || '';
83697           });
83698       }
83699
83700
83701       address.entity = function(val) {
83702           if (!arguments.length) return _entity;
83703           _entity = val;
83704           return address;
83705       };
83706
83707
83708       address.tags = function(tags) {
83709           if (_isInitialized) {
83710               updateTags(tags);
83711           } else {
83712               dispatch$1.on('init', function () {
83713                   dispatch$1.on('init', null);
83714                   updateTags(tags);
83715               });
83716           }
83717       };
83718
83719
83720       address.focus = function() {
83721           var node = wrap.selectAll('input').node();
83722           if (node) node.focus();
83723       };
83724
83725
83726       return utilRebind(address, dispatch$1, 'on');
83727   }
83728
83729   function uiFieldCycleway(field, context) {
83730       var dispatch$1 = dispatch('change');
83731       var items = select(null);
83732       var wrap = select(null);
83733
83734       function cycleway(selection) {
83735
83736           function stripcolon(s) {
83737               return s.replace(':', '');
83738           }
83739
83740
83741           wrap = selection.selectAll('.form-field-input-wrap')
83742               .data([0]);
83743
83744           wrap = wrap.enter()
83745               .append('div')
83746               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83747               .merge(wrap);
83748
83749
83750           var div = wrap.selectAll('ul')
83751               .data([0]);
83752
83753           div = div.enter()
83754               .append('ul')
83755               .attr('class', 'labeled-inputs')
83756               .merge(div);
83757
83758           var keys = ['cycleway:left', 'cycleway:right'];
83759
83760           items = div.selectAll('li')
83761               .data(keys);
83762
83763           var enter = items.enter()
83764               .append('li')
83765               .attr('class', function(d) { return 'preset-cycleway-' + stripcolon(d); });
83766
83767           enter
83768               .append('span')
83769               .attr('class', 'label preset-label-cycleway')
83770               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
83771               .text(function(d) { return field.t('types.' + d); });
83772
83773           enter
83774               .append('div')
83775               .attr('class', 'preset-input-cycleway-wrap')
83776               .append('input')
83777               .attr('type', 'text')
83778               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
83779               .call(utilNoAuto)
83780               .each(function(d) {
83781                   select(this)
83782                       .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
83783                           .data(cycleway.options(d))
83784                       );
83785               });
83786
83787
83788           // Update
83789           wrap.selectAll('.preset-input-cycleway')
83790               .on('change', change)
83791               .on('blur', change);
83792       }
83793
83794
83795       function change() {
83796           var left = utilGetSetValue(select('.preset-input-cyclewayleft'));
83797           var right = utilGetSetValue(select('.preset-input-cyclewayright'));
83798           var tag = {};
83799
83800           if (left === 'none' || left === '') { left = undefined; }
83801           if (right === 'none' || right === '') { right = undefined; }
83802
83803           // Always set both left and right as changing one can affect the other
83804           tag = {
83805               cycleway: undefined,
83806               'cycleway:left': left,
83807               'cycleway:right': right
83808           };
83809
83810           // If the left and right tags match, use the cycleway tag to tag both
83811           // sides the same way
83812           if (left === right) {
83813               tag = {
83814                   cycleway: left,
83815                   'cycleway:left': undefined,
83816                   'cycleway:right': undefined
83817               };
83818           }
83819
83820           dispatch$1.call('change', this, tag);
83821       }
83822
83823
83824       cycleway.options = function() {
83825           return Object.keys(field.strings.options).map(function(option) {
83826               return {
83827                   title: field.t('options.' + option + '.description'),
83828                   value: option
83829               };
83830           });
83831       };
83832
83833
83834       cycleway.tags = function(tags) {
83835           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
83836                   // If cycleway is set, always return that
83837                   if (tags.cycleway) {
83838                       return tags.cycleway;
83839                   }
83840                   return tags[d] || '';
83841               })
83842               .attr('placeholder', field.placeholder());
83843       };
83844
83845
83846       cycleway.focus = function() {
83847           var node = wrap.selectAll('input').node();
83848           if (node) node.focus();
83849       };
83850
83851
83852       return utilRebind(cycleway, dispatch$1, 'on');
83853   }
83854
83855   function uiFieldLanes(field, context) {
83856       var dispatch$1 = dispatch('change');
83857       var LANE_WIDTH = 40;
83858       var LANE_HEIGHT = 200;
83859       var _entityID;
83860
83861       function lanes(selection) {
83862           var lanesData = context.entity(_entityID).lanes();
83863
83864           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
83865               selection.call(lanes.off);
83866               return;
83867           }
83868
83869           var wrap = selection.selectAll('.form-field-input-wrap')
83870               .data([0]);
83871
83872           wrap = wrap.enter()
83873               .append('div')
83874               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
83875               .merge(wrap);
83876
83877           var surface =  wrap.selectAll('.surface')
83878               .data([0]);
83879
83880           var d = utilGetDimensions(wrap);
83881           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
83882
83883           surface = surface.enter()
83884               .append('svg')
83885               .attr('width', d[0])
83886               .attr('height', 300)
83887               .attr('class', 'surface')
83888               .merge(surface);
83889
83890
83891           var lanesSelection = surface.selectAll('.lanes')
83892               .data([0]);
83893
83894           lanesSelection = lanesSelection.enter()
83895               .append('g')
83896               .attr('class', 'lanes')
83897               .merge(lanesSelection);
83898
83899           lanesSelection
83900               .attr('transform', function () {
83901                   return 'translate(' + (freeSpace / 2) + ', 0)';
83902               });
83903
83904
83905           var lane = lanesSelection.selectAll('.lane')
83906              .data(lanesData.lanes);
83907
83908           lane.exit()
83909               .remove();
83910
83911           var enter = lane.enter()
83912               .append('g')
83913               .attr('class', 'lane');
83914
83915           enter
83916               .append('g')
83917               .append('rect')
83918               .attr('y', 50)
83919               .attr('width', LANE_WIDTH)
83920               .attr('height', LANE_HEIGHT);
83921
83922           enter
83923               .append('g')
83924               .attr('class', 'forward')
83925               .append('text')
83926               .attr('y', 40)
83927               .attr('x', 14)
83928               .text('▲');
83929
83930           enter
83931               .append('g')
83932               .attr('class', 'bothways')
83933               .append('text')
83934               .attr('y', 40)
83935               .attr('x', 14)
83936               .text('▲▼');
83937
83938           enter
83939               .append('g')
83940               .attr('class', 'backward')
83941               .append('text')
83942               .attr('y', 40)
83943               .attr('x', 14)
83944               .text('▼');
83945
83946
83947           lane = lane
83948               .merge(enter);
83949
83950           lane
83951               .attr('transform', function(d) {
83952                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
83953               });
83954
83955           lane.select('.forward')
83956               .style('visibility', function(d) {
83957                   return d.direction === 'forward' ? 'visible' : 'hidden';
83958               });
83959
83960           lane.select('.bothways')
83961               .style('visibility', function(d) {
83962                   return d.direction === 'bothways' ? 'visible' : 'hidden';
83963               });
83964
83965           lane.select('.backward')
83966               .style('visibility', function(d) {
83967                   return d.direction === 'backward' ? 'visible' : 'hidden';
83968               });
83969       }
83970
83971
83972       lanes.entity = function(val) {
83973           if (!_entityID || _entityID !== val.id) {
83974               _entityID = val.id;
83975           }
83976       };
83977
83978       lanes.tags = function() {};
83979       lanes.focus = function() {};
83980       lanes.off = function() {};
83981
83982       return utilRebind(lanes, dispatch$1, 'on');
83983   }
83984
83985   function uiFieldLocalized(field, context) {
83986       var dispatch$1 = dispatch('change', 'input');
83987       var wikipedia = services.wikipedia;
83988       var input = select(null);
83989       var localizedInputs = select(null);
83990
83991       var allSuggestions = context.presets().collection.filter(function(p) {
83992           return p.suggestion === true;
83993       });
83994
83995       // reuse these combos
83996       var langCombo = uiCombobox(context, 'localized-lang')
83997           .fetcher(fetchLanguages)
83998           .minItems(0);
83999
84000       var brandCombo = uiCombobox(context, 'localized-brand')
84001           .canAutocomplete(false)
84002           .minItems(1);
84003
84004       var _selection = select(null);
84005       var _multilingual = [];
84006       var _isLocked = false;
84007       var _brandTip = tooltip()
84008           .title(t('inspector.lock.suggestion', { label: field.label }))
84009           .placement('bottom');
84010       var _buttonTip = tooltip()
84011           .title(t('translate.translate'))
84012           .placement('left');
84013       var _wikiTitles;
84014       var _entity;
84015
84016
84017       function calcLocked() {
84018           if (!_entity) {    // the original entity
84019               _isLocked = false;
84020               return;
84021           }
84022
84023           var latest = context.hasEntity(_entity.id);
84024           if (!latest) {    // get current entity, possibly edited
84025               _isLocked = false;
84026               return;
84027           }
84028
84029           var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
84030           var hasWikidata = latest.tags.wikidata;
84031           var preset = context.presets().match(latest, context.graph());
84032           var isSuggestion = preset && preset.suggestion;
84033           var showsBrand = preset && preset.fields
84034               .filter(function(d) { return d.id === 'brand'; }).length;
84035
84036           _isLocked = !!(field.id === 'name' && hasOriginalName &&
84037               (hasWikidata || (isSuggestion && !showsBrand)));
84038       }
84039
84040
84041       function calcMultilingual(tags) {
84042           _multilingual = [];
84043           for (var k in tags) {
84044               var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
84045               if (m && m[1] === field.key && m[2]) {
84046                   _multilingual.push({ lang: m[2], value: tags[k] });
84047               }
84048           }
84049           _multilingual.reverse();
84050       }
84051
84052
84053       function localized(selection) {
84054           _selection = selection;
84055           calcLocked();
84056           var entity = _entity && context.hasEntity(_entity.id);  // get latest
84057           var preset = entity && context.presets().match(entity, context.graph());
84058
84059           var wrap = selection.selectAll('.form-field-input-wrap')
84060               .data([0]);
84061
84062           // enter/update
84063           wrap = wrap.enter()
84064               .append('div')
84065               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
84066               .merge(wrap)
84067               .call(_isLocked ? _brandTip : _brandTip.destroy);
84068
84069
84070           input = wrap.selectAll('.localized-main')
84071               .data([0]);
84072
84073           // enter/update
84074           input = input.enter()
84075               .append('input')
84076               .attr('type', 'text')
84077               .attr('id', 'preset-input-' + field.safeid)
84078               .attr('class', 'localized-main')
84079               .attr('placeholder', field.placeholder())
84080               .call(utilNoAuto)
84081               .merge(input);
84082
84083           if (preset && field.id === 'name') {
84084               var pTag = preset.id.split('/', 2);
84085               var pKey = pTag[0];
84086               var pValue = pTag[1];
84087
84088               if (preset.suggestion) {
84089                   // A "suggestion" preset (brand name)
84090                   // Put suggestion keys in `field.keys` so delete button can remove them all.
84091                   field.keys = Object.keys(preset.removeTags)
84092                       .filter(function(k) { return k !== pKey; });
84093
84094               } else {
84095                   // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
84096                   // This code attempts to determine if the matched preset is the
84097                   // kind of preset that even can benefit from name suggestions..
84098                   // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
84099                   // - false = churches, parks, hospitals, etc. (things not in the index)
84100                   var isFallback = preset.isFallback();
84101                   var goodSuggestions = allSuggestions.filter(function(s) {
84102                       if (isFallback) return true;
84103                       var sTag = s.id.split('/', 2);
84104                       var sKey = sTag[0];
84105                       var sValue = sTag[1];
84106                       return pKey === sKey && (!pValue || pValue === sValue);
84107                   });
84108
84109                   // Show the suggestions.. If the user picks one, change the tags..
84110                   if (allSuggestions.length && goodSuggestions.length) {
84111                       input
84112                           .on('blur.localized', checkBrandOnBlur)
84113                           .call(brandCombo
84114                               .fetcher(fetchBrandNames(preset, allSuggestions))
84115                               .on('accept', acceptBrand)
84116                               .on('cancel', cancelBrand)
84117                           );
84118                   }
84119               }
84120           }
84121
84122           input
84123               .classed('disabled', !!_isLocked)
84124               .attr('readonly', _isLocked || null)
84125               .on('input', change(true))
84126               .on('blur', change())
84127               .on('change', change());
84128
84129
84130           var translateButton = wrap.selectAll('.localized-add')
84131               .data([0]);
84132
84133           translateButton = translateButton.enter()
84134               .append('button')
84135               .attr('class', 'localized-add form-field-button')
84136               .attr('tabindex', -1)
84137               .call(svgIcon('#iD-icon-plus'))
84138               .merge(translateButton);
84139
84140           translateButton
84141               .classed('disabled', !!_isLocked)
84142               .call(_isLocked ? _buttonTip.destroy : _buttonTip)
84143               .on('click', addNew);
84144
84145
84146           if (entity && !_multilingual.length) {
84147               calcMultilingual(entity.tags);
84148           }
84149
84150           localizedInputs = selection.selectAll('.localized-multilingual')
84151               .data([0]);
84152
84153           localizedInputs = localizedInputs.enter()
84154               .append('div')
84155               .attr('class', 'localized-multilingual')
84156               .merge(localizedInputs);
84157
84158           localizedInputs
84159               .call(renderMultilingual);
84160
84161           localizedInputs.selectAll('button, input')
84162               .classed('disabled', !!_isLocked)
84163               .attr('readonly', _isLocked || null);
84164
84165
84166           // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
84167           // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
84168           // So compare the current field value against the suggestions one last time.
84169           function checkBrandOnBlur() {
84170               var latest = context.hasEntity(_entity.id);
84171               if (!latest) return;   // deleting the entity blurred the field?
84172
84173               var preset = context.presets().match(latest, context.graph());
84174               if (preset && preset.suggestion) return;   // already accepted
84175
84176               // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
84177               var name = utilGetSetValue(input).trim();
84178               var matched = allSuggestions.filter(function(s) { return name === s.name(); });
84179
84180               if (matched.length === 1) {
84181                   acceptBrand({ suggestion: matched[0] });
84182               } else {
84183                   cancelBrand();
84184               }
84185           }
84186
84187
84188           function acceptBrand(d) {
84189               if (!d) {
84190                   cancelBrand();
84191                   return;
84192               }
84193
84194               var entity = context.entity(_entity.id);  // get latest
84195               var tags = entity.tags;
84196               var geometry = entity.geometry(context.graph());
84197               var removed = preset.unsetTags(tags, geometry);
84198               for (var k in tags) {
84199                   tags[k] = removed[k];  // set removed tags to `undefined`
84200               }
84201               tags = d.suggestion.setTags(tags, geometry);
84202               utilGetSetValue(input, tags.name);
84203               dispatch$1.call('change', this, tags);
84204           }
84205
84206
84207           // user hit escape, clean whatever preset name appears after the last ' – '
84208           function cancelBrand() {
84209               var name = utilGetSetValue(input);
84210               var clean = cleanName(name);
84211               if (clean !== name) {
84212                   utilGetSetValue(input, clean);
84213                   dispatch$1.call('change', this, { name: clean });
84214               }
84215           }
84216
84217           // Remove whatever is after the last ' – '
84218           // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
84219           function cleanName(name) {
84220               var parts = name.split(' – ');
84221               if (parts.length > 1) {
84222                   parts.pop();
84223                   name = parts.join(' – ');
84224               }
84225               return name;
84226           }
84227
84228
84229           function fetchBrandNames(preset, suggestions) {
84230               var pTag = preset.id.split('/', 2);
84231               var pKey = pTag[0];
84232               var pValue = pTag[1];
84233
84234               return function(value, callback) {
84235                   var results = [];
84236                   if (value && value.length > 2) {
84237                       for (var i = 0; i < suggestions.length; i++) {
84238                           var s = suggestions[i];
84239                           var sTag = s.id.split('/', 2);
84240                           var sKey = sTag[0];
84241                           var sValue = sTag[1];
84242                           var name = s.name();
84243                           var dist = utilEditDistance(value, name.substring(0, value.length));
84244                           var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
84245
84246                           if (dist < 1 || (matchesPreset && dist < 3)) {
84247                               var obj = {
84248                                   title: name,
84249                                   value: name,
84250                                   suggestion: s,
84251                                   dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
84252                               };
84253                               results.push(obj);
84254                           }
84255                       }
84256                       results.sort(function(a, b) { return a.dist - b.dist; });
84257                   }
84258                   results = results.slice(0, 10);
84259                   callback(results);
84260               };
84261           }
84262
84263
84264           function addNew() {
84265               event.preventDefault();
84266               if (_isLocked) return;
84267
84268               var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
84269               var langExists = find$1(_multilingual, function(datum) { return datum.lang === defaultLang;});
84270               var isLangEn = defaultLang.indexOf('en') > -1;
84271               if (isLangEn || langExists) {
84272                   defaultLang = '';
84273               }
84274               _multilingual.push({ lang: defaultLang, value: '' });
84275
84276               localizedInputs
84277                   .call(renderMultilingual);
84278           }
84279
84280
84281           function change(onInput) {
84282               return function() {
84283                   if (_isLocked) {
84284                       event.preventDefault();
84285                       return;
84286                   }
84287                   var t = {};
84288                   t[field.key] = utilGetSetValue(select(this)) || undefined;
84289                   dispatch$1.call('change', this, t, onInput);
84290               };
84291           }
84292       }
84293
84294
84295       function key(lang) {
84296           return field.key + ':' + lang;
84297       }
84298
84299
84300       function changeLang(d) {
84301           var lang = utilGetSetValue(select(this));
84302           var t = {};
84303           var language = find$1(wikipedia$2, function(d) {
84304               return d[0].toLowerCase() === lang.toLowerCase() ||
84305                   d[1].toLowerCase() === lang.toLowerCase();
84306           });
84307
84308           if (language) lang = language[2];
84309
84310           if (d.lang && d.lang !== lang) {
84311               t[key(d.lang)] = undefined;
84312           }
84313
84314           var value = utilGetSetValue(select(this.parentNode)
84315               .selectAll('.localized-value'));
84316
84317           if (lang && value) {
84318               t[key(lang)] = value;
84319           } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
84320               t[key(lang)] = _wikiTitles[d.lang];
84321           }
84322
84323           d.lang = lang;
84324           dispatch$1.call('change', this, t);
84325       }
84326
84327
84328       function changeValue(d) {
84329           if (!d.lang) return;
84330           var t = {};
84331           t[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
84332           dispatch$1.call('change', this, t);
84333       }
84334
84335
84336       function fetchLanguages(value, cb) {
84337           var v = value.toLowerCase();
84338
84339           cb(wikipedia$2.filter(function(d) {
84340               return d[0].toLowerCase().indexOf(v) >= 0 ||
84341               d[1].toLowerCase().indexOf(v) >= 0 ||
84342               d[2].toLowerCase().indexOf(v) >= 0;
84343           }).map(function(d) {
84344               return { value: d[1] };
84345           }));
84346       }
84347
84348
84349       function renderMultilingual(selection) {
84350           var wraps = selection.selectAll('div.entry')
84351               .data(_multilingual, function(d) { return d.lang; });
84352
84353           wraps.exit()
84354               .transition()
84355               .duration(200)
84356               .style('max-height', '0px')
84357               .style('opacity', '0')
84358               .style('top', '-10px')
84359               .remove();
84360
84361           var innerWrap = wraps.enter()
84362               .insert('div', ':first-child');
84363
84364           innerWrap
84365               .attr('class', 'entry')
84366               .each(function() {
84367                   var wrap = select(this);
84368
84369                   var label = wrap
84370                       .append('label')
84371                       .attr('class', 'form-field-label');
84372
84373                   label
84374                       .append('span')
84375                       .attr('class', 'label-text')
84376                       .text(t('translate.localized_translation_label'));
84377
84378                   label
84379                       .append('button')
84380                       .attr('class', 'remove-icon-multilingual')
84381                       .on('click', function(d){
84382                           if (_isLocked) return;
84383                           event.preventDefault();
84384                           var t = {};
84385                           t[key(d.lang)] = undefined;
84386                           dispatch$1.call('change', this, t);
84387                           select(this.parentNode.parentNode.parentNode)
84388                               .style('top', '0')
84389                               .style('max-height', '240px')
84390                               .transition()
84391                               .style('opacity', '0')
84392                               .style('max-height', '0px')
84393                               .remove();
84394                       })
84395                       .call(svgIcon('#iD-operation-delete'));
84396
84397                   wrap
84398                       .append('input')
84399                       .attr('class', 'localized-lang')
84400                       .attr('type', 'text')
84401                       .attr('placeholder', t('translate.localized_translation_language'))
84402                       .on('blur', changeLang)
84403                       .on('change', changeLang)
84404                       .call(langCombo);
84405
84406                   wrap
84407                       .append('input')
84408                       .attr('type', 'text')
84409                       .attr('placeholder', t('translate.localized_translation_name'))
84410                       .attr('class', 'localized-value')
84411                       .on('blur', changeValue)
84412                       .on('change', changeValue);
84413               });
84414
84415           innerWrap
84416               .style('margin-top', '0px')
84417               .style('max-height', '0px')
84418               .style('opacity', '0')
84419               .transition()
84420               .duration(200)
84421               .style('margin-top', '10px')
84422               .style('max-height', '240px')
84423               .style('opacity', '1')
84424               .on('end', function() {
84425                   select(this)
84426                       .style('max-height', '')
84427                       .style('overflow', 'visible');
84428               });
84429
84430
84431           var entry = selection.selectAll('.entry');
84432
84433           utilGetSetValue(entry.select('.localized-lang'), function(d) {
84434               var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
84435               return lang ? lang[1] : d.lang;
84436           });
84437
84438           utilGetSetValue(entry.select('.localized-value'),
84439               function(d) { return d.value; });
84440       }
84441
84442
84443       localized.tags = function(tags) {
84444           // Fetch translations from wikipedia
84445           if (tags.wikipedia && !_wikiTitles) {
84446               _wikiTitles = {};
84447               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
84448               if (wm && wm[0] && wm[1]) {
84449                   wikipedia.translations(wm[1], wm[2], function(d) { _wikiTitles = d; });
84450               }
84451           }
84452
84453           utilGetSetValue(input, tags[field.key] || '');
84454
84455           calcMultilingual(tags);
84456
84457           _selection
84458               .call(localized);
84459       };
84460
84461
84462       localized.focus = function() {
84463           input.node().focus();
84464       };
84465
84466
84467       localized.entity = function(val) {
84468           if (!arguments.length) return _entity;
84469           _entity = val;
84470           _multilingual = [];
84471           return localized;
84472       };
84473
84474       return utilRebind(localized, dispatch$1, 'on');
84475   }
84476
84477   function uiFieldMaxspeed(field, context) {
84478       var dispatch$1 = dispatch('change');
84479       var unitInput = select(null);
84480       var input = select(null);
84481       var _entity;
84482       var _isImperial;
84483
84484       var speedCombo = uiCombobox(context, 'maxspeed');
84485       var unitCombo = uiCombobox(context, 'maxspeed-unit')
84486               .data(['km/h', 'mph'].map(comboValues));
84487
84488       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
84489       var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
84490
84491
84492       function maxspeed(selection) {
84493
84494           var wrap = selection.selectAll('.form-field-input-wrap')
84495               .data([0]);
84496
84497           wrap = wrap.enter()
84498               .append('div')
84499               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
84500               .merge(wrap);
84501
84502
84503           input = wrap.selectAll('#preset-input-' + field.safeid)
84504               .data([0]);
84505
84506           input = input.enter()
84507               .append('input')
84508               .attr('type', 'text')
84509               .attr('id', 'preset-input-' + field.safeid)
84510               .attr('placeholder', field.placeholder())
84511               .call(utilNoAuto)
84512               .call(speedCombo)
84513               .merge(input);
84514
84515           input
84516               .on('change', change)
84517               .on('blur', change);
84518
84519           var loc;
84520           if (_entity.type === 'node') {
84521               loc = _entity.loc;
84522           } else {
84523               var childNodes = context.graph().childNodes(context.entity(_entity.id));
84524               loc = childNodes[~~(childNodes.length/2)].loc;
84525           }
84526
84527           _isImperial = some(dataImperial.features, function(f) {
84528               return some(f.geometry.coordinates, function(d) {
84529                   return geoPointInPolygon(loc, d);
84530               });
84531           });
84532
84533           unitInput = wrap.selectAll('input.maxspeed-unit')
84534               .data([0]);
84535
84536           unitInput = unitInput.enter()
84537               .append('input')
84538               .attr('type', 'text')
84539               .attr('class', 'maxspeed-unit')
84540               .call(unitCombo)
84541               .merge(unitInput);
84542
84543           unitInput
84544               .on('blur', changeUnits)
84545               .on('change', changeUnits);
84546
84547
84548           function changeUnits() {
84549               _isImperial = utilGetSetValue(unitInput) === 'mph';
84550               utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
84551               setSuggestions();
84552               change();
84553           }
84554       }
84555
84556
84557       function setSuggestions() {
84558           speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
84559           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
84560       }
84561
84562
84563       function comboValues(d) {
84564           return {
84565               value: d.toString(),
84566               title: d.toString()
84567           };
84568       }
84569
84570
84571       function change() {
84572           var tag = {};
84573           var value = utilGetSetValue(input);
84574
84575           if (!value) {
84576               tag[field.key] = undefined;
84577           } else if (isNaN(value) || !_isImperial) {
84578               tag[field.key] = value;
84579           } else {
84580               tag[field.key] = value + ' mph';
84581           }
84582
84583           dispatch$1.call('change', this, tag);
84584       }
84585
84586
84587       maxspeed.tags = function(tags) {
84588           var value = tags[field.key];
84589
84590           if (value && value.indexOf('mph') >= 0) {
84591               value = parseInt(value, 10);
84592               _isImperial = true;
84593           } else if (value) {
84594               _isImperial = false;
84595           }
84596
84597           setSuggestions();
84598           utilGetSetValue(input, value || '');
84599       };
84600
84601
84602       maxspeed.focus = function() {
84603           input.node().focus();
84604       };
84605
84606
84607       maxspeed.entity = function(val) {
84608           _entity = val;
84609       };
84610
84611
84612       return utilRebind(maxspeed, dispatch$1, 'on');
84613   }
84614
84615   /**
84616    * This function is like `baseIndexOf` except that it accepts a comparator.
84617    *
84618    * @private
84619    * @param {Array} array The array to inspect.
84620    * @param {*} value The value to search for.
84621    * @param {number} fromIndex The index to search from.
84622    * @param {Function} comparator The comparator invoked per element.
84623    * @returns {number} Returns the index of the matched value, else `-1`.
84624    */
84625   function baseIndexOfWith(array, value, fromIndex, comparator) {
84626     var index = fromIndex - 1,
84627         length = array.length;
84628
84629     while (++index < length) {
84630       if (comparator(array[index], value)) {
84631         return index;
84632       }
84633     }
84634     return -1;
84635   }
84636
84637   /** Used for built-in method references. */
84638   var arrayProto$2 = Array.prototype;
84639
84640   /** Built-in value references. */
84641   var splice$2 = arrayProto$2.splice;
84642
84643   /**
84644    * The base implementation of `_.pullAllBy` without support for iteratee
84645    * shorthands.
84646    *
84647    * @private
84648    * @param {Array} array The array to modify.
84649    * @param {Array} values The values to remove.
84650    * @param {Function} [iteratee] The iteratee invoked per element.
84651    * @param {Function} [comparator] The comparator invoked per element.
84652    * @returns {Array} Returns `array`.
84653    */
84654   function basePullAll(array, values, iteratee, comparator) {
84655     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
84656         index = -1,
84657         length = values.length,
84658         seen = array;
84659
84660     if (array === values) {
84661       values = copyArray(values);
84662     }
84663     if (iteratee) {
84664       seen = arrayMap(array, baseUnary(iteratee));
84665     }
84666     while (++index < length) {
84667       var fromIndex = 0,
84668           value = values[index],
84669           computed = iteratee ? iteratee(value) : value;
84670
84671       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
84672         if (seen !== array) {
84673           splice$2.call(seen, fromIndex, 1);
84674         }
84675         splice$2.call(array, fromIndex, 1);
84676       }
84677     }
84678     return array;
84679   }
84680
84681   /**
84682    * This method is like `_.pull` except that it accepts an array of values to remove.
84683    *
84684    * **Note:** Unlike `_.difference`, this method mutates `array`.
84685    *
84686    * @static
84687    * @memberOf _
84688    * @since 4.0.0
84689    * @category Array
84690    * @param {Array} array The array to modify.
84691    * @param {Array} values The values to remove.
84692    * @returns {Array} Returns `array`.
84693    * @example
84694    *
84695    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
84696    *
84697    * _.pullAll(array, ['a', 'c']);
84698    * console.log(array);
84699    * // => ['b', 'b']
84700    */
84701   function pullAll(array, values) {
84702     return (array && array.length && values && values.length)
84703       ? basePullAll(array, values)
84704       : array;
84705   }
84706
84707   /**
84708    * Removes all given values from `array` using
84709    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
84710    * for equality comparisons.
84711    *
84712    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
84713    * to remove elements from an array by predicate.
84714    *
84715    * @static
84716    * @memberOf _
84717    * @since 2.0.0
84718    * @category Array
84719    * @param {Array} array The array to modify.
84720    * @param {...*} [values] The values to remove.
84721    * @returns {Array} Returns `array`.
84722    * @example
84723    *
84724    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
84725    *
84726    * _.pull(array, 'a', 'c');
84727    * console.log(array);
84728    * // => ['b', 'b']
84729    */
84730   var pull = baseRest(pullAll);
84731
84732   function uiFieldRadio(field, context) {
84733       var dispatch$1 = dispatch('change');
84734       var placeholder = select(null);
84735       var wrap = select(null);
84736       var labels = select(null);
84737       var radios = select(null);
84738       var radioData = clone(field.options || field.keys);
84739       var typeField;
84740       var layerField;
84741       var _oldType = {};
84742       var _entity;
84743
84744
84745       function selectedKey() {
84746           var node = wrap.selectAll('.form-field-input-radio label.active input');
84747           return !node.empty() && node.datum();
84748       }
84749
84750
84751       function radio(selection) {
84752           selection.classed('preset-radio', true);
84753
84754           wrap = selection.selectAll('.form-field-input-wrap')
84755               .data([0]);
84756
84757           var enter = wrap.enter()
84758               .append('div')
84759               .attr('class', 'form-field-input-wrap form-field-input-radio');
84760
84761           enter
84762               .append('span')
84763               .attr('class', 'placeholder');
84764
84765           wrap = wrap
84766               .merge(enter);
84767
84768
84769           placeholder = wrap.selectAll('.placeholder');
84770
84771           labels = wrap.selectAll('label')
84772               .data(radioData);
84773
84774           enter = labels.enter()
84775               .append('label');
84776
84777           enter
84778               .append('input')
84779               .attr('type', 'radio')
84780               .attr('name', field.id)
84781               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
84782               .attr('checked', false);
84783
84784           enter
84785               .append('span')
84786               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
84787
84788           labels = labels
84789               .merge(enter);
84790
84791           radios = labels.selectAll('input')
84792               .on('change', changeRadio);
84793
84794       }
84795
84796
84797       function structureExtras(selection, tags) {
84798           var selected = selectedKey();
84799           var type = context.presets().field(selected);
84800           var layer = context.presets().field('layer');
84801           var showLayer = (selected === 'bridge' || selected === 'tunnel');
84802
84803
84804           var extrasWrap = selection.selectAll('.structure-extras-wrap')
84805               .data(selected ? [0] : []);
84806
84807           extrasWrap.exit()
84808               .remove();
84809
84810           extrasWrap = extrasWrap.enter()
84811               .append('div')
84812               .attr('class', 'structure-extras-wrap')
84813               .merge(extrasWrap);
84814
84815           var list = extrasWrap.selectAll('ul')
84816               .data([0]);
84817
84818           list = list.enter()
84819               .append('ul')
84820               .attr('class', 'labeled-inputs')
84821               .merge(list);
84822
84823
84824           // Type
84825           if (type) {
84826               if (!typeField || typeField.id !== selected) {
84827                   typeField = uiField(context, type, _entity, { wrap: false })
84828                       .on('change', changeType);
84829               }
84830               typeField.tags(tags);
84831           } else {
84832               typeField = null;
84833           }
84834
84835           var typeItem = list.selectAll('.structure-type-item')
84836               .data(typeField ? [typeField] : [], function(d) { return d.id; });
84837
84838           // Exit
84839           typeItem.exit()
84840               .remove();
84841
84842           // Enter
84843           var typeEnter = typeItem.enter()
84844               .insert('li', ':first-child')
84845               .attr('class', 'structure-type-item');
84846
84847           typeEnter
84848               .append('span')
84849               .attr('class', 'label structure-label-type')
84850               .attr('for', 'preset-input-' + selected)
84851               .text(t('inspector.radio.structure.type'));
84852
84853           typeEnter
84854               .append('div')
84855               .attr('class', 'structure-input-type-wrap');
84856
84857           // Update
84858           typeItem = typeItem
84859               .merge(typeEnter);
84860
84861           if (typeField) {
84862               typeItem.selectAll('.structure-input-type-wrap')
84863                   .call(typeField.render);
84864           }
84865
84866
84867           // Layer
84868           if (layer && showLayer) {
84869               if (!layerField) {
84870                   layerField = uiField(context, layer, _entity, { wrap: false })
84871                       .on('change', changeLayer);
84872               }
84873               layerField.tags(tags);
84874               field.keys = union(field.keys, ['layer']);
84875           } else {
84876               layerField = null;
84877               pull(field.keys, 'layer');
84878           }
84879
84880           var layerItem = list.selectAll('.structure-layer-item')
84881               .data(layerField ? [layerField] : []);
84882
84883           // Exit
84884           layerItem.exit()
84885               .remove();
84886
84887           // Enter
84888           var layerEnter = layerItem.enter()
84889               .append('li')
84890               .attr('class', 'structure-layer-item');
84891
84892           layerEnter
84893               .append('span')
84894               .attr('class', 'label structure-label-layer')
84895               .attr('for', 'preset-input-layer')
84896               .text(t('inspector.radio.structure.layer'));
84897
84898           layerEnter
84899               .append('div')
84900               .attr('class', 'structure-input-layer-wrap');
84901
84902           // Update
84903           layerItem = layerItem
84904               .merge(layerEnter);
84905
84906           if (layerField) {
84907               layerItem.selectAll('.structure-input-layer-wrap')
84908                   .call(layerField.render);
84909           }
84910       }
84911
84912
84913       function changeType(t, onInput) {
84914           var key = selectedKey();
84915           if (!key) return;
84916
84917           var val = t[key];
84918           if (val !== 'no') {
84919               _oldType[key] = val;
84920           }
84921
84922           if (field.type === 'structureRadio') {
84923               // remove layer if it should not be set
84924               if (val === 'no' ||
84925                   (key !== 'bridge' && key !== 'tunnel') ||
84926                   (key === 'tunnel' && val === 'building_passage')) {
84927                   t.layer = undefined;
84928               }
84929               // add layer if it should be set
84930               if (t.layer === undefined) {
84931                   if (key === 'bridge' && val !== 'no') {
84932                       t.layer = '1';
84933                   }
84934                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
84935                       t.layer = '-1';
84936                   }
84937               }
84938            }
84939
84940           dispatch$1.call('change', this, t, onInput);
84941       }
84942
84943
84944       function changeLayer(t, onInput) {
84945           if (t.layer === '0') {
84946               t.layer = undefined;
84947           }
84948           dispatch$1.call('change', this, t, onInput);
84949       }
84950
84951
84952       function changeRadio() {
84953           var t = {};
84954           var activeKey;
84955
84956           if (field.key) {
84957               t[field.key] = undefined;
84958           }
84959
84960           radios.each(function(d) {
84961               var active = select(this).property('checked');
84962               if (active) activeKey = d;
84963
84964               if (field.key) {
84965                   if (active) t[field.key] = d;
84966               } else {
84967                   var val = _oldType[activeKey] || 'yes';
84968                   t[d] = active ? val : undefined;
84969               }
84970           });
84971
84972           if (field.type === 'structureRadio') {
84973               if (activeKey === 'bridge') {
84974                   t.layer = '1';
84975               } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
84976                   t.layer = '-1';
84977               } else {
84978                   t.layer = undefined;
84979               }
84980           }
84981
84982           dispatch$1.call('change', this, t);
84983       }
84984
84985
84986       radio.tags = function(tags) {
84987           function checked(d) {
84988               if (field.key) {
84989                   return tags[field.key] === d;
84990               } else {
84991                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
84992               }
84993           }
84994
84995           labels.classed('active', checked);
84996           radios.property('checked', checked);
84997
84998           var selection = radios.filter(function() { return this.checked; });
84999
85000           if (selection.empty()) {
85001               placeholder.text(t('inspector.none'));
85002           } else {
85003               placeholder.text(selection.attr('value'));
85004               _oldType[selection.datum()] = tags[selection.datum()];
85005           }
85006
85007           if (field.type === 'structureRadio') {
85008               // For waterways without a tunnel tag, set 'culvert' as
85009               // the _oldType to default to if the user picks 'tunnel'
85010               if (!!tags.waterway && !_oldType.tunnel) {
85011                   _oldType.tunnel = 'culvert';
85012               }
85013
85014               wrap.call(structureExtras, tags);
85015           }
85016       };
85017
85018
85019       radio.focus = function() {
85020           radios.node().focus();
85021       };
85022
85023
85024       radio.entity = function(val) {
85025           if (!arguments.length) return _entity;
85026           _entity = val;
85027           _oldType = {};
85028           return radio;
85029       };
85030
85031
85032       return utilRebind(radio, dispatch$1, 'on');
85033   }
85034
85035   function uiFieldRestrictions(field, context) {
85036       var dispatch$1 = dispatch('change');
85037       var breathe = behaviorBreathe(context);
85038       var storedViaWay = context.storage('turn-restriction-via-way');
85039       var storedDistance = context.storage('turn-restriction-distance');
85040
85041       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
85042       var _maxDistance = storedDistance ? (+storedDistance) : 30;
85043       var _initialized = false;
85044       var _parent = select(null);       // the entire field
85045       var _container = select(null);    // just the map
85046       var _oldTurns;
85047       var _graph;
85048       var _vertexID;
85049       var _intersection;
85050       var _fromWayID;
85051
85052       var _lastXPos;
85053
85054
85055       function restrictions(selection) {
85056           _parent = selection;
85057
85058           // try to reuse the intersection, but always rebuild it if the graph has changed
85059           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
85060               _graph = context.graph();
85061               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
85062           }
85063
85064           // It's possible for there to be no actual intersection here.
85065           // for example, a vertex of two `highway=path`
85066           // In this case, hide the field.
85067           var isOK = (
85068               _intersection &&
85069               _intersection.vertices.length &&           // has vertices
85070               _intersection.vertices                     // has the vertex that the user selected
85071                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
85072               _intersection.ways.length > 2 &&           // has more than 2 ways
85073               _intersection.ways                         // has more than 1 TO way
85074                   .filter(function(way) { return way.__to; }).length > 1
85075           );
85076
85077           // Also hide in the case where
85078           select(selection.node().parentNode).classed('hide', !isOK);
85079
85080           // if form field is hidden or has detached from dom, clean up.
85081           if (!isOK ||
85082               !select('.inspector-wrap.inspector-hidden').empty() ||
85083               !selection.node().parentNode ||
85084               !selection.node().parentNode.parentNode) {
85085               selection.call(restrictions.off);
85086               return;
85087           }
85088
85089
85090           var wrap = selection.selectAll('.form-field-input-wrap')
85091               .data([0]);
85092
85093           wrap = wrap.enter()
85094               .append('div')
85095               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85096               .merge(wrap);
85097
85098           var container = wrap.selectAll('.restriction-container')
85099               .data([0]);
85100
85101           // enter
85102           var containerEnter = container.enter()
85103               .append('div')
85104               .attr('class', 'restriction-container');
85105
85106           containerEnter
85107               .append('div')
85108               .attr('class', 'restriction-help');
85109
85110           // update
85111           _container = containerEnter
85112               .merge(container)
85113               .call(renderViewer);
85114
85115           var controls = wrap.selectAll('.restriction-controls')
85116               .data([0]);
85117
85118           // enter/update
85119           controls.enter()
85120               .append('div')
85121               .attr('class', 'restriction-controls-container')
85122               .append('div')
85123               .attr('class', 'restriction-controls')
85124               .merge(controls)
85125               .call(renderControls);
85126       }
85127
85128
85129       function renderControls(selection) {
85130           var distControl = selection.selectAll('.restriction-distance')
85131               .data([0]);
85132
85133           distControl.exit()
85134               .remove();
85135
85136           var distControlEnter = distControl.enter()
85137               .append('div')
85138               .attr('class', 'restriction-control restriction-distance');
85139
85140           distControlEnter
85141               .append('span')
85142               .attr('class', 'restriction-control-label restriction-distance-label')
85143               .text(t('restriction.controls.distance') + ':');
85144
85145           distControlEnter
85146               .append('input')
85147               .attr('class', 'restriction-distance-input')
85148               .attr('type', 'range')
85149               .attr('min', '20')
85150               .attr('max', '50')
85151               .attr('step', '5');
85152
85153           distControlEnter
85154               .append('span')
85155               .attr('class', 'restriction-distance-text');
85156
85157           // update
85158           selection.selectAll('.restriction-distance-input')
85159               .property('value', _maxDistance)
85160               .on('input', function() {
85161                   var val = select(this).property('value');
85162                   _maxDistance = +val;
85163                   _intersection = null;
85164                   _container.selectAll('.layer-osm .layer-turns *').remove();
85165                   context.storage('turn-restriction-distance', _maxDistance);
85166                   _parent.call(restrictions);
85167               });
85168
85169           selection.selectAll('.restriction-distance-text')
85170               .text(displayMaxDistance(_maxDistance));
85171
85172
85173           var viaControl = selection.selectAll('.restriction-via-way')
85174               .data([0]);
85175
85176           viaControl.exit()
85177               .remove();
85178
85179           var viaControlEnter = viaControl.enter()
85180               .append('div')
85181               .attr('class', 'restriction-control restriction-via-way');
85182
85183           viaControlEnter
85184               .append('span')
85185               .attr('class', 'restriction-control-label restriction-via-way-label')
85186               .text(t('restriction.controls.via') + ':');
85187
85188           viaControlEnter
85189               .append('input')
85190               .attr('class', 'restriction-via-way-input')
85191               .attr('type', 'range')
85192               .attr('min', '0')
85193               .attr('max', '2')
85194               .attr('step', '1');
85195
85196           viaControlEnter
85197               .append('span')
85198               .attr('class', 'restriction-via-way-text');
85199
85200           // update
85201           selection.selectAll('.restriction-via-way-input')
85202               .property('value', _maxViaWay)
85203               .on('input', function() {
85204                   var val = select(this).property('value');
85205                   _maxViaWay = +val;
85206                   _container.selectAll('.layer-osm .layer-turns *').remove();
85207                   context.storage('turn-restriction-via-way', _maxViaWay);
85208                   _parent.call(restrictions);
85209               });
85210
85211           selection.selectAll('.restriction-via-way-text')
85212               .text(displayMaxVia(_maxViaWay));
85213       }
85214
85215
85216       function renderViewer(selection) {
85217           if (!_intersection) return;
85218
85219           var vgraph = _intersection.graph;
85220           var filter = utilFunctor(true);
85221           var projection = geoRawMercator();
85222
85223           // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
85224           // Instead of asking the restriction-container for its dimensions,
85225           //  we can ask the #sidebar, which can have its dimensions cached.
85226           // width: calc as sidebar - padding
85227           // height: hardcoded (from `80_app.css`)
85228           // var d = utilGetDimensions(selection);
85229           var sdims = utilGetDimensions(select('#sidebar'));
85230           var d = [ sdims[0] - 50, 370 ];
85231           var c = geoVecScale(d, 0.5);
85232           var z = 22;
85233
85234           projection.scale(geoZoomToScale(z));
85235
85236           // Calculate extent of all key vertices
85237           var extent = geoExtent();
85238           for (var i = 0; i < _intersection.vertices.length; i++) {
85239               extent._extend(_intersection.vertices[i].extent());
85240           }
85241
85242           // If this is a large intersection, adjust zoom to fit extent
85243           if (_intersection.vertices.length > 1) {
85244               var padding = 180;   // in z22 pixels
85245               var tl = projection([extent[0][0], extent[1][1]]);
85246               var br = projection([extent[1][0], extent[0][1]]);
85247               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
85248               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
85249               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
85250               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
85251               z = z - Math.max(hZoomDiff, vZoomDiff);
85252               projection.scale(geoZoomToScale(z));
85253           }
85254
85255           var padTop = 35;   // reserve top space for hint text
85256           var extentCenter = projection(extent.center());
85257           extentCenter[1] = extentCenter[1] - padTop;
85258
85259           projection
85260               .translate(geoVecSubtract(c, extentCenter))
85261               .clipExtent([[0, 0], d]);
85262
85263           var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
85264           var drawVertices = svgVertices(projection, context);
85265           var drawLines = svgLines(projection, context);
85266           var drawTurns = svgTurns(projection, context);
85267
85268           var firstTime = selection.selectAll('.surface').empty();
85269
85270           selection
85271               .call(drawLayers);
85272
85273           var surface = selection.selectAll('.surface')
85274               .classed('tr', true);
85275
85276           if (firstTime) {
85277               _initialized = true;
85278
85279               surface
85280                   .call(breathe);
85281           }
85282
85283           // This can happen if we've lowered the detail while a FROM way
85284           // is selected, and that way is no longer part of the intersection.
85285           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
85286               _fromWayID = null;
85287               _oldTurns = null;
85288           }
85289
85290           surface
85291               .call(utilSetDimensions, d)
85292               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
85293               .call(drawLines, vgraph, _intersection.ways, filter)
85294               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
85295
85296           surface
85297               .on('click.restrictions', click)
85298               .on('mouseover.restrictions', mouseover);
85299
85300           surface
85301               .selectAll('.selected')
85302               .classed('selected', false);
85303
85304           surface
85305               .selectAll('.related')
85306               .classed('related', false);
85307
85308           if (_fromWayID) {
85309               var way = vgraph.entity(_fromWayID);
85310               surface
85311                   .selectAll('.' + _fromWayID)
85312                   .classed('selected', true)
85313                   .classed('related', true);
85314           }
85315
85316           document.addEventListener('resizeWindow', function () {
85317               utilSetDimensions(_container, null);
85318               redraw(1);
85319           }, false);
85320
85321           updateHints(null);
85322
85323
85324           function click() {
85325               surface
85326                   .call(breathe.off)
85327                   .call(breathe);
85328
85329               var datum = event.target.__data__;
85330               var entity = datum && datum.properties && datum.properties.entity;
85331               if (entity) {
85332                   datum = entity;
85333               }
85334
85335               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
85336                   _fromWayID = datum.id;
85337                   _oldTurns = null;
85338                   redraw();
85339
85340               } else if (datum instanceof osmTurn) {
85341                   var actions, extraActions, turns, i;
85342                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
85343
85344                   if (datum.restrictionID && !datum.direct) {
85345                       return;
85346
85347                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
85348                       var seen = {};
85349                       var datumOnly = cloneDeep(datum);
85350                       datumOnly.only = true;
85351                       restrictionType = restrictionType.replace(/^no/, 'only');
85352
85353                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
85354                       // We will remember them in _oldTurns, and restore them if the user clicks again.
85355                       turns = _intersection.turns(_fromWayID, 2);
85356                       extraActions = [];
85357                       _oldTurns = [];
85358                       for (i = 0; i < turns.length; i++) {
85359                           var turn = turns[i];
85360                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
85361
85362                           if (turn.direct && turn.path[1] === datum.path[1]) {
85363                               seen[turns[i].restrictionID] = true;
85364                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
85365                               _oldTurns.push(turn);
85366                               extraActions.push(actionUnrestrictTurn(turn));
85367                           }
85368                       }
85369
85370                       actions = _intersection.actions.concat(extraActions, [
85371                           actionRestrictTurn(datumOnly, restrictionType),
85372                           t('operations.restriction.annotation.create')
85373                       ]);
85374
85375                   } else if (datum.restrictionID) {   // ONLY -> Allowed
85376                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
85377                       // This relies on the assumption that the intersection was already split up when we
85378                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
85379                       turns = _oldTurns || [];
85380                       extraActions = [];
85381                       for (i = 0; i < turns.length; i++) {
85382                           if (turns[i].key !== datum.key) {
85383                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
85384                           }
85385                       }
85386                       _oldTurns = null;
85387
85388                       actions = _intersection.actions.concat(extraActions, [
85389                           actionUnrestrictTurn(datum),
85390                           t('operations.restriction.annotation.delete')
85391                       ]);
85392
85393                   } else {    // Allowed -> NO
85394                       actions = _intersection.actions.concat([
85395                           actionRestrictTurn(datum, restrictionType),
85396                           t('operations.restriction.annotation.create')
85397                       ]);
85398                   }
85399
85400                   context.perform.apply(context, actions);
85401
85402                   // At this point the datum will be changed, but will have same key..
85403                   // Refresh it and update the help..
85404                   var s = surface.selectAll('.' + datum.key);
85405                   datum = s.empty() ? null : s.datum();
85406                   updateHints(datum);
85407
85408               } else {
85409                   _fromWayID = null;
85410                   _oldTurns = null;
85411                   redraw();
85412               }
85413           }
85414
85415
85416           function mouseover() {
85417               var datum = event.target.__data__;
85418               updateHints(datum);
85419           }
85420
85421           _lastXPos = _lastXPos || sdims[0];
85422
85423           function redraw(minChange) {
85424               var xPos = -1;
85425
85426               if (minChange) {
85427                   xPos = utilGetDimensions(select('#sidebar'))[0];
85428               }
85429
85430               if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
85431                   if (context.hasEntity(_vertexID)) {
85432                       _lastXPos = xPos;
85433                       _container.call(renderViewer);
85434                   }
85435               }
85436           }
85437
85438
85439           function highlightPathsFrom(wayID) {
85440               surface.selectAll('.related')
85441                   .classed('related', false)
85442                   .classed('allow', false)
85443                   .classed('restrict', false)
85444                   .classed('only', false);
85445
85446               surface.selectAll('.' + wayID)
85447                   .classed('related', true);
85448
85449               if (wayID) {
85450                   var turns = _intersection.turns(wayID, _maxViaWay);
85451                   for (var i = 0; i < turns.length; i++) {
85452                       var turn = turns[i];
85453                       var ids = [turn.to.way];
85454                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
85455
85456                       if (turn.only || turns.length === 1) {
85457                           if (turn.via.ways) {
85458                               ids = ids.concat(turn.via.ways);
85459                           }
85460                       } else if (turn.to.way === wayID) {
85461                           continue;
85462                       }
85463
85464                       surface.selectAll(utilEntitySelector(ids))
85465                           .classed('related', true)
85466                           .classed('allow', (klass === 'allow'))
85467                           .classed('restrict', (klass === 'restrict'))
85468                           .classed('only', (klass === 'only'));
85469                   }
85470               }
85471           }
85472
85473
85474           function updateHints(datum) {
85475               var help = _container.selectAll('.restriction-help').html('');
85476
85477               var placeholders = {};
85478               ['from', 'via', 'to'].forEach(function(k) {
85479                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
85480               });
85481
85482               var entity = datum && datum.properties && datum.properties.entity;
85483               if (entity) {
85484                   datum = entity;
85485               }
85486
85487               if (_fromWayID) {
85488                   way = vgraph.entity(_fromWayID);
85489                   surface
85490                       .selectAll('.' + _fromWayID)
85491                       .classed('selected', true)
85492                       .classed('related', true);
85493               }
85494
85495               // Hovering a way
85496               if (datum instanceof osmWay && datum.__from) {
85497                   way = datum;
85498
85499                   highlightPathsFrom(_fromWayID ? null : way.id);
85500                   surface.selectAll('.' + way.id)
85501                       .classed('related', true);
85502
85503                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
85504                   help
85505                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
85506                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
85507                           from: placeholders.from,
85508                           fromName: displayName(way.id, vgraph)
85509                       }));
85510
85511
85512               // Hovering a turn arrow
85513               } else if (datum instanceof osmTurn) {
85514                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
85515                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
85516                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
85517                   var klass, turnText, nextText;
85518
85519                   if (datum.no) {
85520                       klass = 'restrict';
85521                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
85522                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
85523                   } else if (datum.only) {
85524                       klass = 'only';
85525                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
85526                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
85527                   } else {
85528                       klass = 'allow';
85529                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
85530                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
85531                   }
85532
85533                   help
85534                       .append('div')      // "NO Right Turn (indirect)"
85535                       .attr('class', 'qualifier ' + klass)
85536                       .text(turnText);
85537
85538                   help
85539                       .append('div')      // "FROM {fromName} TO {toName}"
85540                       .html(t('restriction.help.from_name_to_name', {
85541                           from: placeholders.from,
85542                           fromName: displayName(datum.from.way, vgraph),
85543                           to: placeholders.to,
85544                           toName: displayName(datum.to.way, vgraph)
85545                       }));
85546
85547                   if (datum.via.ways && datum.via.ways.length) {
85548                       var names = [];
85549                       for (var i = 0; i < datum.via.ways.length; i++) {
85550                           var prev = names[names.length - 1];
85551                           var curr = displayName(datum.via.ways[i], vgraph);
85552                           if (!prev || curr !== prev)   // collapse identical names
85553                               names.push(curr);
85554                       }
85555
85556                       help
85557                           .append('div')      // "VIA {viaNames}"
85558                           .html(t('restriction.help.via_names', {
85559                               via: placeholders.via,
85560                               viaNames: names.join(', ')
85561                           }));
85562                   }
85563
85564                   if (!indirect) {
85565                       help
85566                           .append('div')      // Click for "No Right Turn"
85567                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
85568                   }
85569
85570                   highlightPathsFrom(null);
85571                   var alongIDs = datum.path.slice();
85572                   surface.selectAll(utilEntitySelector(alongIDs))
85573                       .classed('related', true)
85574                       .classed('allow', (klass === 'allow'))
85575                       .classed('restrict', (klass === 'restrict'))
85576                       .classed('only', (klass === 'only'));
85577
85578
85579               // Hovering empty surface
85580               } else {
85581                   highlightPathsFrom(null);
85582                   if (_fromWayID) {
85583                       help
85584                           .append('div')      // "FROM {fromName}"
85585                           .html(t('restriction.help.from_name', {
85586                               from: placeholders.from,
85587                               fromName: displayName(_fromWayID, vgraph)
85588                           }));
85589
85590                   } else {
85591                       help
85592                           .append('div')      // "Click to select a FROM segment."
85593                           .html(t('restriction.help.select_from', {
85594                               from: placeholders.from
85595                           }));
85596                   }
85597               }
85598           }
85599       }
85600
85601
85602       function displayMaxDistance(maxDist) {
85603           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
85604           var opts;
85605
85606           if (isImperial) {
85607               var distToFeet = {   // imprecise conversion for prettier display
85608                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
85609               }[maxDist];
85610               opts = { distance: t('units.feet', { quantity: distToFeet }) };
85611           } else {
85612               opts = { distance: t('units.meters', { quantity: maxDist }) };
85613           }
85614
85615           return t('restriction.controls.distance_up_to', opts);
85616       }
85617
85618
85619       function displayMaxVia(maxVia) {
85620           return maxVia === 0 ? t('restriction.controls.via_node_only')
85621               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
85622               : t('restriction.controls.via_up_to_two');
85623       }
85624
85625
85626       function displayName(entityID, graph) {
85627           var entity = graph.entity(entityID);
85628           var name = utilDisplayName(entity) || '';
85629           var matched = context.presets().match(entity, graph);
85630           var type = (matched && matched.name()) || utilDisplayType(entity.id);
85631           return name || type;
85632       }
85633
85634
85635       restrictions.entity = function(_) {
85636           _intersection = null;
85637           _fromWayID = null;
85638           _oldTurns = null;
85639           _vertexID = _.id;
85640       };
85641
85642
85643       restrictions.tags = function() {};
85644       restrictions.focus = function() {};
85645
85646
85647       restrictions.off = function(selection) {
85648           if (!_initialized) return;
85649
85650           selection.selectAll('.surface')
85651               .call(breathe.off)
85652               .on('click.restrictions', null)
85653               .on('mouseover.restrictions', null);
85654
85655           select(window)
85656               .on('resize.restrictions', null);
85657       };
85658
85659
85660       return utilRebind(restrictions, dispatch$1, 'on');
85661   }
85662
85663   function uiFieldTextarea(field) {
85664       var dispatch$1 = dispatch('change');
85665       var input = select(null);
85666
85667
85668       function textarea(selection) {
85669           var wrap = selection.selectAll('.form-field-input-wrap')
85670               .data([0]);
85671
85672           wrap = wrap.enter()
85673               .append('div')
85674               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85675               .merge(wrap);
85676
85677           input = wrap.selectAll('textarea')
85678               .data([0]);
85679
85680           input = input.enter()
85681               .append('textarea')
85682               .attr('id', 'preset-input-' + field.safeid)
85683               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
85684               .attr('maxlength', 255)
85685               .call(utilNoAuto)
85686               .on('input', change(true))
85687               .on('blur', change())
85688               .on('change', change())
85689               .merge(input);
85690       }
85691
85692
85693       function change(onInput) {
85694           return function() {
85695               var t = {};
85696               t[field.key] = utilGetSetValue(input) || undefined;
85697               dispatch$1.call('change', this, t, onInput);
85698           };
85699       }
85700
85701
85702       textarea.tags = function(tags) {
85703           utilGetSetValue(input, tags[field.key] || '');
85704       };
85705
85706
85707       textarea.focus = function() {
85708           input.node().focus();
85709       };
85710
85711
85712       return utilRebind(textarea, dispatch$1, 'on');
85713   }
85714
85715   function uiFieldWikidata(field) {
85716       var wikidata = services.wikidata;
85717       var dispatch$1 = dispatch('change');
85718       var link = select(null);
85719       var title = select(null);
85720       var _wikiURL = '';
85721
85722
85723       function wiki(selection) {
85724
85725           var wrap = selection.selectAll('.form-field-input-wrap')
85726               .data([0]);
85727
85728           wrap = wrap.enter()
85729               .append('div')
85730               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85731               .merge(wrap);
85732
85733
85734           var list = wrap.selectAll('ul')
85735               .data([0]);
85736
85737           list = list.enter()
85738               .append('ul')
85739               .attr('class', 'labeled-inputs')
85740               .merge(list);
85741
85742           var wikidataProperties = ['identifier', 'label', 'description'];
85743
85744           var items = list.selectAll('li')
85745               .data(wikidataProperties);
85746
85747           // Enter
85748           var enter = items.enter()
85749               .append('li')
85750               .attr('class', function(d) { return 'preset-wikidata-' + d; });
85751
85752           enter
85753               .append('span')
85754               .attr('class', 'label')
85755               .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
85756               .text(function(d) { return t('wikidata.' + d); });
85757
85758           var inputWrap = enter
85759               .append('div')
85760               .attr('class', 'input-wrap');
85761
85762           inputWrap
85763               .append('input')
85764               .attr('type', 'text')
85765               .attr('class', 'preset-input-wikidata')
85766               .attr('id', function(d) { return 'preset-input-wikidata-' + d; });
85767
85768
85769           title = wrap.select('.preset-wikidata-identifier input')
85770               .call(utilNoAuto)
85771               .merge(title);
85772
85773           title
85774               .on('blur', blur)
85775               .on('change', change);
85776
85777           var idItem = wrap.select('.preset-wikidata-identifier');
85778
85779           idItem.select('button')
85780               .remove();
85781
85782           link = idItem
85783               .append('button')
85784               .attr('class', 'form-field-button wiki-link')
85785               .attr('title', t('icons.open_wikidata'))
85786               .attr('tabindex', -1)
85787               .call(svgIcon('#iD-icon-out-link'))
85788               .merge(link);
85789
85790           link
85791               .on('click', function() {
85792                   event.preventDefault();
85793                   if (_wikiURL) window.open(_wikiURL, '_blank');
85794               });
85795
85796           var readOnlyItems = wrap.selectAll('li:not(.preset-wikidata-identifier)');
85797
85798           readOnlyItems.select('input')
85799               .classed('disabled', 'true')
85800               .attr('readonly', 'true');
85801
85802           readOnlyItems.select('button')
85803               .remove();
85804
85805           readOnlyItems.append('button')
85806               .attr('class', 'form-field-button wiki-link')
85807               .attr('title', t('icons.copy'))
85808               .attr('tabindex', -1)
85809               .call(svgIcon('#iD-operation-copy'))
85810               .on('click', function() {
85811                   event.preventDefault();
85812                   select(this.parentNode)
85813                       .select('input')
85814                       .node()
85815                       .select();
85816                   document.execCommand('copy');
85817               });
85818       }
85819
85820
85821       function blur() {
85822           change();
85823       }
85824
85825
85826       function change() {
85827           var syncTags = {
85828               wikidata: utilGetSetValue(title)
85829           };
85830           dispatch$1.call('change', this, syncTags);
85831       }
85832
85833
85834       wiki.tags = function(tags) {
85835           var value = tags[field.key] || '';
85836           utilGetSetValue(title, value);
85837
85838           if (!/^Q[0-9]*$/.test(value)) {   // not a proper QID
85839               unrecognized();
85840               return;
85841           }
85842
85843           // QID value in correct format
85844           _wikiURL = 'https://wikidata.org/wiki/' + value;
85845           wikidata.entityByQID(value, function(err, entity) {
85846               if (err) {
85847                   unrecognized();
85848                   return;
85849               }
85850
85851               var label = '';
85852               var description = '';
85853
85854               if (entity.labels && Object.keys(entity.labels).length > 0) {
85855                   label = entity.labels[Object.keys(entity.labels)[0]].value;
85856               }
85857               if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
85858                   description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
85859               }
85860
85861               select('.preset-wikidata-label')
85862                   .style('display', function(){
85863                       return label.length > 0 ? 'flex' : 'none';
85864                   })
85865                   .select('input')
85866                   .attr('value', label);
85867
85868               select('.preset-wikidata-description')
85869                   .style('display', function(){
85870                       return description.length > 0 ? 'flex' : 'none';
85871                   })
85872                   .select('input')
85873                   .attr('value', description);
85874           });
85875
85876
85877           // not a proper QID
85878           function unrecognized() {
85879               select('.preset-wikidata-label')
85880                   .style('display', 'none');
85881               select('.preset-wikidata-description')
85882                   .style('display', 'none');
85883
85884               if (value && value !== '') {
85885                   _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value;
85886               } else {
85887                   _wikiURL = '';
85888               }
85889           }
85890       };
85891
85892
85893       wiki.focus = function() {
85894           title.node().focus();
85895       };
85896
85897
85898       return utilRebind(wiki, dispatch$1, 'on');
85899   }
85900
85901   function uiFieldWikipedia(field, context) {
85902       var dispatch$1 = dispatch('change');
85903       var wikipedia = services.wikipedia;
85904       var wikidata = services.wikidata;
85905       var lang = select(null);
85906       var title = select(null);
85907       var _wikiURL = '';
85908       var _entity;
85909
85910       var langCombo = uiCombobox(context, 'wikipedia-lang')
85911           .fetcher(function(value, cb) {
85912               var v = value.toLowerCase();
85913
85914               cb(wikipedia$2.filter(function(d) {
85915                   return d[0].toLowerCase().indexOf(v) >= 0 ||
85916                       d[1].toLowerCase().indexOf(v) >= 0 ||
85917                       d[2].toLowerCase().indexOf(v) >= 0;
85918               }).map(function(d) {
85919                   return { value: d[1] };
85920               }));
85921           });
85922
85923       var titleCombo = uiCombobox(context, 'wikipedia-title')
85924           .fetcher(function(value, cb) {
85925               if (!value && _entity) {
85926                   value = context.entity(_entity.id).tags.name || '';
85927               }
85928
85929               var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
85930               searchfn(language()[2], value, function(query, data) {
85931                   cb(data.map(function(d) {
85932                       return { value: d };
85933                   }));
85934               });
85935           });
85936
85937
85938       function wiki(selection) {
85939           var wrap = selection.selectAll('.form-field-input-wrap')
85940               .data([0]);
85941
85942           wrap = wrap.enter()
85943               .append('div')
85944               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
85945               .merge(wrap);
85946
85947
85948           var langRow = wrap.selectAll('.wiki-lang-container')
85949               .data([0]);
85950
85951           langRow = langRow.enter()
85952               .append('div')
85953               .attr('class', 'wiki-lang-container')
85954               .merge(langRow);
85955
85956
85957           lang = langRow.selectAll('input.wiki-lang')
85958               .data([0]);
85959
85960           lang = lang.enter()
85961               .append('input')
85962               .attr('type', 'text')
85963               .attr('class', 'wiki-lang')
85964               .attr('placeholder', t('translate.localized_translation_language'))
85965               .call(utilNoAuto)
85966               .call(langCombo)
85967               .merge(lang);
85968
85969           utilGetSetValue(lang, language()[1]);
85970
85971           lang
85972               .on('blur', changeLang)
85973               .on('change', changeLang);
85974
85975
85976           var titleRow = wrap.selectAll('.wiki-title-container')
85977               .data([0]);
85978
85979           titleRow = titleRow.enter()
85980               .append('div')
85981               .attr('class', 'wiki-title-container')
85982               .merge(titleRow);
85983
85984           title = titleRow.selectAll('input.wiki-title')
85985               .data([0]);
85986
85987           title = title.enter()
85988               .append('input')
85989               .attr('type', 'text')
85990               .attr('class', 'wiki-title')
85991               .attr('id', 'preset-input-' + field.safeid)
85992               .call(utilNoAuto)
85993               .call(titleCombo)
85994               .merge(title);
85995
85996           title
85997               .on('blur', blur)
85998               .on('change', change);
85999
86000
86001           var link = titleRow.selectAll('.wiki-link')
86002               .data([0]);
86003
86004           link = link.enter()
86005               .append('button')
86006               .attr('class', 'form-field-button wiki-link')
86007               .attr('tabindex', -1)
86008               .call(svgIcon('#iD-icon-out-link'))
86009               .merge(link);
86010
86011           link
86012               .on('click', function() {
86013                   event.preventDefault();
86014                   if (_wikiURL) window.open(_wikiURL, '_blank');
86015               });
86016       }
86017
86018
86019       function language() {
86020           var value = utilGetSetValue(lang).toLowerCase();
86021           var locale = utilDetect().locale.toLowerCase();
86022           var localeLanguage;
86023           return find$1(wikipedia$2, function(d) {
86024               if (d[2] === locale) localeLanguage = d;
86025               return d[0].toLowerCase() === value ||
86026                   d[1].toLowerCase() === value ||
86027                   d[2] === value;
86028           }) || localeLanguage || ['English', 'English', 'en'];
86029       }
86030
86031
86032       function changeLang() {
86033           utilGetSetValue(lang, language()[1]);
86034           change(true);
86035       }
86036
86037
86038       function blur() {
86039           change(true);
86040       }
86041
86042
86043       function change(skipWikidata) {
86044           var value = utilGetSetValue(title);
86045           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
86046           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
86047           var syncTags = {};
86048
86049           if (l) {
86050               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
86051               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
86052               if (m[3]) {
86053                   var anchor;
86054                   try {
86055                       // Best-effort `anchordecode:` implementation
86056                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
86057                   } catch (e) {
86058                       anchor = decodeURIComponent(m[3]);
86059                   }
86060                   value += '#' + anchor.replace(/_/g, ' ');
86061               }
86062               value = value.slice(0, 1).toUpperCase() + value.slice(1);
86063               utilGetSetValue(lang, l[1]);
86064               utilGetSetValue(title, value);
86065           }
86066
86067           if (value) {
86068               syncTags.wikipedia = language()[2] + ':' + value;
86069           } else {
86070               syncTags.wikipedia = undefined;
86071               syncTags.wikidata = undefined;
86072           }
86073
86074           dispatch$1.call('change', this, syncTags);
86075
86076
86077           if (skipWikidata || !value || !language()[2]) return;
86078
86079           // attempt asynchronous update of wikidata tag..
86080           var initGraph = context.graph();
86081           var initEntityID = _entity.id;
86082
86083           wikidata.itemsByTitle(language()[2], value, function(err, data) {
86084               if (err) return;
86085
86086               // If graph has changed, we can't apply this update.
86087               if (context.graph() !== initGraph) return;
86088
86089               if (!data || !Object.keys(data).length) return;
86090
86091               var qids = Object.keys(data);
86092               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
86093               var currTags = clone(context.entity(initEntityID).tags);
86094
86095               currTags.wikidata = value;
86096
86097               // Coalesce the update of wikidata tag into the previous tag change
86098               context.overwrite(
86099                   actionChangeTags(initEntityID, currTags),
86100                   context.history().undoAnnotation()
86101               );
86102
86103               // do not dispatch.call('change') here, because entity_editor
86104               // changeTags() is not intended to be called asynchronously
86105           });
86106       }
86107
86108
86109       wiki.tags = function(tags) {
86110           var value = tags[field.key] || '';
86111           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
86112           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
86113           var anchor = m && m[3];
86114
86115           // value in correct format
86116           if (l) {
86117               utilGetSetValue(lang, l[1]);
86118               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
86119               if (anchor) {
86120                   try {
86121                       // Best-effort `anchorencode:` implementation
86122                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
86123                   } catch (e) {
86124                       anchor = anchor.replace(/ /g, '_');
86125                   }
86126               }
86127               _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
86128                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
86129
86130           // unrecognized value format
86131           } else {
86132               utilGetSetValue(title, value);
86133               if (value && value !== '') {
86134                   utilGetSetValue(lang, '');
86135                   _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
86136               } else {
86137                   _wikiURL = '';
86138               }
86139           }
86140       };
86141
86142
86143       wiki.entity = function(val) {
86144           if (!arguments.length) return _entity;
86145           _entity = val;
86146           return wiki;
86147       };
86148
86149
86150       wiki.focus = function() {
86151           title.node().focus();
86152       };
86153
86154
86155       return utilRebind(wiki, dispatch$1, 'on');
86156   }
86157
86158   var uiFields = {
86159       access: uiFieldAccess,
86160       address: uiFieldAddress,
86161       check: uiFieldCheck,
86162       combo: uiFieldCombo,
86163       cycleway: uiFieldCycleway,
86164       defaultCheck: uiFieldCheck,
86165       email: uiFieldText,
86166       lanes: uiFieldLanes,
86167       localized: uiFieldLocalized,
86168       maxspeed: uiFieldMaxspeed,
86169       multiCombo: uiFieldCombo,
86170       networkCombo: uiFieldCombo,
86171       number: uiFieldText,
86172       onewayCheck: uiFieldCheck,
86173       radio: uiFieldRadio,
86174       restrictions: uiFieldRestrictions,
86175       semiCombo: uiFieldCombo,
86176       structureRadio: uiFieldRadio,
86177       tel: uiFieldText,
86178       text: uiFieldText,
86179       textarea: uiFieldTextarea,
86180       typeCombo: uiFieldCombo,
86181       url: uiFieldText,
86182       wikidata: uiFieldWikidata,
86183       wikipedia: uiFieldWikipedia
86184   };
86185
86186   function uiField(context, presetField, entity, options) {
86187       options = assignIn({
86188           show: true,
86189           wrap: true,
86190           remove: true,
86191           revert: true,
86192           info: true
86193       }, options);
86194
86195       var dispatch$1 = dispatch('change');
86196       var field = clone(presetField);
86197       var _show = options.show;
86198       var _state = '';
86199       var _tags = {};
86200
86201       field.keys = field.keys || [field.key];
86202
86203       // only create the fields that are actually being shown
86204       if (_show && !field.impl) {
86205           createField();
86206       }
86207
86208       // Creates the field.. This is done lazily,
86209       // once we know that the field will be shown.
86210       function createField() {
86211           field.impl = uiFields[field.type](field, context)
86212               .on('change', function(t, onInput) {
86213                   dispatch$1.call('change', field, t, onInput);
86214               });
86215
86216           if (entity) {
86217               field.entityID = entity.id;
86218               // if this field cares about the entity, pass it along
86219               if (field.impl.entity) {
86220                   field.impl.entity(entity);
86221               }
86222           }
86223       }
86224
86225
86226       function isModified() {
86227           if (!entity) return false;
86228           var original = context.graph().base().entities[entity.id];
86229           return some(field.keys, function(key) {
86230               return original ? _tags[key] !== original.tags[key] : _tags[key];
86231           });
86232       }
86233
86234
86235       function isPresent() {
86236           return some(field.keys, function(key) {
86237               if (field.type === 'multiCombo') {
86238                   for (var tagKey in _tags) {
86239                       if (tagKey.indexOf(key) === 0) {
86240                           return true;
86241                       }
86242                   }
86243                   return false;
86244               }
86245               return _tags[key] !== undefined;
86246           });
86247       }
86248
86249
86250       function revert(d) {
86251           event.stopPropagation();
86252           event.preventDefault();
86253           if (!entity) return false;
86254
86255           var original = context.graph().base().entities[entity.id];
86256           var t = {};
86257           d.keys.forEach(function(key) {
86258               t[key] = original ? original.tags[key] : undefined;
86259           });
86260
86261           dispatch$1.call('change', d, t);
86262       }
86263
86264
86265       function remove(d) {
86266           event.stopPropagation();
86267           event.preventDefault();
86268
86269           var t = {};
86270           d.keys.forEach(function(key) {
86271               t[key] = undefined;
86272           });
86273
86274           dispatch$1.call('change', d, t);
86275       }
86276
86277
86278       field.render = function(selection) {
86279           var container = selection.selectAll('.form-field')
86280               .data([field]);
86281
86282           // Enter
86283           var enter = container.enter()
86284               .append('div')
86285               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
86286               .classed('nowrap', !options.wrap);
86287
86288           if (options.wrap) {
86289               var label = enter
86290                   .append('label')
86291                   .attr('class', 'form-field-label')
86292                   .attr('for', function(d) { return 'preset-input-' + d.safeid; });
86293
86294               label
86295                   .append('span')
86296                   .attr('class', 'label-text')
86297                   .text(function(d) { return d.label(); });
86298
86299               if (options.remove) {
86300                   label
86301                       .append('button')
86302                       .attr('class', 'remove-icon')
86303                       .attr('title', t('icons.remove'))
86304                       .attr('tabindex', -1)
86305                       .call(svgIcon('#iD-operation-delete'));
86306               }
86307
86308               if (options.revert) {
86309                   label
86310                       .append('button')
86311                       .attr('class', 'modified-icon')
86312                       .attr('title', t('icons.undo'))
86313                       .attr('tabindex', -1)
86314                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
86315               }
86316           }
86317
86318
86319           // Update
86320           container = container
86321               .merge(enter);
86322
86323           container.select('.form-field-label > .remove-icon')  // propagate bound data
86324               .on('click', remove);
86325
86326           container.select('.form-field-label > .modified-icon')  // propagate bound data
86327               .on('click', revert);
86328
86329           container
86330               .classed('modified', isModified())
86331               .classed('present', isPresent())
86332               .each(function(d) {
86333                   if (!d.impl) {
86334                       createField();
86335                   }
86336
86337                   var reference, help;
86338
86339                   // instantiate field help
86340                   if (options.wrap && field.type === 'restrictions') {
86341                       help = uiFieldHelp(context, 'restrictions');
86342                   }
86343
86344                   // instantiate tag reference
86345                   if (options.wrap && options.info) {
86346                       var referenceKey = d.key;
86347                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
86348                           referenceKey = referenceKey.replace(/:$/, '');
86349                       }
86350
86351                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
86352                       if (_state === 'hover') {
86353                           reference.showing(false);
86354                       }
86355                   }
86356
86357                   select(this)
86358                       .call(d.impl);
86359
86360                   // add field help components
86361                   if (help) {
86362                       select(this)
86363                           .call(help.body)
86364                           .select('.form-field-label')
86365                           .call(help.button);
86366                   }
86367
86368                   // add tag reference components
86369                   if (reference) {
86370                       select(this)
86371                           .call(reference.body)
86372                           .select('.form-field-label')
86373                           .call(reference.button);
86374                   }
86375
86376                   d.impl.tags(_tags);
86377               });
86378       };
86379
86380
86381       field.state = function(val) {
86382           if (!arguments.length) return _state;
86383           _state = val;
86384           return field;
86385       };
86386
86387
86388       field.tags = function(val) {
86389           if (!arguments.length) return _tags;
86390           _tags = val;
86391           return field;
86392       };
86393
86394
86395       field.show = function() {
86396           _show = true;
86397           if (!field.impl) {
86398               createField();
86399           }
86400           if (field.default && field.key && _tags[field.key] !== field.default) {
86401               var t = {};
86402               t[field.key] = field.default;
86403               dispatch$1.call('change', this, t);
86404           }
86405       };
86406
86407
86408       // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
86409       field.isShown = function() {
86410           return _show || isPresent();
86411       };
86412
86413
86414       // An allowed field can appear in the UI or in the 'Add field' dropdown.
86415       // A non-allowed field is hidden from the user altogether
86416       field.isAllowed = function() {
86417           if (!entity || isPresent()) return true;   // a field with a value should always display
86418
86419           var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
86420           if (!latest) return true;
86421
86422           var require = field.prerequisiteTag;
86423           if (require && require.key) {
86424               var value = latest.tags[require.key];
86425               if (!value) return false;
86426
86427               if (require.valueNot) {
86428                   return require.valueNot !== value;
86429               }
86430               if (require.value) {
86431                   return require.value === value;
86432               }
86433               return true;
86434           }
86435           return true;
86436       };
86437
86438
86439       field.focus = function() {
86440           if (field.impl) {
86441               field.impl.focus();
86442           }
86443       };
86444
86445
86446       return utilRebind(field, dispatch$1, 'on');
86447   }
86448
86449   function uiFormFields(context) {
86450       var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
86451       var _fieldsArr = [];
86452       var _state = '';
86453       var _klass = '';
86454
86455
86456       function formFields(selection) {
86457           var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
86458           var shown = allowedFields.filter(function(field) { return field.isShown(); });
86459           var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
86460
86461           var container = selection.selectAll('.form-fields-container')
86462               .data([0]);
86463
86464           container = container.enter()
86465               .append('div')
86466               .attr('class', 'form-fields-container ' + (_klass || ''))
86467               .merge(container);
86468
86469
86470           var fields = container.selectAll('.wrap-form-field')
86471               .data(shown, function(d) { return d.id + (d.entityID || ''); });
86472
86473           fields.exit()
86474               .remove();
86475
86476           // Enter
86477           var enter = fields.enter()
86478               .append('div')
86479               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
86480
86481           // Update
86482           fields = fields
86483               .merge(enter);
86484
86485           fields
86486               .order()
86487               .each(function(d) {
86488                   select(this)
86489                       .call(d.render);
86490               });
86491
86492
86493           notShown = notShown.map(function(field) {
86494               return {
86495                   title: field.label(),
86496                   value: field.label(),
86497                   field: field
86498               };
86499           });
86500
86501
86502           var more = selection.selectAll('.more-fields')
86503               .data((_state === 'hover' || notShown.length === 0) ? [] : [0]);
86504
86505           more.exit()
86506               .remove();
86507
86508           more = more.enter()
86509               .append('div')
86510               .attr('class', 'more-fields')
86511               .append('label')
86512               .text(t('inspector.add_fields'))
86513               .merge(more);
86514
86515
86516           var input = more.selectAll('.value')
86517               .data([0]);
86518
86519           input.exit()
86520               .remove();
86521
86522           input = input.enter()
86523               .append('input')
86524               .attr('class', 'value')
86525               .attr('type', 'text')
86526               .call(utilNoAuto)
86527               .merge(input);
86528
86529           input
86530               .call(utilGetSetValue, '')
86531               .attr('placeholder', function() {
86532                   var placeholder = [];
86533                   for (var field in notShown) {
86534                       placeholder.push(notShown[field].title);
86535                   }
86536                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
86537               })
86538               .call(moreCombo
86539                   .data(notShown)
86540                   .on('accept', function (d) {
86541                       if (!d) return;  // user entered something that was not matched
86542                       var field = d.field;
86543                       field.show();
86544                       selection.call(formFields);  // rerender
86545                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
86546                           field.focus();
86547                       }
86548                   })
86549               );
86550       }
86551
86552
86553       formFields.fieldsArr = function(val) {
86554           if (!arguments.length) return _fieldsArr;
86555           _fieldsArr = val || [];
86556           return formFields;
86557       };
86558
86559       formFields.state = function(val) {
86560           if (!arguments.length) return _state;
86561           _state = val;
86562           return formFields;
86563       };
86564
86565       formFields.klass = function(val) {
86566           if (!arguments.length) return _klass;
86567           _klass = val;
86568           return formFields;
86569       };
86570
86571
86572       return formFields;
86573   }
86574
86575   function uiPresetEditor(context) {
86576       var dispatch$1 = dispatch('change');
86577       var formFields = uiFormFields(context);
86578       var _state;
86579       var _fieldsArr;
86580       var _preset;
86581       var _tags;
86582       var _entityID;
86583
86584
86585       function presetEditor(selection) {
86586           selection.call(uiDisclosure(context, 'preset_fields', true)
86587               .title(t('inspector.all_fields'))
86588               .content(render)
86589           );
86590       }
86591
86592
86593       function render(selection) {
86594           if (!_fieldsArr) {
86595               var entity = context.entity(_entityID);
86596               var geometry = context.geometry(_entityID);
86597               var presets = context.presets();
86598
86599               _fieldsArr = [];
86600
86601               _preset.fields.forEach(function(field) {
86602                   if (field.matchGeometry(geometry)) {
86603                       _fieldsArr.push(
86604                           uiField(context, field, entity)
86605                       );
86606                   }
86607               });
86608
86609               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
86610                   _fieldsArr.push(
86611                       uiField(context, presets.field('restrictions'), entity)
86612                   );
86613               }
86614
86615               var additionalFields = union(_preset.moreFields, presets.universal());
86616               additionalFields.sort(function(field1, field2) {
86617                   return field1.label() > field2.label();
86618               });
86619
86620               additionalFields.forEach(function(field) {
86621                   if (_preset.fields.indexOf(field) === -1) {
86622                       _fieldsArr.push(
86623                           uiField(context, field, entity, { show: false })
86624                       );
86625                   }
86626               });
86627
86628               _fieldsArr.forEach(function(field) {
86629                   field
86630                       .on('change', function(t, onInput) {
86631                           dispatch$1.call('change', field, t, onInput);
86632                       });
86633               });
86634           }
86635
86636           _fieldsArr.forEach(function(field) {
86637               field
86638                   .state(_state)
86639                   .tags(_tags);
86640           });
86641
86642
86643           selection
86644               .call(formFields
86645                   .fieldsArr(_fieldsArr)
86646                   .state(_state)
86647                   .klass('inspector-inner fillL3')
86648               );
86649
86650
86651           selection.selectAll('.wrap-form-field input')
86652               .on('keydown', function() {
86653                   // if user presses enter, and combobox is not active, accept edits..
86654                   if (event.keyCode === 13 && select('.combobox').empty()) {
86655                       context.enter(modeBrowse(context));
86656                   }
86657               });
86658       }
86659
86660
86661       presetEditor.preset = function(val) {
86662           if (!arguments.length) return _preset;
86663           if (_preset && _preset.id === val.id) return presetEditor;
86664           _preset = val;
86665           _fieldsArr = null;
86666           return presetEditor;
86667       };
86668
86669
86670       presetEditor.state = function(val) {
86671           if (!arguments.length) return _state;
86672           _state = val;
86673           return presetEditor;
86674       };
86675
86676
86677       presetEditor.tags = function(val) {
86678           if (!arguments.length) return _tags;
86679           _tags = val;
86680           // Don't reset _fieldsArr here.
86681           return presetEditor;
86682       };
86683
86684
86685       presetEditor.entityID = function(val) {
86686           if (!arguments.length) return _entityID;
86687           if (_entityID === val) return presetEditor;
86688           _entityID = val;
86689           _fieldsArr = null;
86690           return presetEditor;
86691       };
86692
86693
86694       return utilRebind(presetEditor, dispatch$1, 'on');
86695   }
86696
86697   function uiEntityIssues(context) {
86698       var _selection = select(null);
86699       var _expandedIssueID;
86700       var _entityID;
86701
86702       // Listen for validation reload even though the entity editor is reloaded on
86703       // every graph change since the graph change event may happen before the issue
86704       // cache is refreshed
86705       context.validator().on('reload.entity_issues', function() {
86706
86707            _selection.selectAll('.disclosure-wrap-entity_issues')
86708                .call(render);
86709
86710           update();
86711       });
86712
86713
86714       function entityIssues(selection) {
86715           _selection = selection;
86716
86717           selection
86718               .call(uiDisclosure(context, 'entity_issues', true)
86719                   .content(render)
86720               );
86721
86722           update();
86723       }
86724
86725
86726       function update() {
86727           var issues = context.validator().getIssuesForEntityWithID(_entityID);
86728
86729           _selection
86730               .classed('hide', issues.length === 0);
86731
86732           _selection.selectAll('.hide-toggle-entity_issues span')
86733               .text(t('issues.list_title', { count: issues.length }));
86734       }
86735
86736
86737       function render(selection) {
86738           var issues = context.validator().getIssuesForEntityWithID(_entityID);
86739           _expandedIssueID = issues.length > 0 ? issues[0].id() : null;
86740
86741           var items = selection.selectAll('.issue')
86742               .data(issues, function(d) { return d.id(); });
86743
86744           // Exit
86745           items.exit()
86746               .remove();
86747
86748           // Enter
86749           var itemsEnter = items.enter()
86750               .append('div')
86751               .attr('class', function(d) { return 'issue severity-' + d.severity; })
86752               .call(tooltip()
86753                   .html(true)
86754                   .title(function(d) { return uiTooltipHtml(d.tooltip); })
86755                   .placement('top')
86756               )
86757               .on('mouseover.highlight', function(d) {
86758                   // don't hover-highlight the selected entity
86759                   var ids = d.entities.filter(function(e) { return e.id !== _entityID; })
86760                       .map(function(e) { return e.id; });
86761                   utilHighlightEntities(ids, true, context);
86762               })
86763               .on('mouseout.highlight', function(d) {
86764                   var ids = d.entities.filter(function(e) { return e.id !== _entityID; })
86765                       .map(function(e) { return e.id; });
86766                   utilHighlightEntities(ids, false, context);
86767               });
86768
86769           var messagesEnter = itemsEnter
86770               .append('button')
86771               .attr('class', 'message')
86772               .on('click', function(d) {
86773
86774                   _expandedIssueID = d.id();   // expand only the clicked item
86775                   selection.selectAll('.issue')
86776                       .classed('expanded', function(d) { return d.id() === _expandedIssueID; });
86777
86778                   var extent = d.extent(context.graph());
86779                   if (extent) {
86780                       var view = context.map().trimmedExtent();
86781                       var zoom = context.map().zoom();
86782                       if (!view.contains(extent) || zoom < 19) {
86783                           context.map().centerZoomEase(extent.center(), Math.max(zoom, 19));
86784                       }
86785                   }
86786               });
86787
86788           messagesEnter
86789               .append('span')
86790               .attr('class', 'issue-icon')
86791               .call(svgIcon('', 'pre-text'));
86792
86793           messagesEnter
86794               .append('strong')
86795               .attr('class', 'issue-text');
86796
86797           itemsEnter
86798               .append('ul')
86799               .attr('class', 'issue-fix-list');
86800
86801
86802           // Update
86803           items = items
86804               .merge(itemsEnter)
86805               .classed('expanded', function(d) { return d.id() === _expandedIssueID; });
86806
86807           items.select('.issue-icon svg use')     // propagate bound data
86808               .attr('href', function(d) {
86809                   return '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
86810               });
86811
86812           items.select('.issue-text')     // propagate bound data
86813               .text(function(d) { return d.message; });
86814
86815
86816           // fixes
86817           var fixLists = items.selectAll('.issue-fix-list');
86818
86819           var fixes = fixLists.selectAll('.issue-fix-item')
86820               .data(function(d) { return d.fixes; })
86821               .enter()
86822               .append('li')
86823               .attr('class', function(d) {
86824                   return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
86825               })
86826               .append('button')
86827               .on('click', function(d) {
86828                   if (d.onClick) {
86829                       utilHighlightEntities(d.entityIds, false, context);
86830                       d.onClick();
86831                   }
86832               })
86833               .on('mouseover.highlight', function(d) {
86834                   utilHighlightEntities(d.entityIds, true, context);
86835               })
86836               .on('mouseout.highlight', function(d) {
86837                   utilHighlightEntities(d.entityIds, false, context);
86838               });
86839
86840           fixes.append('span')
86841               .attr('class', 'fix-icon')
86842               .each(function(d) {
86843                   var iconName = d.icon || 'iD-icon-wrench';
86844                   if (iconName.startsWith('maki')) {
86845                       iconName += '-15';
86846                   }
86847                   select(this).call(svgIcon('#' + iconName, 'pre-text'));
86848               });
86849
86850           fixes.append('span')
86851               .text(function(d) { return d.title; });
86852       }
86853
86854
86855       entityIssues.entityID = function(val) {
86856           if (!arguments.length) return _entityID;
86857           if (_entityID !== val) {
86858               _entityID = val;
86859               _expandedIssueID = null;
86860           }
86861           return entityIssues;
86862       };
86863
86864
86865       return entityIssues;
86866   }
86867
86868   function uiEntityEditor(context) {
86869       var dispatch$1 = dispatch('choose');
86870       var _state = 'select';
86871       var _coalesceChanges = false;
86872       var _modified = false;
86873       var _base;
86874       var _entityID;
86875       var _activePreset;
86876       var _tagReference;
86877
86878       var entityIssues = uiEntityIssues(context);
86879       var quickLinks = uiQuickLinks();
86880       var presetEditor = uiPresetEditor(context).on('change', changeTags);
86881       var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
86882       var rawMemberEditor = uiRawMemberEditor(context);
86883       var rawMembershipEditor = uiRawMembershipEditor(context);
86884
86885       function entityEditor(selection) {
86886           var entity = context.entity(_entityID);
86887           var tags = clone(entity.tags);
86888
86889           // Header
86890           var header = selection.selectAll('.header')
86891               .data([0]);
86892
86893           // Enter
86894           var headerEnter = header.enter()
86895               .append('div')
86896               .attr('class', 'header fillL cf');
86897
86898           headerEnter
86899               .append('button')
86900               .attr('class', 'fl preset-reset preset-choose')
86901               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
86902
86903           headerEnter
86904               .append('button')
86905               .attr('class', 'fr preset-close')
86906               .on('click', function() { context.enter(modeBrowse(context)); })
86907               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
86908
86909           headerEnter
86910               .append('h3')
86911               .text(t('inspector.edit'));
86912
86913           // Update
86914           header = header
86915               .merge(headerEnter);
86916
86917           header.selectAll('.preset-reset')
86918               .on('click', function() {
86919                   dispatch$1.call('choose', this, _activePreset);
86920               });
86921
86922
86923           // Body
86924           var body = selection.selectAll('.inspector-body')
86925               .data([0]);
86926
86927           // Enter
86928           var bodyEnter = body.enter()
86929               .append('div')
86930               .attr('class', 'inspector-body');
86931
86932           bodyEnter
86933               .append('div')
86934               .attr('class', 'preset-list-item inspector-inner')
86935               .append('div')
86936               .attr('class', 'preset-list-button-wrap')
86937               .append('button')
86938               .attr('class', 'preset-list-button preset-reset')
86939               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
86940               .append('div')
86941               .attr('class', 'label')
86942               .append('div')
86943               .attr('class', 'label-inner');
86944
86945           bodyEnter
86946               .append('div')
86947               .attr('class', 'preset-quick-links');
86948
86949           bodyEnter
86950               .append('div')
86951               .attr('class', 'entity-issues');
86952
86953           bodyEnter
86954               .append('div')
86955               .attr('class', 'preset-editor');
86956
86957           bodyEnter
86958               .append('div')
86959               .attr('class', 'raw-tag-editor inspector-inner');
86960
86961           bodyEnter
86962               .append('div')
86963               .attr('class', 'raw-member-editor inspector-inner');
86964
86965           bodyEnter
86966               .append('div')
86967               .attr('class', 'raw-membership-editor inspector-inner');
86968
86969           bodyEnter
86970               .append('input')
86971               .attr('type', 'text')
86972               .attr('class', 'key-trap');
86973
86974
86975           // Update
86976           body = body
86977               .merge(bodyEnter);
86978
86979           // update header
86980           if (_tagReference) {
86981               body.selectAll('.preset-list-button-wrap')
86982                   .call(_tagReference.button);
86983
86984               body.selectAll('.preset-list-item')
86985                   .call(_tagReference.body);
86986           }
86987
86988           body.selectAll('.preset-reset')
86989               .on('click', function() {
86990                   dispatch$1.call('choose', this, _activePreset);
86991               });
86992
86993           body.select('.preset-list-item button')
86994               .call(uiPresetIcon()
86995                   .geometry(context.geometry(_entityID))
86996                   .preset(_activePreset)
86997               );
86998
86999           // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
87000           var label = body.select('.label-inner');
87001           var nameparts = label.selectAll('.namepart')
87002               .data(_activePreset.name().split(' – '), function(d) { return d; });
87003
87004           nameparts.exit()
87005               .remove();
87006
87007           nameparts
87008               .enter()
87009               .append('div')
87010               .attr('class', 'namepart')
87011               .text(function(d) { return d; });
87012
87013           // update quick links
87014           var choices = [{
87015               id: 'zoom_to',
87016               label: 'inspector.zoom_to.title',
87017               tooltip: function() {
87018                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
87019               },
87020               click: function zoomTo() {
87021                   context.mode().zoomToSelected();
87022               }
87023           }];
87024
87025           body.select('.preset-quick-links')
87026               .call(quickLinks.choices(choices));
87027
87028
87029           // update editor sections
87030           body.select('.entity-issues')
87031               .call(entityIssues
87032                   .entityID(_entityID)
87033               );
87034
87035           body.select('.preset-editor')
87036               .call(presetEditor
87037                   .preset(_activePreset)
87038                   .entityID(_entityID)
87039                   .tags(tags)
87040                   .state(_state)
87041               );
87042
87043           body.select('.raw-tag-editor')
87044               .call(rawTagEditor
87045                   .preset(_activePreset)
87046                   .entityID(_entityID)
87047                   .tags(tags)
87048                   .state(_state)
87049               );
87050
87051           if (entity.type === 'relation') {
87052               body.select('.raw-member-editor')
87053                   .style('display', 'block')
87054                   .call(rawMemberEditor
87055                       .entityID(_entityID)
87056                   );
87057           } else {
87058               body.select('.raw-member-editor')
87059                   .style('display', 'none');
87060           }
87061
87062           body.select('.raw-membership-editor')
87063               .call(rawMembershipEditor
87064                   .entityID(_entityID)
87065               );
87066
87067           body.select('.key-trap')
87068               .on('keydown.key-trap', function() {
87069                   // On tabbing, send focus back to the first field on the inspector-body
87070                   // (probably the `name` field) #4159
87071                   if (event.keyCode === 9 && !event.shiftKey) {
87072                       event.preventDefault();
87073                       body.select('input').node().focus();
87074                   }
87075               });
87076
87077           context.history()
87078               .on('change.entity-editor', historyChanged);
87079
87080
87081           function historyChanged() {
87082               if (_state === 'hide') return;
87083
87084               var entity = context.hasEntity(_entityID);
87085               var graph = context.graph();
87086               if (!entity) return;
87087
87088               var match = context.presets().match(entity, graph);
87089               var activePreset = entityEditor.preset();
87090               var weakPreset = activePreset && isEmpty(activePreset.addTags);
87091
87092               // A "weak" preset doesn't set any tags. (e.g. "Address")
87093               // Don't replace a weak preset with a fallback preset (e.g. "Point")
87094               if (!(weakPreset && match.isFallback())) {
87095                   entityEditor.preset(match);
87096               }
87097               entityEditor.modified(_base !== graph);
87098               entityEditor(selection);
87099           }
87100       }
87101
87102
87103       // Tag changes that fire on input can all get coalesced into a single
87104       // history operation when the user leaves the field.  #2342
87105       function changeTags(changed, onInput) {
87106           var entity = context.entity(_entityID);
87107           var annotation = t('operations.change_tags.annotation');
87108           var tags = clone(entity.tags);
87109
87110           for (var k in changed) {
87111               if (!k) continue;
87112               var v = changed[k];
87113               if (v !== undefined || tags.hasOwnProperty(k)) {
87114                   tags[k] = v;
87115               }
87116           }
87117
87118           if (!onInput) {
87119               tags = utilCleanTags(tags);
87120           }
87121
87122           if (!isEqual(entity.tags, tags)) {
87123               if (_coalesceChanges) {
87124                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
87125               } else {
87126                   context.perform(actionChangeTags(_entityID, tags), annotation);
87127                   _coalesceChanges = !!onInput;
87128               }
87129           }
87130       }
87131
87132
87133       entityEditor.modified = function(val) {
87134           if (!arguments.length) return _modified;
87135           _modified = val;
87136           d3_selectAll('button.preset-close use')
87137               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
87138           return entityEditor;
87139       };
87140
87141
87142       entityEditor.state = function(val) {
87143           if (!arguments.length) return _state;
87144           _state = val;
87145           return entityEditor;
87146       };
87147
87148
87149       entityEditor.entityID = function(val) {
87150           if (!arguments.length) return _entityID;
87151           _entityID = val;
87152           _base = context.graph();
87153           _coalesceChanges = false;
87154
87155           // reset the scroll to the top of the inspector
87156           var body = d3_selectAll('.entity-editor-pane .inspector-body');
87157           if (!body.empty()) {
87158               body.node().scrollTop = 0;
87159           }
87160
87161           var presetMatch = context.presets().match(context.entity(_entityID), _base);
87162
87163           return entityEditor
87164               .preset(presetMatch)
87165               .modified(false);
87166       };
87167
87168
87169       entityEditor.preset = function(val) {
87170           if (!arguments.length) return _activePreset;
87171           if (val !== _activePreset) {
87172               _activePreset = val;
87173               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
87174                   .showing(false);
87175           }
87176           return entityEditor;
87177       };
87178
87179
87180       return utilRebind(entityEditor, dispatch$1, 'on');
87181   }
87182
87183   var pair_1 = pair$1;
87184
87185   function search(x, dims, r) {
87186     if (!dims) dims = 'NSEW';
87187     if (typeof x !== 'string') return { val: null, regex: r };
87188
87189     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
87190
87191     var m = r.exec(x);
87192     if (!m) return { val: null, regex: r };
87193
87194     var dim = m[1] || m[5];
87195     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
87196
87197     return {
87198       val: (((m[2]) ? parseFloat(m[2]) : 0) +
87199             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
87200             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
87201             ((dim === 'S' || dim === 'W') ? -1 : 1),
87202       regex: r,
87203       raw: m[0],
87204       dim: dim
87205     };
87206   }
87207
87208   function pair$1(x, dims) {
87209     x = x.trim();
87210     var one = search(x, dims);
87211     if (one.val === null) return null;
87212     var two = search(x, dims, one.regex);
87213     if (two.val === null) return null;
87214     // null if one/two are not contiguous.
87215     if (one.raw + two.raw !== x) return null;
87216     if (one.dim) {
87217       return swapdim(one.val, two.val, one.dim);
87218     } else {
87219       return [one.val, two.val];
87220     }
87221   }
87222
87223   function swapdim(a, b, dim) {
87224     if (dim === 'N' || dim === 'S') return [a, b];
87225     if (dim === 'W' || dim === 'E') return [b, a];
87226   }
87227
87228   function uiFeatureList(context) {
87229       var _geocodeResults;
87230
87231
87232       function featureList(selection) {
87233           var header = selection
87234               .append('div')
87235               .attr('class', 'header fillL cf');
87236
87237           header
87238               .append('h3')
87239               .text(t('inspector.feature_list'));
87240
87241           var searchWrap = selection
87242               .append('div')
87243               .attr('class', 'search-header');
87244
87245           var search = searchWrap
87246               .append('input')
87247               .attr('placeholder', t('inspector.search'))
87248               .attr('type', 'search')
87249               .call(utilNoAuto)
87250               .on('keypress', keypress)
87251               .on('keydown', keydown)
87252               .on('input', inputevent);
87253
87254           searchWrap
87255               .call(svgIcon('#iD-icon-search', 'pre-text'));
87256
87257           var listWrap = selection
87258               .append('div')
87259               .attr('class', 'inspector-body');
87260
87261           var list = listWrap
87262               .append('div')
87263               .attr('class', 'feature-list cf');
87264
87265           context
87266               .on('exit.feature-list', clearSearch);
87267           context.map()
87268               .on('drawn.feature-list', mapDrawn);
87269
87270           context.keybinding()
87271               .on(uiCmd('⌘F'), focusSearch);
87272
87273
87274           function focusSearch() {
87275               var mode = context.mode() && context.mode().id;
87276               if (mode !== 'browse') return;
87277
87278               event.preventDefault();
87279               search.node().focus();
87280           }
87281
87282
87283           function keydown() {
87284               if (event.keyCode === 27) {  // escape
87285                   search.node().blur();
87286               }
87287           }
87288
87289
87290           function keypress() {
87291               var q = search.property('value'),
87292                   items = list.selectAll('.feature-list-item');
87293               if (event.keyCode === 13 && q.length && items.size()) {  // return
87294                   click(items.datum());
87295               }
87296           }
87297
87298
87299           function inputevent() {
87300               _geocodeResults = undefined;
87301               drawList();
87302           }
87303
87304
87305           function clearSearch() {
87306               search.property('value', '');
87307               drawList();
87308           }
87309
87310
87311           function mapDrawn(e) {
87312               if (e.full) {
87313                   drawList();
87314               }
87315           }
87316
87317
87318           function features() {
87319               var entities = {};
87320               var result = [];
87321               var graph = context.graph();
87322               var q = search.property('value').toLowerCase();
87323
87324               if (!q) return result;
87325
87326               var idMatch = q.match(/^([nwr])([0-9]+)$/);
87327
87328               if (idMatch) {
87329                   result.push({
87330                       id: idMatch[0],
87331                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
87332                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
87333                       name: idMatch[2]
87334                   });
87335               }
87336
87337               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
87338
87339               if (locationMatch) {
87340                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
87341                   result.push({
87342                       id: -1,
87343                       geometry: 'point',
87344                       type: t('inspector.location'),
87345                       name: dmsCoordinatePair([loc[1], loc[0]]),
87346                       location: loc
87347                   });
87348               }
87349
87350               function addEntity(entity) {
87351                   if (entity.id in entities || result.length > 200)
87352                       return;
87353
87354                   entities[entity.id] = true;
87355
87356                   var name = utilDisplayName(entity) || '';
87357                   if (name.toLowerCase().indexOf(q) >= 0) {
87358                       var matched = context.presets().match(entity, graph);
87359                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
87360
87361                       result.push({
87362                           id: entity.id,
87363                           entity: entity,
87364                           geometry: context.geometry(entity.id),
87365                           type: type,
87366                           name: name
87367                       });
87368                   }
87369
87370                   graph.parentRelations(entity).forEach(function(parent) {
87371                       addEntity(parent);
87372                   });
87373               }
87374
87375               var visible = context.surface().selectAll('.point, .line, .area').nodes();
87376               for (var i = 0; i < visible.length && result.length <= 200; i++) {
87377                   var datum = visible[i].__data__;
87378                   var entity = datum && datum.properties && datum.properties.entity;
87379                   if (entity) { addEntity(entity); }
87380               }
87381
87382               (_geocodeResults || []).forEach(function(d) {
87383                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
87384
87385                       // Make a temporary osmEntity so we can preset match
87386                       // and better localize the search result - #4725
87387                       var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
87388                       var tags = {};
87389                       tags[d.class] = d.type;
87390
87391                       var attrs = { id: id, type: d.osm_type, tags: tags };
87392                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
87393                           attrs.nodes = ['a','a'];  // so that geometry area is possible
87394                       }
87395
87396                       var tempEntity = osmEntity(attrs);
87397                       var tempGraph = coreGraph([tempEntity]);
87398                       var matched = context.presets().match(tempEntity, tempGraph);
87399                       var type = (matched && matched.name()) || utilDisplayType(id);
87400
87401                       result.push({
87402                           id: tempEntity.id,
87403                           geometry: tempEntity.geometry(tempGraph),
87404                           type: type,
87405                           name: d.display_name,
87406                           extent: new geoExtent(
87407                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
87408                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
87409                       });
87410                   }
87411               });
87412
87413               return result;
87414           }
87415
87416
87417           function drawList() {
87418               var value = search.property('value');
87419               var results = features();
87420
87421               list.classed('filtered', value.length);
87422
87423               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
87424
87425               var resultsIndicator = list.selectAll('.no-results-item')
87426                   .data([0])
87427                   .enter()
87428                   .append('button')
87429                   .property('disabled', true)
87430                   .attr('class', 'no-results-item')
87431                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
87432
87433               resultsIndicator.append('span')
87434                   .attr('class', 'entity-name');
87435
87436               list.selectAll('.no-results-item .entity-name')
87437                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
87438
87439               if (services.geocoder) {
87440                 list.selectAll('.geocode-item')
87441                     .data([0])
87442                     .enter()
87443                     .append('button')
87444                     .attr('class', 'geocode-item')
87445                     .on('click', geocoderSearch)
87446                     .append('div')
87447                     .attr('class', 'label')
87448                     .append('span')
87449                     .attr('class', 'entity-name')
87450                     .text(t('geocoder.search'));
87451               }
87452
87453               list.selectAll('.no-results-item')
87454                   .style('display', (value.length && !results.length) ? 'block' : 'none');
87455
87456               list.selectAll('.geocode-item')
87457                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
87458
87459               list.selectAll('.feature-list-item')
87460                   .data([-1])
87461                   .remove();
87462
87463               var items = list.selectAll('.feature-list-item')
87464                   .data(results, function(d) { return d.id; });
87465
87466               var enter = items.enter()
87467                   .insert('button', '.geocode-item')
87468                   .attr('class', 'feature-list-item')
87469                   .on('mouseover', mouseover)
87470                   .on('mouseout', mouseout)
87471                   .on('click', click);
87472
87473               var label = enter
87474                   .append('div')
87475                   .attr('class', 'label');
87476
87477               label
87478                   .each(function(d) {
87479                       select(this)
87480                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
87481                   });
87482
87483               label
87484                   .append('span')
87485                   .attr('class', 'entity-type')
87486                   .text(function(d) { return d.type; });
87487
87488               label
87489                   .append('span')
87490                   .attr('class', 'entity-name')
87491                   .text(function(d) { return d.name; });
87492
87493               enter
87494                   .style('opacity', 0)
87495                   .transition()
87496                   .style('opacity', 1);
87497
87498               items.order();
87499
87500               items.exit()
87501                   .remove();
87502           }
87503
87504
87505           function mouseover(d) {
87506               if (d.id === -1) return;
87507
87508               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
87509                   .classed('hover', true);
87510           }
87511
87512
87513           function mouseout() {
87514               context.surface().selectAll('.hover')
87515                   .classed('hover', false);
87516           }
87517
87518
87519           function click(d) {
87520               event.preventDefault();
87521               if (d.location) {
87522                   context.map().centerZoomEase([d.location[1], d.location[0]], 19);
87523               }
87524               else if (d.entity) {
87525                   if (d.entity.type === 'node') {
87526                       context.map().center(d.entity.loc);
87527                   } else if (d.entity.type === 'way') {
87528                       var center = context.projection(context.map().center());
87529                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
87530                       context.map().center(edge.loc);
87531                   }
87532                   context.enter(modeSelect(context, [d.entity.id]));
87533               } else {
87534                   context.zoomToEntity(d.id);
87535               }
87536           }
87537
87538
87539           function geocoderSearch() {
87540               services.geocoder.search(search.property('value'), function (err, resp) {
87541                   _geocodeResults = resp || [];
87542                   drawList();
87543               });
87544           }
87545       }
87546
87547
87548       return featureList;
87549   }
87550
87551   var _flashTimer;
87552
87553
87554   function uiFlash() {
87555       var _duration = 2000;
87556       var _iconName = '#iD-icon-no';
87557       var _iconClass = 'disabled';
87558       var _text = '';
87559       var _textClass;
87560
87561
87562       function flash() {
87563           if (_flashTimer) {
87564               _flashTimer.stop();
87565           }
87566
87567           select('#footer-wrap')
87568               .attr('class', 'footer-hide');
87569           select('#flash-wrap')
87570               .attr('class', 'footer-show');
87571
87572           var content = select('#flash-wrap').selectAll('.flash-content')
87573               .data([0]);
87574
87575           // Enter
87576           var contentEnter = content.enter()
87577               .append('div')
87578               .attr('class', 'flash-content');
87579
87580           var iconEnter = contentEnter
87581               .append('svg')
87582               .attr('class', 'flash-icon')
87583               .append('g')
87584               .attr('transform', 'translate(10,10)');
87585
87586           iconEnter
87587               .append('circle')
87588               .attr('r', 9);
87589
87590           iconEnter
87591               .append('use')
87592               .attr('transform', 'translate(-7,-7)')
87593               .attr('width', '14')
87594               .attr('height', '14');
87595
87596           contentEnter
87597               .append('div')
87598               .attr('class', 'flash-text');
87599
87600
87601           // Update
87602           content = content
87603               .merge(contentEnter);
87604
87605           content
87606               .selectAll('.flash-icon')
87607               .attr('class', 'flash-icon ' + (_iconClass || ''));
87608
87609           content
87610               .selectAll('.flash-icon use')
87611               .attr('xlink:href', _iconName);
87612
87613           content
87614               .selectAll('.flash-text')
87615               .attr('class', 'flash-text ' + (_textClass || ''))
87616               .text(_text);
87617
87618
87619           _flashTimer = timeout$1(function() {
87620               _flashTimer = null;
87621               select('#footer-wrap')
87622                   .attr('class', 'footer-show');
87623               select('#flash-wrap')
87624                   .attr('class', 'footer-hide');
87625           }, _duration);
87626
87627           return content;
87628       }
87629
87630
87631       flash.duration = function(_) {
87632           if (!arguments.length) return _duration;
87633           _duration = _;
87634           return flash;
87635       };
87636
87637       flash.text = function(_) {
87638           if (!arguments.length) return _text;
87639           _text = _;
87640           return flash;
87641       };
87642
87643       flash.textClass = function(_) {
87644           if (!arguments.length) return _textClass;
87645           _textClass = _;
87646           return flash;
87647       };
87648
87649       flash.iconName = function(_) {
87650           if (!arguments.length) return _iconName;
87651           _iconName = _;
87652           return flash;
87653       };
87654
87655       flash.iconClass = function(_) {
87656           if (!arguments.length) return _iconClass;
87657           _iconClass = _;
87658           return flash;
87659       };
87660
87661       return flash;
87662   }
87663
87664   function uiImproveOsmComments() {
87665       var _error;
87666
87667
87668       function errorComments(selection) {
87669           // make the div immediately so it appears above the buttons
87670           var comments = selection.selectAll('.comments-container')
87671               .data([0]);
87672
87673           comments = comments.enter()
87674               .append('div')
87675               .attr('class', 'comments-container')
87676               .merge(comments);
87677
87678           // must retrieve comments from API before they can be displayed
87679           services.improveOSM.getComments(_error, function(err, d) {
87680               if (!d.comments) { return; } // nothing to do here
87681
87682               var commentEnter = comments.selectAll('.comment')
87683                   .data(d.comments)
87684                   .enter()
87685                   .append('div')
87686                   .attr('class', 'comment');
87687
87688               commentEnter
87689                   .append('div')
87690                   .attr('class', 'comment-avatar')
87691                   .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
87692
87693               var mainEnter = commentEnter
87694                   .append('div')
87695                   .attr('class', 'comment-main');
87696
87697               var metadataEnter = mainEnter
87698                   .append('div')
87699                   .attr('class', 'comment-metadata');
87700
87701               metadataEnter
87702                   .append('div')
87703                   .attr('class', 'comment-author')
87704                   .each(function(d) {
87705                       var selection = select(this);
87706                       var osm = services.osm;
87707                       if (osm && d.username) {
87708                           selection = selection
87709                               .append('a')
87710                               .attr('class', 'comment-author-link')
87711                               .attr('href', osm.userURL(d.username))
87712                               .attr('tabindex', -1)
87713                               .attr('target', '_blank');
87714                       }
87715                       selection
87716                           .text(function(d) { return d.username; });
87717                   });
87718
87719               metadataEnter
87720                   .append('div')
87721                   .attr('class', 'comment-date')
87722                   .text(function(d) {
87723                       return t('note.status.commented', { when: localeDateString(d.timestamp) });
87724                   });
87725
87726               mainEnter
87727                   .append('div')
87728                   .attr('class', 'comment-text')
87729                   .append('p')
87730                   .text(function(d) { return d.text; });
87731           });
87732       }
87733
87734       function localeDateString(s) {
87735           if (!s) return null;
87736           var detected = utilDetect();
87737           var options = { day: 'numeric', month: 'short', year: 'numeric' };
87738           var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
87739           if (isNaN(d.getTime())) return null;
87740           return d.toLocaleDateString(detected.locale, options);
87741       }
87742
87743       errorComments.error = function(val) {
87744           if (!arguments.length) return _error;
87745           _error = val;
87746           return errorComments;
87747       };
87748
87749       return errorComments;
87750   }
87751
87752   function uiImproveOsmDetails(context) {
87753       var _error;
87754
87755
87756       function errorDetail(d) {
87757           var unknown = t('inspector.unknown');
87758
87759           if (!d) return unknown;
87760
87761           if (d.desc) return d.desc;
87762
87763           var errorType = d.error_key;
87764           var et = en.QA.improveOSM.error_types[errorType];
87765
87766           var detail;
87767           if (et && et.description) {
87768               detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
87769           } else {
87770               detail = unknown;
87771           }
87772
87773           return detail;
87774       }
87775
87776
87777       function improveOsmDetails(selection) {
87778           var details = selection.selectAll('.error-details')
87779               .data(
87780                   (_error ? [_error] : []),
87781                   function(d) { return d.id + '-' + (d.status || 0); }
87782               );
87783
87784           details.exit()
87785               .remove();
87786
87787           var detailsEnter = details.enter()
87788               .append('div')
87789               .attr('class', 'error-details error-details-container');
87790
87791
87792           // description
87793           var descriptionEnter = detailsEnter
87794               .append('div')
87795               .attr('class', 'error-details-description');
87796
87797           descriptionEnter
87798               .append('h4')
87799               .text(function() { return t('QA.keepRight.detail_description'); });
87800
87801           descriptionEnter
87802               .append('div')
87803               .attr('class', 'error-details-description-text')
87804               .html(errorDetail);
87805
87806           // If there are entity links in the error message..
87807           var relatedEntities = [];
87808           descriptionEnter.selectAll('.error_entity_link, .error_object_link')
87809               .each(function() {
87810                   var link = select(this);
87811                   var isObjectLink = link.classed('error_object_link');
87812                   var entityID = isObjectLink ?
87813                       (utilEntityRoot(_error.object_type) + _error.object_id)
87814                       : this.textContent;
87815                   var entity = context.hasEntity(entityID);
87816
87817                   relatedEntities.push(entityID);
87818
87819                   // Add click handler
87820                   link
87821                       .on('mouseover', function() {
87822                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
87823                               .classed('hover', true);
87824                       })
87825                       .on('mouseout', function() {
87826                           context.surface().selectAll('.hover')
87827                               .classed('hover', false);
87828                       })
87829                       .on('click', function() {
87830                           event.preventDefault();
87831                           var osmlayer = context.layers().layer('osm');
87832                           if (!osmlayer.enabled()) {
87833                               osmlayer.enabled(true);
87834                           }
87835
87836                           context.map().centerZoom(_error.loc, 20);
87837
87838                           if (entity) {
87839                               context.enter(modeSelect(context, [entityID]));
87840                           } else {
87841                               context.loadEntity(entityID, function() {
87842                                   context.enter(modeSelect(context, [entityID]));
87843                               });
87844                           }
87845                       });
87846
87847                   // Replace with friendly name if possible
87848                   // (The entity may not yet be loaded into the graph)
87849                   if (entity) {
87850                       var name = utilDisplayName(entity);  // try to use common name
87851
87852                       if (!name && !isObjectLink) {
87853                           var preset = context.presets().match(entity, context.graph());
87854                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
87855                       }
87856
87857                       if (name) {
87858                           this.innerText = name;
87859                       }
87860                   }
87861               });
87862
87863           // Don't hide entities related to this error - #5880
87864           context.features().forceVisible(relatedEntities);
87865       }
87866
87867
87868       improveOsmDetails.error = function(val) {
87869           if (!arguments.length) return _error;
87870           _error = val;
87871           return improveOsmDetails;
87872       };
87873
87874
87875       return improveOsmDetails;
87876   }
87877
87878   function uiImproveOsmEditor(context) {
87879       var dispatch$1 = dispatch('change');
87880       var errorDetails = uiImproveOsmDetails(context);
87881       var errorComments = uiImproveOsmComments(context);
87882       var errorHeader = uiImproveOsmHeader(context);
87883       var quickLinks = uiQuickLinks();
87884
87885       var _error;
87886
87887
87888       function improveOsmEditor(selection) {
87889           // quick links
87890           var choices = [{
87891               id: 'zoom_to',
87892               label: 'inspector.zoom_to.title',
87893               tooltip: function() {
87894                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
87895               },
87896               click: function zoomTo() {
87897                   context.mode().zoomToSelected();
87898               }
87899           }];
87900
87901
87902           var header = selection.selectAll('.header')
87903               .data([0]);
87904
87905           var headerEnter = header.enter()
87906               .append('div')
87907               .attr('class', 'header fillL');
87908
87909           headerEnter
87910               .append('button')
87911               .attr('class', 'fr error-editor-close')
87912               .on('click', function() {
87913                   context.enter(modeBrowse(context));
87914               })
87915               .call(svgIcon('#iD-icon-close'));
87916
87917           headerEnter
87918               .append('h3')
87919               .text(t('QA.improveOSM.title'));
87920
87921
87922           var body = selection.selectAll('.body')
87923               .data([0]);
87924
87925           body = body.enter()
87926               .append('div')
87927               .attr('class', 'body')
87928               .merge(body);
87929
87930           var editor = body.selectAll('.error-editor')
87931               .data([0]);
87932
87933           editor.enter()
87934               .append('div')
87935               .attr('class', 'modal-section error-editor')
87936               .merge(editor)
87937               .call(errorHeader.error(_error))
87938               .call(quickLinks.choices(choices))
87939               .call(errorDetails.error(_error))
87940               .call(errorComments.error(_error))
87941               .call(improveOsmSaveSection);
87942       }
87943
87944       function improveOsmSaveSection(selection) {
87945           var isSelected = (_error && _error.id === context.selectedErrorID());
87946           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
87947           var saveSection = selection.selectAll('.error-save')
87948               .data(
87949                   (isShown ? [_error] : []),
87950                   function(d) { return d.id + '-' + (d.status || 0); }
87951               );
87952
87953           // exit
87954           saveSection.exit()
87955               .remove();
87956
87957           // enter
87958           var saveSectionEnter = saveSection.enter()
87959               .append('div')
87960               .attr('class', 'error-save save-section cf');
87961
87962           saveSectionEnter
87963               .append('h4')
87964               .attr('class', '.error-save-header')
87965               .text(t('note.newComment'));
87966
87967           saveSectionEnter
87968               .append('textarea')
87969               .attr('class', 'new-comment-input')
87970               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
87971               .attr('maxlength', 1000)
87972               .property('value', function(d) { return d.newComment; })
87973               .call(utilNoAuto)
87974               .on('input', changeInput)
87975               .on('blur', changeInput);
87976
87977           // update
87978           saveSection = saveSectionEnter
87979               .merge(saveSection)
87980               .call(errorSaveButtons);
87981
87982           function changeInput() {
87983               var input = select(this);
87984               var val = input.property('value').trim();
87985
87986               if (val === '') {
87987                   val = undefined;
87988               }
87989
87990               // store the unsaved comment with the error itself
87991               _error = _error.update({ newComment: val });
87992
87993               var errorService = services.improveOSM;
87994               if (errorService) {
87995                   errorService.replaceError(_error);
87996               }
87997
87998               saveSection
87999                   .call(errorSaveButtons);
88000           }
88001       }
88002
88003       function errorSaveButtons(selection) {
88004           var isSelected = (_error && _error.id === context.selectedErrorID());
88005           var buttonSection = selection.selectAll('.buttons')
88006               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
88007
88008           // exit
88009           buttonSection.exit()
88010               .remove();
88011
88012           // enter
88013           var buttonEnter = buttonSection.enter()
88014               .append('div')
88015               .attr('class', 'buttons');
88016
88017           buttonEnter
88018               .append('button')
88019               .attr('class', 'button comment-button action')
88020               .text(t('QA.keepRight.save_comment'));
88021
88022           buttonEnter
88023               .append('button')
88024               .attr('class', 'button close-button action');
88025
88026           buttonEnter
88027               .append('button')
88028               .attr('class', 'button ignore-button action');
88029
88030
88031           // update
88032           buttonSection = buttonSection
88033               .merge(buttonEnter);
88034
88035           buttonSection.select('.comment-button')
88036               .attr('disabled', function(d) {
88037                   return d.newComment === undefined ? true : null;
88038               })
88039               .on('click.comment', function(d) {
88040                   this.blur();    // avoid keeping focus on the button - #4641
88041                   var errorService = services.improveOSM;
88042                   if (errorService) {
88043                       errorService.postUpdate(d, function(err, error) {
88044                           dispatch$1.call('change', error);
88045                       });
88046                   }
88047               });
88048
88049           buttonSection.select('.close-button')
88050               .text(function(d) {
88051                   var andComment = (d.newComment !== undefined ? '_comment' : '');
88052                   return t('QA.keepRight.close' + andComment);
88053               })
88054               .on('click.close', function(d) {
88055                   this.blur();    // avoid keeping focus on the button - #4641
88056                   var errorService = services.improveOSM;
88057                   if (errorService) {
88058                       d.newStatus = 'SOLVED';
88059                       errorService.postUpdate(d, function(err, error) {
88060                           dispatch$1.call('change', error);
88061                       });
88062                   }
88063               });
88064
88065           buttonSection.select('.ignore-button')
88066               .text(function(d) {
88067                   var andComment = (d.newComment !== undefined ? '_comment' : '');
88068                   return t('QA.keepRight.ignore' + andComment);
88069               })
88070               .on('click.ignore', function(d) {
88071                   this.blur();    // avoid keeping focus on the button - #4641
88072                   var errorService = services.improveOSM;
88073                   if (errorService) {
88074                       d.newStatus = 'INVALID';
88075                       errorService.postUpdate(d, function(err, error) {
88076                           dispatch$1.call('change', error);
88077                       });
88078                   }
88079               });
88080       }
88081
88082       improveOsmEditor.error = function(val) {
88083           if (!arguments.length) return _error;
88084           _error = val;
88085           return improveOsmEditor;
88086       };
88087
88088
88089       return utilRebind(improveOsmEditor, dispatch$1, 'on');
88090   }
88091
88092   function uiImproveOsmHeader() {
88093       var _error;
88094
88095
88096       function errorTitle(d) {
88097           var unknown = t('inspector.unknown');
88098
88099           if (!d) return unknown;
88100           var errorType = d.error_key;
88101           var et = en.QA.improveOSM.error_types[errorType];
88102
88103           if (et && et.title) {
88104               return t('QA.improveOSM.error_types.' + errorType + '.title');
88105           } else {
88106               return unknown;
88107           }
88108       }
88109
88110
88111       function improveOsmHeader(selection) {
88112           var header = selection.selectAll('.error-header')
88113               .data(
88114                   (_error ? [_error] : []),
88115                   function(d) { return d.id + '-' + (d.status || 0); }
88116               );
88117
88118           header.exit()
88119               .remove();
88120
88121           var headerEnter = header.enter()
88122               .append('div')
88123               .attr('class', 'error-header');
88124
88125           var iconEnter = headerEnter
88126               .append('div')
88127               .attr('class', 'error-header-icon')
88128               .classed('new', function(d) { return d.id < 0; });
88129
88130           var svgEnter = iconEnter
88131               .append('svg')
88132               .attr('width', '20px')
88133               .attr('height', '30px')
88134               .attr('viewbox', '0 0 20 30')
88135               .attr('class', function(d) {
88136                   return [
88137                       'preset-icon-28',
88138                       'qa_error',
88139                       d.service,
88140                       'error_id-' + d.id,
88141                       'error_type-' + d.error_type,
88142                       'category-' + d.category
88143                   ].join(' ');
88144               });
88145
88146           svgEnter
88147               .append('polygon')
88148               .attr('fill', 'currentColor')
88149               .attr('class', 'qa_error-fill')
88150               .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6');
88151
88152           svgEnter
88153               .append('use')
88154               .attr('class', 'icon-annotation')
88155               .attr('width', '11px')
88156               .attr('height', '11px')
88157               .attr('transform', 'translate(4.5, 7)')
88158               .attr('xlink:href', function(d) {
88159                   var picon = d.icon;
88160
88161                   if (!picon) {
88162                       return '';
88163                   } else {
88164                       var isMaki = /^maki-/.test(picon);
88165                       return '#' + picon + (isMaki ? '-11' : '');
88166                   }
88167               });
88168
88169           headerEnter
88170               .append('div')
88171               .attr('class', 'error-header-label')
88172               .text(errorTitle);
88173       }
88174
88175
88176       improveOsmHeader.error = function(val) {
88177           if (!arguments.length) return _error;
88178           _error = val;
88179           return improveOsmHeader;
88180       };
88181
88182
88183       return improveOsmHeader;
88184   }
88185
88186   function uiPresetList(context) {
88187       var dispatch$1 = dispatch('choose');
88188       var _entityID;
88189       var _currentPreset;
88190       var _autofocus = false;
88191
88192
88193       function presetList(selection) {
88194           var entity = context.entity(_entityID);
88195           var geometry = context.geometry(_entityID);
88196
88197           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
88198           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
88199               geometry = 'point';
88200           }
88201
88202           var presets = context.presets().matchGeometry(geometry);
88203
88204           selection.html('');
88205
88206           var messagewrap = selection
88207               .append('div')
88208               .attr('class', 'header fillL');
88209
88210           var message = messagewrap
88211               .append('h3')
88212               .text(t('inspector.choose'));
88213
88214           messagewrap
88215               .append('button')
88216               .attr('class', 'preset-choose')
88217               .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
88218               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
88219
88220           function initialKeydown() {
88221               // hack to let delete shortcut work when search is autofocused
88222               if (search.property('value').length === 0 &&
88223                   (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
88224                    event.keyCode === utilKeybinding.keyCodes['⌦'])) {
88225                   event.preventDefault();
88226                   event.stopPropagation();
88227                   operationDelete([_entityID], context)();
88228
88229               // hack to let undo work when search is autofocused
88230               } else if (search.property('value').length === 0 &&
88231                   (event.ctrlKey || event.metaKey) &&
88232                   event.keyCode === utilKeybinding.keyCodes.z) {
88233                   event.preventDefault();
88234                   event.stopPropagation();
88235                   context.undo();
88236               } else if (!event.ctrlKey && !event.metaKey) {
88237                   // don't check for delete/undo hack on future keydown events
88238                   select(this).on('keydown', keydown);
88239                   keydown.call(this);
88240               }
88241           }
88242
88243           function keydown() {
88244               // down arrow
88245               if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
88246                   // if insertion point is at the end of the string
88247                   search.node().selectionStart === search.property('value').length) {
88248                   event.preventDefault();
88249                   event.stopPropagation();
88250                   // move focus to the first item in the preset list
88251                   var buttons = list.selectAll('.preset-list-button');
88252                   if (!buttons.empty()) buttons.nodes()[0].focus();
88253               }
88254           }
88255
88256           function keypress() {
88257               // enter
88258               var value = search.property('value');
88259               if (event.keyCode === 13 && value.length) {
88260                   list.selectAll('.preset-list-item:first-child')
88261                       .each(function(d) { d.choose.call(select(this).node()); });
88262               }
88263           }
88264
88265           function inputevent() {
88266               var value = search.property('value');
88267               list.classed('filtered', value.length);
88268               if (value.length) {
88269                   var results = presets.search(value, geometry);
88270                   message.text(t('inspector.results', {
88271                       n: results.collection.length,
88272                       search: value
88273                   }));
88274                   list.call(drawList, results);
88275               } else {
88276                   list.call(drawList, context.presets().defaults(geometry, 36));
88277                   message.text(t('inspector.choose'));
88278               }
88279           }
88280
88281           var searchWrap = selection
88282               .append('div')
88283               .attr('class', 'search-header');
88284
88285           var search = searchWrap
88286               .append('input')
88287               .attr('class', 'preset-search-input')
88288               .attr('placeholder', t('inspector.search'))
88289               .attr('type', 'search')
88290               .call(utilNoAuto)
88291               .on('keydown', initialKeydown)
88292               .on('keypress', keypress)
88293               .on('input', inputevent);
88294
88295           searchWrap
88296               .call(svgIcon('#iD-icon-search', 'pre-text'));
88297
88298           if (_autofocus) {
88299               search.node().focus();
88300           }
88301
88302           var listWrap = selection
88303               .append('div')
88304               .attr('class', 'inspector-body');
88305
88306           var list = listWrap
88307               .append('div')
88308               .attr('class', 'preset-list fillL cf')
88309               .call(drawList, context.presets().defaults(geometry, 36));
88310
88311           context.features().on('change.preset-list', updateForFeatureHiddenState);
88312       }
88313
88314
88315       function drawList(list, presets) {
88316           var collection = presets.collection.reduce(function(collection, preset) {
88317               if (preset.members) {
88318                   collection.push(CategoryItem(preset));
88319               } else if (preset.visible()) {
88320                   collection.push(PresetItem(preset));
88321               }
88322               return collection;
88323           }, []);
88324
88325           var items = list.selectAll('.preset-list-item')
88326               .data(collection, function(d) { return d.preset.id; });
88327
88328           items.order();
88329
88330           items.exit()
88331               .remove();
88332
88333           items.enter()
88334               .append('div')
88335               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
88336               .classed('current', function(item) { return item.preset === _currentPreset; })
88337               .each(function(item) { select(this).call(item); })
88338               .style('opacity', 0)
88339               .transition()
88340               .style('opacity', 1);
88341
88342           updateForFeatureHiddenState();
88343       }
88344
88345       function itemKeydown(){
88346           // the actively focused item
88347           var item = select(this.closest('.preset-list-item'));
88348           var parentItem = select(item.node().parentElement.closest('.preset-list-item'));
88349
88350           // arrow down, move focus to the next, lower item
88351           if (event.keyCode === utilKeybinding.keyCodes['↓']) {
88352               event.preventDefault();
88353               event.stopPropagation();
88354               // the next item in the list at the same level
88355               var nextItem = select(item.node().nextElementSibling);
88356               // if there is no next item in this list
88357               if (nextItem.empty()) {
88358                   // if there is a parent item
88359                   if (!parentItem.empty()) {
88360                       // the item is the last item of a sublist,
88361                       // select the next item at the parent level
88362                       nextItem = select(parentItem.node().nextElementSibling);
88363                   }
88364               // if the focused item is expanded
88365               } else if (select(this).classed('expanded')) {
88366                   // select the first subitem instead
88367                   nextItem = item.select('.subgrid .preset-list-item:first-child');
88368               }
88369               if (!nextItem.empty()) {
88370                   // focus on the next item
88371                   nextItem.select('.preset-list-button').node().focus();
88372               }
88373
88374           // arrow up, move focus to the previous, higher item
88375           } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
88376               event.preventDefault();
88377               event.stopPropagation();
88378               // the previous item in the list at the same level
88379               var previousItem = select(item.node().previousElementSibling);
88380
88381               // if there is no previous item in this list
88382               if (previousItem.empty()) {
88383                   // if there is a parent item
88384                   if (!parentItem.empty()) {
88385                       // the item is the first subitem of a sublist select the parent item
88386                       previousItem = parentItem;
88387                   }
88388               // if the previous item is expanded
88389               } else if (previousItem.select('.preset-list-button').classed('expanded')) {
88390                   // select the last subitem of the sublist of the previous item
88391                   previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
88392               }
88393
88394               if (!previousItem.empty()) {
88395                   // focus on the previous item
88396                   previousItem.select('.preset-list-button').node().focus();
88397               } else {
88398                   // the focus is at the top of the list, move focus back to the search field
88399                   var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
88400                   search.node().focus();
88401               }
88402
88403           // arrow left, move focus to the parent item if there is one
88404           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
88405               event.preventDefault();
88406               event.stopPropagation();
88407               // if there is a parent item, focus on the parent item
88408               if (!parentItem.empty()) {
88409                   parentItem.select('.preset-list-button').node().focus();
88410               }
88411
88412           // arrow right, choose this item
88413           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
88414               event.preventDefault();
88415               event.stopPropagation();
88416               item.datum().choose.call(select(this).node());
88417           }
88418       }
88419
88420
88421       function CategoryItem(preset) {
88422           var box, sublist, shown = false;
88423
88424           function item(selection) {
88425               var wrap = selection.append('div')
88426                   .attr('class', 'preset-list-button-wrap category');
88427
88428               function click() {
88429                   var isExpanded = select(this).classed('expanded');
88430                   var iconName = isExpanded ?
88431                       (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
88432                   select(this)
88433                       .classed('expanded', !isExpanded);
88434                   select(this).selectAll('div.label-inner svg.icon use')
88435                       .attr('href', iconName);
88436                   item.choose();
88437               }
88438
88439               var button = wrap
88440                   .append('button')
88441                   .attr('class', 'preset-list-button')
88442                   .classed('expanded', false)
88443                   .call(uiPresetIcon()
88444                       .geometry(context.geometry(_entityID))
88445                       .preset(preset))
88446                   .on('click', click)
88447                   .on('keydown', function() {
88448                       // right arrow, expand the focused item
88449                       if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
88450                           event.preventDefault();
88451                           event.stopPropagation();
88452                           // if the item isn't expanded
88453                           if (!select(this).classed('expanded')) {
88454                               // toggle expansion (expand the item)
88455                               click.call(this);
88456                           }
88457                       // left arrow, collapse the focused item
88458                       } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
88459                           event.preventDefault();
88460                           event.stopPropagation();
88461                           // if the item is expanded
88462                           if (select(this).classed('expanded')) {
88463                               // toggle expansion (collapse the item)
88464                               click.call(this);
88465                           }
88466                       } else {
88467                           itemKeydown.call(this);
88468                       }
88469                   });
88470
88471               var label = button
88472                   .append('div')
88473                   .attr('class', 'label')
88474                   .append('div')
88475                   .attr('class', 'label-inner');
88476
88477               label
88478                   .append('div')
88479                   .attr('class', 'namepart')
88480                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
88481                   .append('span')
88482                   .html(function() { return preset.name() + '&hellip;'; });
88483
88484               box = selection.append('div')
88485                   .attr('class', 'subgrid')
88486                   .style('max-height', '0px')
88487                   .style('opacity', 0);
88488
88489               box.append('div')
88490                   .attr('class', 'arrow');
88491
88492               sublist = box.append('div')
88493                   .attr('class', 'preset-list fillL3');
88494           }
88495
88496
88497           item.choose = function() {
88498               if (!box || !sublist) return;
88499
88500               if (shown) {
88501                   shown = false;
88502                   box.transition()
88503                       .duration(200)
88504                       .style('opacity', '0')
88505                       .style('max-height', '0px')
88506                       .style('padding-bottom', '0px');
88507               } else {
88508                   shown = true;
88509                   sublist.call(drawList, preset.members);
88510                   box.transition()
88511                       .duration(200)
88512                       .style('opacity', '1')
88513                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
88514                       .style('padding-bottom', '10px');
88515               }
88516           };
88517
88518           item.preset = preset;
88519           return item;
88520       }
88521
88522
88523       function PresetItem(preset) {
88524           function item(selection) {
88525               var wrap = selection.append('div')
88526                   .attr('class', 'preset-list-button-wrap');
88527
88528               var button = wrap.append('button')
88529                   .attr('class', 'preset-list-button')
88530                   .call(uiPresetIcon()
88531                       .geometry(context.geometry(_entityID))
88532                       .preset(preset))
88533                   .on('click', item.choose)
88534                   .on('keydown', itemKeydown);
88535
88536               var label = button
88537                   .append('div')
88538                   .attr('class', 'label')
88539                   .append('div')
88540                   .attr('class', 'label-inner');
88541
88542               // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
88543               label.selectAll('.namepart')
88544                   .data(preset.name().split(' – '))
88545                   .enter()
88546                   .append('div')
88547                   .attr('class', 'namepart')
88548                   .text(function(d) { return d; });
88549
88550               wrap.call(item.reference.button);
88551               selection.call(item.reference.body);
88552           }
88553
88554           item.choose = function() {
88555               if (select(this).classed('disabled')) return;
88556
88557               context.presets().choose(preset);
88558               context.perform(
88559                   actionChangePreset(_entityID, _currentPreset, preset),
88560                   t('operations.change_tags.annotation')
88561               );
88562
88563               dispatch$1.call('choose', this, preset);
88564           };
88565
88566           item.help = function() {
88567               event.stopPropagation();
88568               item.reference.toggle();
88569           };
88570
88571           item.preset = preset;
88572           item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
88573
88574           return item;
88575       }
88576
88577       function updateForFeatureHiddenState() {
88578
88579           if (!context.hasEntity(_entityID)) return;
88580
88581           var geometry = context.geometry(_entityID);
88582
88583           var button = d3_selectAll('.preset-list .preset-list-button');
88584
88585           // remove existing tooltips
88586           button.call(tooltip().destroyAny);
88587
88588           button.each(function(item, index) {
88589
88590               var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
88591               var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
88592
88593               select(this)
88594                   .classed('disabled', isHiddenPreset);
88595
88596               if (isHiddenPreset) {
88597                   var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
88598                   var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
88599                   var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
88600                   select(this).call(tooltip()
88601                       .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
88602                       .placement(index < 2 ? 'bottom' : 'top')
88603                   );
88604               }
88605           });
88606       }
88607
88608       presetList.autofocus = function(val) {
88609           if (!arguments.length) return _autofocus;
88610           _autofocus = val;
88611           return presetList;
88612       };
88613
88614
88615       presetList.entityID = function(val) {
88616           if (!arguments.length) return _entityID;
88617           _entityID = val;
88618           presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
88619           return presetList;
88620       };
88621
88622
88623       presetList.preset = function(val) {
88624           if (!arguments.length) return _currentPreset;
88625           _currentPreset = val;
88626           return presetList;
88627       };
88628
88629
88630       return utilRebind(presetList, dispatch$1, 'on');
88631   }
88632
88633   function uiViewOnOSM(context) {
88634       var _what;   // an osmEntity or osmNote
88635
88636
88637       function viewOnOSM(selection) {
88638           var url;
88639           if (_what instanceof osmEntity) {
88640               url = context.connection().entityURL(_what);
88641           } else if (_what instanceof osmNote) {
88642               url = context.connection().noteURL(_what);
88643           }
88644
88645           var data = ((!_what || _what.isNew()) ? [] : [_what]);
88646           var link = selection.selectAll('.view-on-osm')
88647               .data(data, function(d) { return d.id; });
88648
88649           // exit
88650           link.exit()
88651               .remove();
88652
88653           // enter
88654           var linkEnter = link.enter()
88655               .append('a')
88656               .attr('class', 'view-on-osm')
88657               .attr('target', '_blank')
88658               .attr('href', url)
88659               .call(svgIcon('#iD-icon-out-link', 'inline'));
88660
88661           linkEnter
88662               .append('span')
88663               .text(t('inspector.view_on_osm'));
88664       }
88665
88666
88667       viewOnOSM.what = function(_) {
88668           if (!arguments.length) return _what;
88669           _what = _;
88670           return viewOnOSM;
88671       };
88672
88673       return viewOnOSM;
88674   }
88675
88676   function uiInspector(context) {
88677       var presetList = uiPresetList(context);
88678       var entityEditor = uiEntityEditor(context);
88679       var wrap = select(null),
88680           presetPane = select(null),
88681           editorPane = select(null);
88682       var _state = 'select';
88683       var _entityID;
88684       var _newFeature = false;
88685
88686
88687       function inspector(selection, newFeature) {
88688           presetList
88689               .entityID(_entityID)
88690               .autofocus(_newFeature)
88691               .on('choose', inspector.setPreset);
88692
88693           entityEditor
88694               .state(_state)
88695               .entityID(_entityID)
88696               .on('choose', inspector.showList);
88697
88698           wrap = selection.selectAll('.panewrap')
88699               .data([0]);
88700
88701           var enter = wrap.enter()
88702               .append('div')
88703               .attr('class', 'panewrap');
88704
88705           enter
88706               .append('div')
88707               .attr('class', 'preset-list-pane pane');
88708
88709           enter
88710               .append('div')
88711               .attr('class', 'entity-editor-pane pane');
88712
88713           wrap = wrap.merge(enter);
88714           presetPane = wrap.selectAll('.preset-list-pane');
88715           editorPane = wrap.selectAll('.entity-editor-pane');
88716
88717           var entity = context.entity(_entityID);
88718
88719           var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
88720               (!entity.hasNonGeometryTags() && !entity.isHighwayIntersection(context.graph()));
88721           // start with the preset list if the feature is new or is an uninteresting vertex
88722           var showPresetList = newFeature || isTaglessOrIntersectionVertex;
88723
88724           if (showPresetList) {
88725               wrap.style('right', '-100%');
88726               presetPane.call(presetList);
88727           } else {
88728               wrap.style('right', '0%');
88729               editorPane.call(entityEditor);
88730           }
88731
88732           var footer = selection.selectAll('.footer')
88733               .data([0]);
88734
88735           footer = footer.enter()
88736               .append('div')
88737               .attr('class', 'footer')
88738               .merge(footer);
88739
88740           footer
88741               .call(uiViewOnOSM(context)
88742                   .what(context.hasEntity(_entityID))
88743               );
88744       }
88745
88746       inspector.showList = function(preset) {
88747           wrap.transition()
88748               .styleTween('right', function() { return interpolate('0%', '-100%'); });
88749
88750           presetPane
88751               .call(presetList.preset(preset).autofocus(true));
88752       };
88753
88754       inspector.setPreset = function(preset) {
88755
88756           // upon setting multipolygon, go to the area preset list instead of the editor
88757           if (preset.id === 'type/multipolygon') {
88758               presetPane
88759                   .call(presetList.preset(preset).autofocus(true));
88760
88761           } else {
88762               wrap.transition()
88763                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
88764
88765               editorPane
88766                   .call(entityEditor.preset(preset));
88767           }
88768
88769       };
88770
88771       inspector.state = function(val) {
88772           if (!arguments.length) return _state;
88773           _state = val;
88774           entityEditor.state(_state);
88775
88776           // remove any old field help overlay that might have gotten attached to the inspector
88777           d3_selectAll('.field-help-body').remove();
88778
88779           return inspector;
88780       };
88781
88782
88783       inspector.entityID = function(val) {
88784           if (!arguments.length) return _entityID;
88785           _entityID = val;
88786           return inspector;
88787       };
88788
88789
88790       inspector.newFeature = function(val) {
88791           if (!arguments.length) return _newFeature;
88792           _newFeature = val;
88793           return inspector;
88794       };
88795
88796
88797       return inspector;
88798   }
88799
88800   function uiKeepRightDetails(context) {
88801       var _error;
88802
88803
88804       function errorDetail(d) {
88805           var unknown = t('inspector.unknown');
88806
88807           if (!d) return unknown;
88808           var errorType = d.error_type;
88809           var parentErrorType = d.parent_error_type;
88810
88811           var et = en.QA.keepRight.errorTypes[errorType];
88812           var pt = en.QA.keepRight.errorTypes[parentErrorType];
88813
88814           var detail;
88815           if (et && et.description) {
88816               detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
88817           } else if (pt && pt.description) {
88818               detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
88819           } else {
88820               detail = unknown;
88821           }
88822
88823           return detail;
88824       }
88825
88826
88827       function keepRightDetails(selection) {
88828           var details = selection.selectAll('.error-details')
88829               .data(
88830                   (_error ? [_error] : []),
88831                   function(d) { return d.id + '-' + (d.status || 0); }
88832               );
88833
88834           details.exit()
88835               .remove();
88836
88837           var detailsEnter = details.enter()
88838               .append('div')
88839               .attr('class', 'error-details error-details-container');
88840
88841
88842           // description
88843           var descriptionEnter = detailsEnter
88844               .append('div')
88845               .attr('class', 'error-details-description');
88846
88847           descriptionEnter
88848               .append('h4')
88849               .text(function() { return t('QA.keepRight.detail_description'); });
88850
88851           descriptionEnter
88852               .append('div')
88853               .attr('class', 'error-details-description-text')
88854               .html(errorDetail);
88855
88856           // If there are entity links in the error message..
88857           var relatedEntities = [];
88858           descriptionEnter.selectAll('.error_entity_link, .error_object_link')
88859               .each(function() {
88860                   var link = select(this);
88861                   var isObjectLink = link.classed('error_object_link');
88862                   var entityID = isObjectLink ?
88863                       (utilEntityRoot(_error.object_type) + _error.object_id)
88864                       : this.textContent;
88865                   var entity = context.hasEntity(entityID);
88866
88867                   relatedEntities.push(entityID);
88868
88869                   // Add click handler
88870                   link
88871                       .on('mouseover', function() {
88872                           context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
88873                               .classed('hover', true);
88874                       })
88875                       .on('mouseout', function() {
88876                           context.surface().selectAll('.hover')
88877                               .classed('hover', false);
88878                       })
88879                       .on('click', function() {
88880                           event.preventDefault();
88881                           var osmlayer = context.layers().layer('osm');
88882                           if (!osmlayer.enabled()) {
88883                               osmlayer.enabled(true);
88884                           }
88885
88886                           context.map().centerZoomEase(_error.loc, 20);
88887
88888                           if (entity) {
88889                               context.enter(modeSelect(context, [entityID]));
88890                           } else {
88891                               context.loadEntity(entityID, function() {
88892                                   context.enter(modeSelect(context, [entityID]));
88893                               });
88894                           }
88895                       });
88896
88897                   // Replace with friendly name if possible
88898                   // (The entity may not yet be loaded into the graph)
88899                   if (entity) {
88900                       var name = utilDisplayName(entity);  // try to use common name
88901
88902                       if (!name && !isObjectLink) {
88903                           var preset = context.presets().match(entity, context.graph());
88904                           name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
88905                       }
88906
88907                       if (name) {
88908                           this.innerText = name;
88909                       }
88910                   }
88911               });
88912
88913           // Don't hide entities related to this error - #5880
88914           context.features().forceVisible(relatedEntities);
88915       }
88916
88917
88918       keepRightDetails.error = function(val) {
88919           if (!arguments.length) return _error;
88920           _error = val;
88921           return keepRightDetails;
88922       };
88923
88924
88925       return keepRightDetails;
88926   }
88927
88928   function uiKeepRightEditor(context) {
88929       var dispatch$1 = dispatch('change');
88930       var keepRightDetails = uiKeepRightDetails(context);
88931       var keepRightHeader = uiKeepRightHeader(context);
88932       var quickLinks = uiQuickLinks();
88933
88934       var _error;
88935
88936
88937       function keepRightEditor(selection) {
88938           // quick links
88939           var choices = [{
88940               id: 'zoom_to',
88941               label: 'inspector.zoom_to.title',
88942               tooltip: function() {
88943                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
88944               },
88945               click: function zoomTo() {
88946                   context.mode().zoomToSelected();
88947               }
88948           }];
88949
88950
88951           var header = selection.selectAll('.header')
88952               .data([0]);
88953
88954           var headerEnter = header.enter()
88955               .append('div')
88956               .attr('class', 'header fillL');
88957
88958           headerEnter
88959               .append('button')
88960               .attr('class', 'fr error-editor-close')
88961               .on('click', function() {
88962                   context.enter(modeBrowse(context));
88963               })
88964               .call(svgIcon('#iD-icon-close'));
88965
88966           headerEnter
88967               .append('h3')
88968               .text(t('QA.keepRight.title'));
88969
88970
88971           var body = selection.selectAll('.body')
88972               .data([0]);
88973
88974           body = body.enter()
88975               .append('div')
88976               .attr('class', 'body')
88977               .merge(body);
88978
88979           var editor = body.selectAll('.error-editor')
88980               .data([0]);
88981
88982           editor.enter()
88983               .append('div')
88984               .attr('class', 'modal-section error-editor')
88985               .merge(editor)
88986               .call(keepRightHeader.error(_error))
88987               .call(quickLinks.choices(choices))
88988               .call(keepRightDetails.error(_error))
88989               .call(keepRightSaveSection);
88990
88991
88992           var footer = selection.selectAll('.footer')
88993               .data([0]);
88994
88995           footer.enter()
88996               .append('div')
88997               .attr('class', 'footer')
88998               .merge(footer)
88999               .call(uiViewOnKeepRight(context).what(_error));
89000       }
89001
89002
89003       function keepRightSaveSection(selection) {
89004           var isSelected = (_error && _error.id === context.selectedErrorID());
89005           var isShown = (_error && (isSelected || _error.newComment || _error.comment));
89006           var saveSection = selection.selectAll('.error-save')
89007               .data(
89008                   (isShown ? [_error] : []),
89009                   function(d) { return d.id + '-' + (d.status || 0); }
89010               );
89011
89012           // exit
89013           saveSection.exit()
89014               .remove();
89015
89016           // enter
89017           var saveSectionEnter = saveSection.enter()
89018               .append('div')
89019               .attr('class', 'error-save save-section cf');
89020
89021           saveSectionEnter
89022               .append('h4')
89023               .attr('class', '.error-save-header')
89024               .text(t('QA.keepRight.comment'));
89025
89026           saveSectionEnter
89027               .append('textarea')
89028               .attr('class', 'new-comment-input')
89029               .attr('placeholder', t('QA.keepRight.comment_placeholder'))
89030               .attr('maxlength', 1000)
89031               .property('value', function(d) { return d.newComment || d.comment; })
89032               .call(utilNoAuto)
89033               .on('input', changeInput)
89034               .on('blur', changeInput);
89035
89036           // update
89037           saveSection = saveSectionEnter
89038               .merge(saveSection)
89039               .call(keepRightSaveButtons);
89040
89041
89042           function changeInput() {
89043               var input = select(this);
89044               var val = input.property('value').trim();
89045
89046               if (val === _error.comment) {
89047                   val = undefined;
89048               }
89049
89050               // store the unsaved comment with the error itself
89051               _error = _error.update({ newComment: val });
89052
89053               var keepRight = services.keepRight;
89054               if (keepRight) {
89055                   keepRight.replaceError(_error);  // update keepright cache
89056               }
89057
89058               saveSection
89059                   .call(keepRightSaveButtons);
89060           }
89061       }
89062
89063
89064       function keepRightSaveButtons(selection) {
89065           var isSelected = (_error && _error.id === context.selectedErrorID());
89066           var buttonSection = selection.selectAll('.buttons')
89067               .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
89068
89069           // exit
89070           buttonSection.exit()
89071               .remove();
89072
89073           // enter
89074           var buttonEnter = buttonSection.enter()
89075               .append('div')
89076               .attr('class', 'buttons');
89077
89078           buttonEnter
89079               .append('button')
89080               .attr('class', 'button comment-button action')
89081               .text(t('QA.keepRight.save_comment'));
89082
89083           buttonEnter
89084               .append('button')
89085               .attr('class', 'button close-button action');
89086
89087           buttonEnter
89088               .append('button')
89089               .attr('class', 'button ignore-button action');
89090
89091
89092           // update
89093           buttonSection = buttonSection
89094               .merge(buttonEnter);
89095
89096           buttonSection.select('.comment-button')   // select and propagate data
89097               .attr('disabled', function(d) {
89098                   return d.newComment === undefined ? true : null;
89099               })
89100               .on('click.comment', function(d) {
89101                   this.blur();    // avoid keeping focus on the button - #4641
89102                   var keepRight = services.keepRight;
89103                   if (keepRight) {
89104                       keepRight.postKeepRightUpdate(d, function(err, error) {
89105                           dispatch$1.call('change', error);
89106                       });
89107                   }
89108               });
89109
89110           buttonSection.select('.close-button')   // select and propagate data
89111               .text(function(d) {
89112                   var andComment = (d.newComment !== undefined ? '_comment' : '');
89113                   return t('QA.keepRight.close' + andComment);
89114               })
89115               .on('click.close', function(d) {
89116                   this.blur();    // avoid keeping focus on the button - #4641
89117                   var keepRight = services.keepRight;
89118                   if (keepRight) {
89119                       d.state = 'ignore_t';   // ignore temporarily (error fixed)
89120                       keepRight.postKeepRightUpdate(d, function(err, error) {
89121                           dispatch$1.call('change', error);
89122                       });
89123                   }
89124               });
89125
89126           buttonSection.select('.ignore-button')   // select and propagate data
89127               .text(function(d) {
89128                   var andComment = (d.newComment !== undefined ? '_comment' : '');
89129                   return t('QA.keepRight.ignore' + andComment);
89130               })
89131               .on('click.ignore', function(d) {
89132                   this.blur();    // avoid keeping focus on the button - #4641
89133                   var keepRight = services.keepRight;
89134                   if (keepRight) {
89135                       d.state = 'ignore';   // ignore permanently (false positive)
89136                       keepRight.postKeepRightUpdate(d, function(err, error) {
89137                           dispatch$1.call('change', error);
89138                       });
89139                   }
89140               });
89141       }
89142
89143
89144       keepRightEditor.error = function(val) {
89145           if (!arguments.length) return _error;
89146           _error = val;
89147           return keepRightEditor;
89148       };
89149
89150
89151       return utilRebind(keepRightEditor, dispatch$1, 'on');
89152   }
89153
89154   function uiKeepRightHeader() {
89155       var _error;
89156
89157
89158       function errorTitle(d) {
89159           var unknown = t('inspector.unknown');
89160
89161           if (!d) return unknown;
89162           var errorType = d.error_type;
89163           var parentErrorType = d.parent_error_type;
89164
89165           var et = en.QA.keepRight.errorTypes[errorType];
89166           var pt = en.QA.keepRight.errorTypes[parentErrorType];
89167
89168           if (et && et.title) {
89169               return t('QA.keepRight.errorTypes.' + errorType + '.title');
89170           } else if (pt && pt.title) {
89171               return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
89172           } else {
89173               return unknown;
89174           }
89175       }
89176
89177
89178       function keepRightHeader(selection) {
89179           var header = selection.selectAll('.error-header')
89180               .data(
89181                   (_error ? [_error] : []),
89182                   function(d) { return d.id + '-' + (d.status || 0); }
89183               );
89184
89185           header.exit()
89186               .remove();
89187
89188           var headerEnter = header.enter()
89189               .append('div')
89190               .attr('class', 'error-header');
89191
89192           var iconEnter = headerEnter
89193               .append('div')
89194               .attr('class', 'error-header-icon')
89195               .classed('new', function(d) { return d.id < 0; });
89196
89197           iconEnter
89198               .append('div')
89199               .attr('class', function(d) {
89200                   return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
89201               })
89202               .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
89203
89204           headerEnter
89205               .append('div')
89206               .attr('class', 'error-header-label')
89207               .text(errorTitle);
89208       }
89209
89210
89211       keepRightHeader.error = function(val) {
89212           if (!arguments.length) return _error;
89213           _error = val;
89214           return keepRightHeader;
89215       };
89216
89217
89218       return keepRightHeader;
89219   }
89220
89221   function uiLasso(context) {
89222       var group, polygon;
89223
89224       lasso.coordinates = [];
89225
89226       function lasso(selection) {
89227           context.container()
89228               .classed('lasso', true);
89229
89230           group = selection
89231               .append('g')
89232               .attr('class', 'lasso hide');
89233
89234           polygon = group
89235               .append('path')
89236               .attr('class', 'lasso-path');
89237
89238           group
89239               .call(uiToggle(true));
89240       }
89241
89242
89243       function draw() {
89244           if (polygon) {
89245               polygon.data([lasso.coordinates])
89246                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
89247           }
89248       }
89249
89250
89251       lasso.extent = function () {
89252           return lasso.coordinates.reduce(function(extent, point) {
89253               return extent.extend(geoExtent(point));
89254           }, geoExtent());
89255       };
89256
89257
89258       lasso.p = function(_) {
89259           if (!arguments.length) return lasso;
89260           lasso.coordinates.push(_);
89261           draw();
89262           return lasso;
89263       };
89264
89265
89266       lasso.close = function() {
89267           if (group) {
89268               group.call(uiToggle(false, function() {
89269                   select(this).remove();
89270               }));
89271           }
89272           context.container().classed('lasso', false);
89273       };
89274
89275
89276       return lasso;
89277   }
89278
89279   function uiNoteComments() {
89280       var _note;
89281
89282
89283       function noteComments(selection) {
89284           if (_note.isNew()) return; // don't draw .comments-container
89285
89286           var comments = selection.selectAll('.comments-container')
89287               .data([0]);
89288
89289           comments = comments.enter()
89290               .append('div')
89291               .attr('class', 'comments-container')
89292               .merge(comments);
89293
89294           var commentEnter = comments.selectAll('.comment')
89295               .data(_note.comments)
89296               .enter()
89297               .append('div')
89298               .attr('class', 'comment');
89299
89300           commentEnter
89301               .append('div')
89302               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
89303               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
89304
89305           var mainEnter = commentEnter
89306               .append('div')
89307               .attr('class', 'comment-main');
89308
89309           var metadataEnter = mainEnter
89310               .append('div')
89311               .attr('class', 'comment-metadata');
89312
89313           metadataEnter
89314               .append('div')
89315               .attr('class', 'comment-author')
89316               .each(function(d) {
89317                   var selection = select(this);
89318                   var osm = services.osm;
89319                   if (osm && d.user) {
89320                       selection = selection
89321                           .append('a')
89322                           .attr('class', 'comment-author-link')
89323                           .attr('href', osm.userURL(d.user))
89324                           .attr('tabindex', -1)
89325                           .attr('target', '_blank');
89326                   }
89327                   selection
89328                       .text(function(d) { return d.user || t('note.anonymous'); });
89329               });
89330
89331           metadataEnter
89332               .append('div')
89333               .attr('class', 'comment-date')
89334               .text(function(d) {
89335                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
89336               });
89337
89338           mainEnter
89339               .append('div')
89340               .attr('class', 'comment-text')
89341               .html(function(d) { return d.html; });
89342
89343           comments
89344               .call(replaceAvatars);
89345       }
89346
89347
89348       function replaceAvatars(selection) {
89349           var osm = services.osm;
89350           if (!osm) return;
89351
89352           var uids = {};  // gather uids in the comment thread
89353           _note.comments.forEach(function(d) {
89354               if (d.uid) uids[d.uid] = true;
89355           });
89356
89357           Object.keys(uids).forEach(function(uid) {
89358               osm.loadUser(uid, function(err, user) {
89359                   if (!user || !user.image_url) return;
89360
89361                   selection.selectAll('.comment-avatar.user-' + uid)
89362                       .html('')
89363                       .append('img')
89364                       .attr('class', 'icon comment-avatar-icon')
89365                       .attr('src', user.image_url)
89366                       .attr('alt', user.display_name);
89367               });
89368           });
89369       }
89370
89371
89372       function localeDateString(s) {
89373           if (!s) return null;
89374           var detected = utilDetect();
89375           var options = { day: 'numeric', month: 'short', year: 'numeric' };
89376           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
89377           var d = new Date(s);
89378           if (isNaN(d.getTime())) return null;
89379           return d.toLocaleDateString(detected.locale, options);
89380       }
89381
89382
89383       noteComments.note = function(val) {
89384           if (!arguments.length) return _note;
89385           _note = val;
89386           return noteComments;
89387       };
89388
89389
89390       return noteComments;
89391   }
89392
89393   function uiNoteEditor(context) {
89394       var dispatch$1 = dispatch('change');
89395       var quickLinks = uiQuickLinks();
89396       var noteComments = uiNoteComments();
89397       var noteHeader = uiNoteHeader();
89398
89399       // var formFields = uiFormFields(context);
89400
89401       var _note;
89402       // var _fieldsArr;
89403
89404
89405       function noteEditor(selection) {
89406           // quick links
89407           var choices = [{
89408               id: 'zoom_to',
89409               label: 'inspector.zoom_to.title',
89410               tooltip: function() {
89411                   return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
89412               },
89413               click: function zoomTo() {
89414                   context.mode().zoomToSelected();
89415               }
89416           }];
89417
89418
89419           var header = selection.selectAll('.header')
89420               .data([0]);
89421
89422           var headerEnter = header.enter()
89423               .append('div')
89424               .attr('class', 'header fillL');
89425
89426           headerEnter
89427               .append('button')
89428               .attr('class', 'fr note-editor-close')
89429               .on('click', function() {
89430                   context.enter(modeBrowse(context));
89431               })
89432               .call(svgIcon('#iD-icon-close'));
89433
89434           headerEnter
89435               .append('h3')
89436               .text(t('note.title'));
89437
89438
89439           var body = selection.selectAll('.body')
89440               .data([0]);
89441
89442           body = body.enter()
89443               .append('div')
89444               .attr('class', 'body')
89445               .merge(body);
89446
89447           var editor = body.selectAll('.note-editor')
89448               .data([0]);
89449
89450           editor.enter()
89451               .append('div')
89452               .attr('class', 'modal-section note-editor')
89453               .merge(editor)
89454               .call(noteHeader.note(_note))
89455               .call(quickLinks.choices(choices))
89456               .call(noteComments.note(_note))
89457               .call(noteSaveSection);
89458
89459
89460           var footer = selection.selectAll('.footer')
89461               .data([0]);
89462
89463           footer.enter()
89464               .append('div')
89465               .attr('class', 'footer')
89466               .merge(footer)
89467               .call(uiViewOnOSM(context).what(_note))
89468               .call(uiNoteReport(context).note(_note));
89469
89470
89471           // rerender the note editor on any auth change
89472           var osm = services.osm;
89473           if (osm) {
89474               osm.on('change.note-save', function() {
89475                   selection.call(noteEditor);
89476               });
89477           }
89478       }
89479
89480
89481       function noteSaveSection(selection) {
89482           var isSelected = (_note && _note.id === context.selectedNoteID());
89483           var noteSave = selection.selectAll('.note-save')
89484               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
89485
89486           // exit
89487           noteSave.exit()
89488               .remove();
89489
89490           // enter
89491           var noteSaveEnter = noteSave.enter()
89492               .append('div')
89493               .attr('class', 'note-save save-section cf');
89494
89495           // // if new note, show categories to pick from
89496           // if (_note.isNew()) {
89497           //     var presets = context.presets();
89498
89499           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
89500           //     _fieldsArr = [
89501           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
89502           //     ];
89503
89504           //     _fieldsArr.forEach(function(field) {
89505           //         field
89506           //             .on('change', changeCategory);
89507           //     });
89508
89509           //     noteSaveEnter
89510           //         .append('div')
89511           //         .attr('class', 'note-category')
89512           //         .call(formFields.fieldsArr(_fieldsArr));
89513           // }
89514
89515           // function changeCategory() {
89516           //     // NOTE: perhaps there is a better way to get value
89517           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
89518
89519           //     // store the unsaved category with the note itself
89520           //     _note = _note.update({ newCategory: val });
89521           //     var osm = services.osm;
89522           //     if (osm) {
89523           //         osm.replaceNote(_note);  // update note cache
89524           //     }
89525           //     noteSave
89526           //         .call(noteSaveButtons);
89527           // }
89528
89529           noteSaveEnter
89530               .append('h4')
89531               .attr('class', '.note-save-header')
89532               .text(function() {
89533                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
89534               });
89535
89536           noteSaveEnter
89537               .append('textarea')
89538               .attr('class', 'new-comment-input')
89539               .attr('placeholder', t('note.inputPlaceholder'))
89540               .attr('maxlength', 1000)
89541               .property('value', function(d) { return d.newComment; })
89542               .call(utilNoAuto)
89543               .on('keydown.note-input', keydown)
89544               .on('input.note-input', changeInput)
89545               .on('blur.note-input', changeInput);
89546
89547           // update
89548           noteSave = noteSaveEnter
89549               .merge(noteSave)
89550               .call(userDetails)
89551               .call(noteSaveButtons);
89552
89553
89554           // fast submit if user presses cmd+enter
89555           function keydown() {
89556               if (!(event.keyCode === 13 && event.metaKey)) return;
89557
89558               var osm = services.osm;
89559               if (!osm) return;
89560
89561               var hasAuth = osm.authenticated();
89562               if (!hasAuth) return;
89563
89564               if (!_note.newComment) return;
89565
89566               event.preventDefault();
89567
89568               select(this)
89569                   .on('keydown.note-input', null);
89570
89571               // focus on button and submit
89572               window.setTimeout(function() {
89573                   if (_note.isNew()) {
89574                       noteSave.selectAll('.save-button').node().focus();
89575                       clickSave(_note);
89576                   } else  {
89577                       noteSave.selectAll('.comment-button').node().focus();
89578                       clickComment(_note);
89579                   }
89580               }, 10);
89581           }
89582
89583
89584           function changeInput() {
89585               var input = select(this);
89586               var val = input.property('value').trim() || undefined;
89587
89588               // store the unsaved comment with the note itself
89589               _note = _note.update({ newComment: val });
89590
89591               var osm = services.osm;
89592               if (osm) {
89593                   osm.replaceNote(_note);  // update note cache
89594               }
89595
89596               noteSave
89597                   .call(noteSaveButtons);
89598           }
89599       }
89600
89601
89602       function userDetails(selection) {
89603           var detailSection = selection.selectAll('.detail-section')
89604               .data([0]);
89605
89606           detailSection = detailSection.enter()
89607               .append('div')
89608               .attr('class', 'detail-section')
89609               .merge(detailSection);
89610
89611           var osm = services.osm;
89612           if (!osm) return;
89613
89614           // Add warning if user is not logged in
89615           var hasAuth = osm.authenticated();
89616           var authWarning = detailSection.selectAll('.auth-warning')
89617               .data(hasAuth ? [] : [0]);
89618
89619           authWarning.exit()
89620               .transition()
89621               .duration(200)
89622               .style('opacity', 0)
89623               .remove();
89624
89625           var authEnter = authWarning.enter()
89626               .insert('div', '.tag-reference-body')
89627               .attr('class', 'field-warning auth-warning')
89628               .style('opacity', 0);
89629
89630           authEnter
89631               .call(svgIcon('#iD-icon-alert', 'inline'));
89632
89633           authEnter
89634               .append('span')
89635               .text(t('note.login'));
89636
89637           authEnter
89638               .append('a')
89639               .attr('target', '_blank')
89640               .call(svgIcon('#iD-icon-out-link', 'inline'))
89641               .append('span')
89642               .text(t('login'))
89643               .on('click.note-login', function() {
89644                   event.preventDefault();
89645                   osm.authenticate();
89646               });
89647
89648           authEnter
89649               .transition()
89650               .duration(200)
89651               .style('opacity', 1);
89652
89653
89654           var prose = detailSection.selectAll('.note-save-prose')
89655               .data(hasAuth ? [0] : []);
89656
89657           prose.exit()
89658               .remove();
89659
89660           prose = prose.enter()
89661               .append('p')
89662               .attr('class', 'note-save-prose')
89663               .text(t('note.upload_explanation'))
89664               .merge(prose);
89665
89666           osm.userDetails(function(err, user) {
89667               if (err) return;
89668
89669               var userLink = select(document.createElement('div'));
89670
89671               if (user.image_url) {
89672                   userLink
89673                       .append('img')
89674                       .attr('src', user.image_url)
89675                       .attr('class', 'icon pre-text user-icon');
89676               }
89677
89678               userLink
89679                   .append('a')
89680                   .attr('class', 'user-info')
89681                   .text(user.display_name)
89682                   .attr('href', osm.userURL(user.display_name))
89683                   .attr('tabindex', -1)
89684                   .attr('target', '_blank');
89685
89686               prose
89687                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
89688           });
89689       }
89690
89691
89692       function noteSaveButtons(selection) {
89693           var osm = services.osm;
89694           var hasAuth = osm && osm.authenticated();
89695
89696           var isSelected = (_note && _note.id === context.selectedNoteID());
89697           var buttonSection = selection.selectAll('.buttons')
89698               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
89699
89700           // exit
89701           buttonSection.exit()
89702               .remove();
89703
89704           // enter
89705           var buttonEnter = buttonSection.enter()
89706               .append('div')
89707               .attr('class', 'buttons');
89708
89709           if (_note.isNew()) {
89710               buttonEnter
89711                   .append('button')
89712                   .attr('class', 'button cancel-button secondary-action')
89713                   .text(t('confirm.cancel'));
89714
89715               buttonEnter
89716                   .append('button')
89717                   .attr('class', 'button save-button action')
89718                   .text(t('note.save'));
89719
89720           } else {
89721               buttonEnter
89722                   .append('button')
89723                   .attr('class', 'button status-button action');
89724
89725               buttonEnter
89726                   .append('button')
89727                   .attr('class', 'button comment-button action')
89728                   .text(t('note.comment'));
89729           }
89730
89731
89732           // update
89733           buttonSection = buttonSection
89734               .merge(buttonEnter);
89735
89736           buttonSection.select('.cancel-button')   // select and propagate data
89737               .on('click.cancel', clickCancel);
89738
89739           buttonSection.select('.save-button')     // select and propagate data
89740               .attr('disabled', isSaveDisabled)
89741               .on('click.save', clickSave);
89742
89743           buttonSection.select('.status-button')   // select and propagate data
89744               .attr('disabled', (hasAuth ? null : true))
89745               .text(function(d) {
89746                   var action = (d.status === 'open' ? 'close' : 'open');
89747                   var andComment = (d.newComment ? '_comment' : '');
89748                   return t('note.' + action + andComment);
89749               })
89750               .on('click.status', clickStatus);
89751
89752           buttonSection.select('.comment-button')   // select and propagate data
89753               .attr('disabled', isSaveDisabled)
89754               .on('click.comment', clickComment);
89755
89756
89757           function isSaveDisabled(d) {
89758               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
89759           }
89760       }
89761
89762
89763
89764       function clickCancel(d) {
89765           this.blur();    // avoid keeping focus on the button - #4641
89766           var osm = services.osm;
89767           if (osm) {
89768               osm.removeNote(d);
89769           }
89770           context.enter(modeBrowse(context));
89771           dispatch$1.call('change');
89772       }
89773
89774
89775       function clickSave(d) {
89776           this.blur();    // avoid keeping focus on the button - #4641
89777           var osm = services.osm;
89778           if (osm) {
89779               osm.postNoteCreate(d, function(err, note) {
89780                   dispatch$1.call('change', note);
89781               });
89782           }
89783       }
89784
89785
89786       function clickStatus(d) {
89787           this.blur();    // avoid keeping focus on the button - #4641
89788           var osm = services.osm;
89789           if (osm) {
89790               var setStatus = (d.status === 'open' ? 'closed' : 'open');
89791               osm.postNoteUpdate(d, setStatus, function(err, note) {
89792                   dispatch$1.call('change', note);
89793               });
89794           }
89795       }
89796
89797       function clickComment(d) {
89798           this.blur();    // avoid keeping focus on the button - #4641
89799           var osm = services.osm;
89800           if (osm) {
89801               osm.postNoteUpdate(d, d.status, function(err, note) {
89802                   dispatch$1.call('change', note);
89803               });
89804           }
89805       }
89806
89807
89808       noteEditor.note = function(val) {
89809           if (!arguments.length) return _note;
89810           _note = val;
89811           return noteEditor;
89812       };
89813
89814
89815       return utilRebind(noteEditor, dispatch$1, 'on');
89816   }
89817
89818   function uiNoteHeader() {
89819       var _note;
89820
89821
89822       function noteHeader(selection) {
89823           var header = selection.selectAll('.note-header')
89824               .data(
89825                   (_note ? [_note] : []),
89826                   function(d) { return d.status + d.id; }
89827               );
89828
89829           header.exit()
89830               .remove();
89831
89832           var headerEnter = header.enter()
89833               .append('div')
89834               .attr('class', 'note-header');
89835
89836           var iconEnter = headerEnter
89837               .append('div')
89838               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
89839               .classed('new', function(d) { return d.id < 0; });
89840
89841           iconEnter
89842               .append('div')
89843               .attr('class', 'preset-icon-28')
89844               .call(svgIcon('#iD-icon-note', 'note-fill'));
89845
89846           iconEnter.each(function(d) {
89847               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
89848               iconEnter
89849                   .append('div')
89850                   .attr('class', 'note-icon-annotation')
89851                   .call(svgIcon(statusIcon, 'icon-annotation'));
89852           });
89853
89854           headerEnter
89855               .append('div')
89856               .attr('class', 'note-header-label')
89857               .text(function(d) {
89858                   if (_note.isNew()) { return t('note.new'); }
89859                   return t('note.note') + ' ' + d.id + ' ' +
89860                       (d.status === 'closed' ? t('note.closed') : '');
89861               });
89862       }
89863
89864
89865       noteHeader.note = function(val) {
89866           if (!arguments.length) return _note;
89867           _note = val;
89868           return noteHeader;
89869       };
89870
89871
89872       return noteHeader;
89873   }
89874
89875   function uiNoteReport() {
89876       var _note;
89877
89878       function noteReport(selection) {
89879           var url;
89880           if (services.osm && (_note instanceof osmNote) && (!_note.isNew())) {
89881               url = services.osm.noteReportURL(_note);
89882           }
89883
89884           var link = selection.selectAll('.note-report')
89885               .data(url ? [url] : []);
89886
89887           // exit
89888           link.exit()
89889               .remove();
89890
89891           // enter
89892           var linkEnter = link.enter()
89893               .append('a')
89894               .attr('class', 'note-report')
89895               .attr('target', '_blank')
89896               .attr('href', function(d) { return d; })
89897               .call(svgIcon('#iD-icon-out-link', 'inline'));
89898
89899           linkEnter
89900               .append('span')
89901               .text(t('note.report'));
89902       }
89903
89904
89905       noteReport.note = function(val) {
89906           if (!arguments.length) return _note;
89907           _note = val;
89908           return noteReport;
89909       };
89910
89911       return noteReport;
89912   }
89913
89914   function uiRadialMenu(context, operations) {
89915       var menu;
89916       var center = [0, 0];
89917       var tooltip;
89918
89919
89920       var radialMenu = function(selection) {
89921           if (!operations.length) return;
89922
89923           selection.node().parentNode.focus();
89924
89925           function click(operation) {
89926               event.stopPropagation();
89927               if (operation.disabled()) return;
89928               operation();
89929               radialMenu.close();
89930           }
89931
89932           menu = selection
89933               .append('g')
89934               .attr('class', 'radial-menu')
89935               .attr('transform', 'translate(' + center + ')')
89936               .attr('opacity', 0);
89937
89938           menu
89939               .transition()
89940               .attr('opacity', 1);
89941
89942           var r = 50;
89943           var a = Math.PI / 4;
89944           var a0 = -Math.PI / 4;
89945           var a1 = a0 + (operations.length - 1) * a;
89946
89947           menu
89948               .append('path')
89949               .attr('class', 'radial-menu-background')
89950               .attr('d', 'M' + r * Math.sin(a0) + ',' +
89951                                r * Math.cos(a0) +
89952                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
89953                                (r * Math.sin(a1) + 1e-3) + ',' +
89954                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
89955               .attr('stroke-width', 50)
89956               .attr('stroke-linecap', 'round');
89957
89958           var button = menu.selectAll()
89959               .data(operations)
89960               .enter()
89961               .append('g')
89962               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
89963               .classed('disabled', function(d) { return d.disabled(); })
89964               .attr('transform', function(d, i) {
89965                   return 'translate(' + geoVecFloor([
89966                           r * Math.sin(a0 + i * a),
89967                           r * Math.cos(a0 + i * a)]).join(',') + ')';
89968               });
89969
89970           button
89971               .append('circle')
89972               .attr('r', 15)
89973               .on('click', click)
89974               .on('mousedown', mousedown)
89975               .on('mouseover', mouseover)
89976               .on('mouseout', mouseout);
89977
89978           button
89979               .append('use')
89980               .attr('transform', 'translate(-10,-10)')
89981               .attr('width', '20')
89982               .attr('height', '20')
89983               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
89984
89985           tooltip = select(document.body)
89986               .append('div')
89987               .attr('class', 'tooltip-inner radial-menu-tooltip');
89988
89989           function mousedown() {
89990               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
89991           }
89992
89993           function mouseover(d, i) {
89994               var rect = context.surfaceRect();
89995               var angle = a0 + i * a;
89996               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
89997               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
89998               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
89999               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
90000
90001               tooltip
90002                   .style('top', null)
90003                   .style('left', null)
90004                   .style('bottom', null)
90005                   .style('right', null)
90006                   .style('display', 'block')
90007                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
90008
90009               if (i === 0) {
90010                   tooltip
90011                       .style('right', right)
90012                       .style('top', top);
90013               } else if (i >= 4) {
90014                   tooltip
90015                       .style('left', left)
90016                       .style('bottom', bottom);
90017               } else {
90018                   tooltip
90019                       .style('left', left)
90020                       .style('top', top);
90021               }
90022           }
90023
90024           function mouseout() {
90025               tooltip.style('display', 'none');
90026           }
90027       };
90028
90029
90030       radialMenu.close = function() {
90031           if (menu) {
90032               menu
90033                   .style('pointer-events', 'none')
90034                   .transition()
90035                   .attr('opacity', 0)
90036                   .remove();
90037           }
90038
90039           if (tooltip) {
90040               tooltip.remove();
90041           }
90042       };
90043
90044
90045       radialMenu.center = function(_) {
90046           if (!arguments.length) return center;
90047           center = _;
90048           return radialMenu;
90049       };
90050
90051
90052       return radialMenu;
90053   }
90054
90055   function uiSelectionList(context, selectedIDs) {
90056
90057       function selectEntity(entity) {
90058           context.enter(modeSelect(context, [entity.id]));
90059       }
90060
90061
90062       function deselectEntity(entity) {
90063           event.stopPropagation();
90064           var index = selectedIDs.indexOf(entity.id);
90065           if (index > -1) {
90066               selectedIDs.splice(index, 1);
90067           }
90068           context.enter(modeSelect(context, selectedIDs));
90069       }
90070
90071
90072       function selectionList(selection) {
90073           selection.classed('selection-list-pane', true);
90074
90075           var header = selection
90076               .append('div')
90077               .attr('class', 'header fillL cf');
90078
90079           header
90080               .append('h3')
90081               .text(t('inspector.multiselect'));
90082
90083           var listWrap = selection
90084               .append('div')
90085               .attr('class', 'inspector-body');
90086
90087           var list = listWrap
90088               .append('div')
90089               .attr('class', 'feature-list cf');
90090
90091           context.history().on('change.selection-list', drawList);
90092           drawList();
90093
90094
90095           function drawList() {
90096               var entities = selectedIDs
90097                   .map(function(id) { return context.hasEntity(id); })
90098                   .filter(function(entity) { return entity; });
90099
90100               var items = list.selectAll('.feature-list-item')
90101                   .data(entities, osmEntity.key);
90102
90103               items.exit()
90104                   .remove();
90105
90106               // Enter
90107               var enter = items.enter()
90108                   .append('div')
90109                   .attr('class', 'feature-list-item')
90110                   .on('click', selectEntity);
90111
90112               enter
90113                   .each(function(d) {
90114                       select(this).on('mouseover', function() {
90115                           utilHighlightEntities([d.id], true, context);
90116                       });
90117                       select(this).on('mouseout', function() {
90118                           utilHighlightEntities([d.id], false, context);
90119                       });
90120                   });
90121
90122               var label = enter
90123                   .append('button')
90124                   .attr('class', 'label');
90125
90126               enter
90127                   .append('button')
90128                   .attr('class', 'close')
90129                   .on('click', deselectEntity)
90130                   .call(svgIcon('#iD-icon-close'));
90131
90132               label
90133                   .append('span')
90134                   .attr('class', 'entity-geom-icon')
90135                   .call(svgIcon('', 'pre-text'));
90136
90137               label
90138                   .append('span')
90139                   .attr('class', 'entity-type');
90140
90141               label
90142                   .append('span')
90143                   .attr('class', 'entity-name');
90144
90145               // Update
90146               items = items.merge(enter);
90147
90148               items.selectAll('.entity-geom-icon use')
90149                   .attr('href', function() {
90150                       var entity = this.parentNode.parentNode.__data__;
90151                       return '#iD-icon-' + context.geometry(entity.id);
90152                   });
90153
90154               items.selectAll('.entity-type')
90155                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
90156
90157               items.selectAll('.entity-name')
90158                   .text(function(entity) { return utilDisplayName(entity); });
90159           }
90160       }
90161
90162       return selectionList;
90163   }
90164
90165   function uiSourceSwitch(context) {
90166       var keys;
90167
90168
90169       function click() {
90170           event.preventDefault();
90171
90172           var osm = context.connection();
90173           if (!osm) return;
90174
90175           if (context.inIntro()) return;
90176
90177           if (context.history().hasChanges() &&
90178               !window.confirm(t('source_switch.lose_changes'))) return;
90179
90180           var isLive = select(this)
90181               .classed('live');
90182
90183           isLive = !isLive;
90184           context.enter(modeBrowse(context));
90185           context.history().clearSaved();          // remove saved history
90186           context.flush();                         // remove stored data
90187
90188           select(this)
90189               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
90190               .classed('live', isLive);
90191
90192           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
90193       }
90194
90195       var sourceSwitch = function(selection) {
90196           selection
90197               .append('a')
90198               .attr('href', '#')
90199               .text(t('source_switch.live'))
90200               .classed('live', true)
90201               .attr('tabindex', -1)
90202               .on('click', click);
90203       };
90204
90205
90206       sourceSwitch.keys = function(_) {
90207           if (!arguments.length) return keys;
90208           keys = _;
90209           return sourceSwitch;
90210       };
90211
90212
90213       return sourceSwitch;
90214   }
90215
90216   function uiSuccess(context) {
90217       var MAXEVENTS = 2;
90218
90219       // All else being equal, rank more "social" communities higher
90220       // (anything not in this list receives no adjustment)
90221       var COMMUNITYRANK = {
90222           'meetup': +5,
90223           'slack': +4,
90224           'facebook': +3,
90225           'reddit': +2,
90226           'forum': -2,
90227           'mailinglist': -3,
90228           'irc': -4
90229       };
90230
90231       var detected = utilDetect();
90232       var dispatch$1 = dispatch('cancel');
90233       var _changeset;
90234       var _location;
90235
90236
90237       // string-to-date parsing in JavaScript is weird
90238       function parseEventDate(when) {
90239           if (!when) return;
90240
90241           var raw = when.trim();
90242           if (!raw) return;
90243
90244           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
90245               raw += 'Z';           // this forces date to be parsed as a UTC date
90246           }
90247
90248           var parsed = new Date(raw);
90249           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
90250       }
90251
90252
90253       function success(selection) {
90254           var header = selection
90255               .append('div')
90256               .attr('class', 'header fillL');
90257
90258           header
90259               .append('button')
90260               .attr('class', 'fr')
90261               .on('click', function() { dispatch$1.call('cancel'); })
90262               .call(svgIcon('#iD-icon-close'));
90263
90264           header
90265               .append('h3')
90266               .text(t('success.just_edited'));
90267
90268           var body = selection
90269               .append('div')
90270               .attr('class', 'body save-success fillL');
90271
90272           var summary = body
90273               .append('div')
90274               .attr('class', 'save-summary');
90275
90276           summary
90277               .append('h3')
90278               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
90279
90280           summary
90281               .append('p')
90282               .text(t('success.help_html'))
90283               .append('a')
90284               .attr('class', 'link-out')
90285               .attr('target', '_blank')
90286               .attr('tabindex', -1)
90287               .attr('href', t('success.help_link_url'))
90288               .call(svgIcon('#iD-icon-out-link', 'inline'))
90289               .append('span')
90290               .text(t('success.help_link_text'));
90291
90292           var osm = context.connection();
90293           if (!osm) return;
90294
90295           var changesetURL = osm.changesetURL(_changeset.id);
90296
90297           var table = summary
90298               .append('table')
90299               .attr('class', 'summary-table');
90300
90301           var row = table
90302               .append('tr')
90303               .attr('class', 'summary-row');
90304
90305           row
90306               .append('td')
90307               .attr('class', 'cell-icon summary-icon')
90308               .append('a')
90309               .attr('target', '_blank')
90310               .attr('href', changesetURL)
90311               .append('svg')
90312               .attr('class', 'logo-small')
90313               .append('use')
90314               .attr('xlink:href', '#iD-logo-osm');
90315
90316           var summaryDetail = row
90317               .append('td')
90318               .attr('class', 'cell-detail summary-detail');
90319
90320           summaryDetail
90321               .append('a')
90322               .attr('class', 'cell-detail summary-view-on-osm')
90323               .attr('target', '_blank')
90324               .attr('href', changesetURL)
90325               .text(t('success.view_on_osm'));
90326
90327           summaryDetail
90328               .append('div')
90329               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
90330
90331
90332           // Gather community polygon IDs intersecting the map..
90333           var matchFeatures = data.community.query(context.map().center(), true) || [];
90334           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
90335
90336           // Gather community resources that are either global or match a polygon.
90337           var matchResources = filter(data.community.resources, function(v) {
90338               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
90339           });
90340
90341           if (matchResources.length) {
90342               // sort by size ascending, then by community rank
90343               matchResources.sort(function(a, b) {
90344                   var aSize = Infinity;
90345                   var bSize = Infinity;
90346                   var aRank = COMMUNITYRANK[a.type] || 0;
90347                   var bRank = COMMUNITYRANK[b.type] || 0;
90348
90349                   if (a.featureId) {
90350                       aSize = data.community.features[a.featureId].properties.area;
90351                   }
90352                   if (b.featureId) {
90353                       bSize = data.community.features[b.featureId].properties.area;
90354                   }
90355
90356                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
90357               });
90358
90359               body
90360                   .call(showCommunityLinks, matchResources);
90361           }
90362       }
90363
90364
90365       function showCommunityLinks(selection, matchResources) {
90366           var communityLinks = selection
90367               .append('div')
90368               .attr('class', 'save-communityLinks');
90369
90370           communityLinks
90371               .append('h3')
90372               .text(t('success.like_osm'));
90373
90374           var table = communityLinks
90375               .append('table')
90376               .attr('class', 'community-table');
90377
90378           var row = table.selectAll('.community-row')
90379               .data(matchResources);
90380
90381           var rowEnter = row.enter()
90382               .append('tr')
90383               .attr('class', 'community-row');
90384
90385           rowEnter
90386               .append('td')
90387               .attr('class', 'cell-icon community-icon')
90388               .append('a')
90389               .attr('target', '_blank')
90390               .attr('href', function(d) { return d.url; })
90391               .append('svg')
90392               .attr('class', 'logo-small')
90393               .append('use')
90394               .attr('xlink:href', function(d) { return '#community-' + d.type; });
90395
90396           var communityDetail = rowEnter
90397               .append('td')
90398               .attr('class', 'cell-detail community-detail');
90399
90400           communityDetail
90401               .each(showCommunityDetails);
90402
90403           communityLinks
90404               .append('div')
90405               .attr('class', 'community-missing')
90406               .text(t('success.missing'))
90407               .append('a')
90408               .attr('class', 'link-out')
90409               .attr('target', '_blank')
90410               .attr('tabindex', -1)
90411               .call(svgIcon('#iD-icon-out-link', 'inline'))
90412               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
90413               .append('span')
90414               .text(t('success.tell_us'));
90415       }
90416
90417
90418       function showCommunityDetails(d) {
90419           var selection = select(this);
90420           var communityID = d.id;
90421           var replacements = {
90422               url: linkify(d.url),
90423               signupUrl: linkify(d.signupUrl || d.url)
90424           };
90425
90426           selection
90427               .append('div')
90428               .attr('class', 'community-name')
90429               .append('a')
90430               .attr('target', '_blank')
90431               .attr('href', d.url)
90432               .text(t('community.' + d.id + '.name'));
90433
90434           var descriptionHTML = t('community.' + d.id + '.description', replacements);
90435
90436           if (d.type === 'reddit') {   // linkify subreddits  #4997
90437               descriptionHTML = descriptionHTML
90438                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
90439           }
90440
90441           selection
90442               .append('div')
90443               .attr('class', 'community-description')
90444               .html(descriptionHTML);
90445
90446           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
90447               selection
90448                   .append('div')
90449                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
90450                       .expanded(false)
90451                       .updatePreference(false)
90452                       .title(t('success.more'))
90453                       .content(showMore)
90454                   );
90455           }
90456
90457           var nextEvents = (d.events || [])
90458               .map(function(event) {
90459                   event.date = parseEventDate(event.when);
90460                   return event;
90461               })
90462               .filter(function(event) {               // date is valid and future (or today)
90463                   var t = event.date.getTime();
90464                   var now = (new Date()).setHours(0,0,0,0);
90465                   return !isNaN(t) && t >= now;
90466               })
90467               .sort(function(a, b) {                  // sort by date ascending
90468                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
90469               })
90470               .slice(0, MAXEVENTS);                   // limit number of events shown
90471
90472           if (nextEvents.length) {
90473               selection
90474                   .append('div')
90475                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
90476                       .expanded(false)
90477                       .updatePreference(false)
90478                       .title(t('success.events'))
90479                       .content(showNextEvents)
90480                   )
90481                   .select('.hide-toggle')
90482                   .append('span')
90483                   .attr('class', 'badge-text')
90484                   .text(nextEvents.length);
90485           }
90486
90487
90488           function showMore(selection) {
90489               var more = selection
90490                   .append('div')
90491                   .attr('class', 'community-more');
90492
90493               if (d.extendedDescription) {
90494                   more
90495                       .append('div')
90496                       .attr('class', 'community-extended-description')
90497                       .html(t('community.' + d.id + '.extendedDescription', replacements));
90498               }
90499
90500               if (d.languageCodes && d.languageCodes.length) {
90501                   more
90502                       .append('div')
90503                       .attr('class', 'community-languages')
90504                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
90505               }
90506           }
90507
90508
90509           function showNextEvents(selection) {
90510               var events = selection
90511                   .append('div')
90512                   .attr('class', 'community-events');
90513
90514               var item = events.selectAll('.community-event')
90515                   .data(nextEvents);
90516
90517               var itemEnter = item.enter()
90518                   .append('div')
90519                   .attr('class', 'community-event');
90520
90521               itemEnter
90522                   .append('div')
90523                   .attr('class', 'community-event-name')
90524                   .append('a')
90525                   .attr('target', '_blank')
90526                   .attr('href', function(d) { return d.url; })
90527                   .text(function(d) {
90528                       var name = d.name;
90529                       if (d.i18n && d.id) {
90530                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
90531                       }
90532                       return name;
90533                   });
90534
90535               itemEnter
90536                   .append('div')
90537                   .attr('class', 'community-event-when')
90538                   .text(function(d) {
90539                       var options = {
90540                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
90541                       };
90542                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
90543                           options.hour = 'numeric';
90544                           options.minute = 'numeric';
90545                       }
90546                       return d.date.toLocaleString(detected.locale, options);
90547                   });
90548
90549               itemEnter
90550                   .append('div')
90551                   .attr('class', 'community-event-where')
90552                   .text(function(d) {
90553                       var where = d.where;
90554                       if (d.i18n && d.id) {
90555                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
90556                       }
90557                       return where;
90558                   });
90559
90560               itemEnter
90561                   .append('div')
90562                   .attr('class', 'community-event-description')
90563                   .text(function(d) {
90564                       var description = d.description;
90565                       if (d.i18n && d.id) {
90566                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
90567                       }
90568                       return description;
90569                   });
90570           }
90571
90572
90573           function linkify(url, text) {
90574               text = text || url;
90575               return '<a target="_blank" href="' + url + '">' + text + '</a>';
90576           }
90577       }
90578
90579
90580       success.changeset = function(_) {
90581           if (!arguments.length) return _changeset;
90582           _changeset = _;
90583           return success;
90584       };
90585
90586
90587       success.location = function(_) {
90588           if (!arguments.length) return _location;
90589           _location = _;
90590           return success;
90591       };
90592
90593
90594       return utilRebind(success, dispatch$1, 'on');
90595   }
90596
90597   function uiViewOnKeepRight() {
90598       var _error;   // a keepright error
90599
90600
90601       function viewOnKeepRight(selection) {
90602           var url;
90603           if (services.keepRight && (_error instanceof qaError)) {
90604               url = services.keepRight.errorURL(_error);
90605           }
90606
90607           var link = selection.selectAll('.view-on-keepRight')
90608               .data(url ? [url] : []);
90609
90610           // exit
90611           link.exit()
90612               .remove();
90613
90614           // enter
90615           var linkEnter = link.enter()
90616               .append('a')
90617               .attr('class', 'view-on-keepRight')
90618               .attr('target', '_blank')
90619               .attr('href', function(d) { return d; })
90620               .call(svgIcon('#iD-icon-out-link', 'inline'));
90621
90622           linkEnter
90623               .append('span')
90624               .text(t('inspector.view_on_keepRight'));
90625       }
90626
90627
90628       viewOnKeepRight.what = function(val) {
90629           if (!arguments.length) return _error;
90630           _error = val;
90631           return viewOnKeepRight;
90632       };
90633
90634       return viewOnKeepRight;
90635   }
90636
90637   function coreHistory(context) {
90638       var dispatch$1 = dispatch('change', 'annotatedChange', 'merge', 'restore', 'undone', 'redone');
90639       var lock = utilSessionMutex('lock');
90640       var duration = 150;
90641       var _imageryUsed = [];
90642       var _checkpoints = {};
90643       var _stack;
90644       var _index;
90645       var _tree;
90646
90647
90648       // internal _act, accepts list of actions and eased time
90649       function _act(actions, t) {
90650           actions = Array.prototype.slice.call(actions);
90651
90652           var annotation;
90653           if (!isFunction(actions[actions.length - 1])) {
90654               annotation = actions.pop();
90655           }
90656
90657           var graph = _stack[_index].graph;
90658           for (var i = 0; i < actions.length; i++) {
90659               graph = actions[i](graph, t);
90660           }
90661
90662           return {
90663               graph: graph,
90664               annotation: annotation,
90665               imageryUsed: _imageryUsed,
90666               transform: context.projection.transform(),
90667               selectedIDs: context.selectedIDs()
90668           };
90669       }
90670
90671
90672       // internal _perform with eased time
90673       function _perform(args, t) {
90674           var previous = _stack[_index].graph;
90675           _stack = _stack.slice(0, _index + 1);
90676           var actionResult = _act(args, t);
90677           _stack.push(actionResult);
90678           _index++;
90679           return change(previous, actionResult.annotation);
90680       }
90681
90682
90683       // internal _replace with eased time
90684       function _replace(args, t) {
90685           var previous = _stack[_index].graph;
90686           // assert(_index == _stack.length - 1)
90687           var actionResult = _act(args, t);
90688           _stack[_index] = actionResult;
90689           return change(previous, actionResult.annotation);
90690       }
90691
90692
90693       // internal _overwrite with eased time
90694       function _overwrite(args, t) {
90695           var previous = _stack[_index].graph;
90696           if (_index > 0) {
90697               _index--;
90698               _stack.pop();
90699           }
90700           _stack = _stack.slice(0, _index + 1);
90701           var actionResult = _act(args, t);
90702           _stack.push(actionResult);
90703           _index++;
90704           return change(previous, actionResult.annotation);
90705       }
90706
90707
90708       // determine difference and dispatch a change event
90709       function change(previous, isAnnotated) {
90710           var difference = coreDifference(previous, history.graph());
90711           dispatch$1.call('change', this, difference);
90712           if (isAnnotated) {
90713               // actions like dragging a node can fire lots of changes,
90714               // so use 'annotatedChange' to listen for grouped undo/redo changes
90715               dispatch$1.call('annotatedChange', this, difference);
90716           }
90717           return difference;
90718       }
90719
90720
90721       // iD uses namespaced keys so multiple installations do not conflict
90722       function getKey(n) {
90723           return 'iD_' + window.location.origin + '_' + n;
90724       }
90725
90726
90727       var history = {
90728
90729           graph: function() {
90730               return _stack[_index].graph;
90731           },
90732
90733
90734           tree: function() {
90735               return _tree;
90736           },
90737
90738
90739           base: function() {
90740               return _stack[0].graph;
90741           },
90742
90743
90744           merge: function(entities, extent) {
90745               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
90746               _tree.rebase(entities, false);
90747
90748               dispatch$1.call('change', this, undefined, extent);
90749               dispatch$1.call('merge', this, entities);
90750           },
90751
90752
90753           perform: function() {
90754               // complete any transition already in progress
90755               select(document).interrupt('history.perform');
90756
90757               var transitionable = false;
90758               var action0 = arguments[0];
90759
90760               if (arguments.length === 1 ||
90761                   arguments.length === 2 && !isFunction(arguments[1])) {
90762                   transitionable = !!action0.transitionable;
90763               }
90764
90765               if (transitionable) {
90766                   var origArguments = arguments;
90767                   select(document)
90768                       .transition('history.perform')
90769                       .duration(duration)
90770                       .ease(linear$1)
90771                       .tween('history.tween', function() {
90772                           return function(t) {
90773                               if (t < 1) _overwrite([action0], t);
90774                           };
90775                       })
90776                       .on('start', function() {
90777                           _perform([action0], 0);
90778                       })
90779                       .on('end interrupt', function() {
90780                           _overwrite(origArguments, 1);
90781                       });
90782
90783               } else {
90784                   return _perform(arguments);
90785               }
90786           },
90787
90788
90789           replace: function() {
90790               select(document).interrupt('history.perform');
90791               return _replace(arguments, 1);
90792           },
90793
90794
90795           // Same as calling pop and then perform
90796           overwrite: function() {
90797               select(document).interrupt('history.perform');
90798               return _overwrite(arguments, 1);
90799           },
90800
90801
90802           pop: function(n) {
90803               select(document).interrupt('history.perform');
90804
90805               var previous = _stack[_index].graph;
90806               if (isNaN(+n) || +n < 0) {
90807                   n = 1;
90808               }
90809               while (n-- > 0 && _index > 0) {
90810                   _index--;
90811                   _stack.pop();
90812               }
90813               return change(previous);
90814           },
90815
90816
90817           // Back to the previous annotated state or _index = 0.
90818           undo: function() {
90819               select(document).interrupt('history.perform');
90820
90821               var previous = _stack[_index].graph;
90822               while (_index > 0) {
90823                   _index--;
90824                   if (_stack[_index].annotation) break;
90825               }
90826
90827               dispatch$1.call('undone', this, _stack[_index]);
90828               return change(previous, true);
90829           },
90830
90831
90832           // Forward to the next annotated state.
90833           redo: function() {
90834               select(document).interrupt('history.perform');
90835
90836               var previous = _stack[_index].graph;
90837               var tryIndex = _index;
90838               while (tryIndex < _stack.length - 1) {
90839                   tryIndex++;
90840                   if (_stack[tryIndex].annotation) {
90841                       _index = tryIndex;
90842                       dispatch$1.call('redone', this, _stack[_index]);
90843                       break;
90844                   }
90845               }
90846
90847               return change(previous, true);
90848           },
90849
90850
90851           undoAnnotation: function() {
90852               var i = _index;
90853               while (i >= 0) {
90854                   if (_stack[i].annotation) return _stack[i].annotation;
90855                   i--;
90856               }
90857           },
90858
90859
90860           redoAnnotation: function() {
90861               var i = _index + 1;
90862               while (i <= _stack.length - 1) {
90863                   if (_stack[i].annotation) return _stack[i].annotation;
90864                   i++;
90865               }
90866           },
90867
90868
90869           intersects: function(extent) {
90870               return _tree.intersects(extent, _stack[_index].graph);
90871           },
90872
90873
90874           difference: function() {
90875               var base = _stack[0].graph;
90876               var head = _stack[_index].graph;
90877               return coreDifference(base, head);
90878           },
90879
90880
90881           changes: function(action) {
90882               var base = _stack[0].graph;
90883               var head = _stack[_index].graph;
90884
90885               if (action) {
90886                   head = action(head);
90887               }
90888
90889               var difference = coreDifference(base, head);
90890
90891               return {
90892                   modified: difference.modified(),
90893                   created: difference.created(),
90894                   deleted: difference.deleted()
90895               };
90896           },
90897
90898
90899           hasChanges: function() {
90900               return this.difference().length() > 0;
90901           },
90902
90903
90904           imageryUsed: function(sources) {
90905               if (sources) {
90906                   _imageryUsed = sources;
90907                   return history;
90908               } else {
90909                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
90910                   return without(uniq(flatten(arr)), 'Custom');
90911               }
90912           },
90913
90914
90915           // save the current history state
90916           checkpoint: function(key) {
90917               _checkpoints[key] = {
90918                   stack: cloneDeep(_stack),
90919                   index: _index
90920               };
90921               return history;
90922           },
90923
90924
90925           // restore history state to a given checkpoint or reset completely
90926           reset: function(key) {
90927               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
90928                   _stack = cloneDeep(_checkpoints[key].stack);
90929                   _index = _checkpoints[key].index;
90930               } else {
90931                   _stack = [{graph: coreGraph()}];
90932                   _index = 0;
90933                   _tree = coreTree(_stack[0].graph);
90934                   _checkpoints = {};
90935               }
90936               dispatch$1.call('change');
90937               return history;
90938           },
90939
90940
90941           toIntroGraph: function() {
90942               var nextId = { n: 0, r: 0, w: 0 };
90943               var permIds = {};
90944               var graph = this.graph();
90945               var baseEntities = {};
90946
90947               // clone base entities..
90948               forEach(graph.base().entities, function(entity) {
90949                   var copy = cloneDeepWith(entity, customizer);
90950                   baseEntities[copy.id] = copy;
90951               });
90952
90953               // replace base entities with head entities..
90954               forEach(graph.entities, function(entity, id) {
90955                   if (entity) {
90956                       var copy = cloneDeepWith(entity, customizer);
90957                       baseEntities[copy.id] = copy;
90958                   } else {
90959                       delete baseEntities[id];
90960                   }
90961               });
90962
90963               // swap temporary for permanent ids..
90964               forEach(baseEntities, function(entity) {
90965                   if (Array.isArray(entity.nodes)) {
90966                       entity.nodes = entity.nodes.map(function(node) {
90967                           return permIds[node] || node;
90968                       });
90969                   }
90970                   if (Array.isArray(entity.members)) {
90971                       entity.members = entity.members.map(function(member) {
90972                           member.id = permIds[member.id] || member.id;
90973                           return member;
90974                       });
90975                   }
90976               });
90977
90978               return JSON.stringify({ dataIntroGraph: baseEntities });
90979
90980
90981               function customizer(src) {
90982                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
90983                   if (isEmpty(copy.tags)) {
90984                       delete copy.tags;
90985                   }
90986
90987                   if (Array.isArray(copy.loc)) {
90988                       copy.loc[0] = +copy.loc[0].toFixed(6);
90989                       copy.loc[1] = +copy.loc[1].toFixed(6);
90990                   }
90991
90992                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
90993                   if (match !== null) {
90994                       var nrw = match[1], permId;
90995                       do { permId = nrw + (++nextId[nrw]); }
90996                       while (baseEntities.hasOwnProperty(permId));
90997
90998                       copy.id = permIds[src.id] = permId;
90999                   }
91000                   return copy;
91001               }
91002           },
91003
91004
91005           toJSON: function() {
91006               if (!this.hasChanges()) return;
91007
91008               var allEntities = {};
91009               var baseEntities = {};
91010               var base = _stack[0];
91011
91012               var s = _stack.map(function(i) {
91013                   var modified = [];
91014                   var deleted = [];
91015
91016                   forEach(i.graph.entities, function(entity, id) {
91017                       if (entity) {
91018                           var key = osmEntity.key(entity);
91019                           allEntities[key] = entity;
91020                           modified.push(key);
91021                       } else {
91022                           deleted.push(id);
91023                       }
91024
91025                       // make sure that the originals of changed or deleted entities get merged
91026                       // into the base of the _stack after restoring the data from JSON.
91027                       if (id in base.graph.entities) {
91028                           baseEntities[id] = base.graph.entities[id];
91029                       }
91030                       if (entity && entity.nodes) {
91031                           // get originals of pre-existing child nodes
91032                           forEach(entity.nodes, function(nodeId) {
91033                               if (nodeId in base.graph.entities) {
91034                                   baseEntities[nodeId] = base.graph.entities[nodeId];
91035                               }
91036                           });
91037                       }
91038                       // get originals of parent entities too
91039                       forEach(base.graph._parentWays[id], function(parentId) {
91040                           if (parentId in base.graph.entities) {
91041                               baseEntities[parentId] = base.graph.entities[parentId];
91042                           }
91043                       });
91044                   });
91045
91046                   var x = {};
91047
91048                   if (modified.length) x.modified = modified;
91049                   if (deleted.length) x.deleted = deleted;
91050                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
91051                   if (i.annotation) x.annotation = i.annotation;
91052                   if (i.transform) x.transform = i.transform;
91053                   if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
91054
91055                   return x;
91056               });
91057
91058               return JSON.stringify({
91059                   version: 3,
91060                   entities: values$1(allEntities),
91061                   baseEntities: values$1(baseEntities),
91062                   stack: s,
91063                   nextIDs: osmEntity.id.next,
91064                   index: _index
91065               });
91066           },
91067
91068
91069           fromJSON: function(json, loadChildNodes) {
91070               var h = JSON.parse(json);
91071               var loadComplete = true;
91072
91073               osmEntity.id.next = h.nextIDs;
91074               _index = h.index;
91075
91076               if (h.version === 2 || h.version === 3) {
91077                   var allEntities = {};
91078
91079                   h.entities.forEach(function(entity) {
91080                       allEntities[osmEntity.key(entity)] = osmEntity(entity);
91081                   });
91082
91083                   if (h.version === 3) {
91084                       // This merges originals for changed entities into the base of
91085                       // the _stack even if the current _stack doesn't have them (for
91086                       // example when iD has been restarted in a different region)
91087                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
91088                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
91089                       _tree.rebase(baseEntities, true);
91090
91091                       // When we restore a modified way, we also need to fetch any missing
91092                       // childnodes that would normally have been downloaded with it.. #2142
91093                       if (loadChildNodes) {
91094                           var osm = context.connection();
91095                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
91096                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
91097
91098                           if (!isEmpty(missing) && osm) {
91099                               loadComplete = false;
91100                               context.redrawEnable(false);
91101
91102                               var loading = uiLoading(context).blocking(true);
91103                               context.container().call(loading);
91104
91105                               var childNodesLoaded = function(err, result) {
91106                                   if (!err) {
91107                                       var visible = groupBy(result.data, 'visible');
91108                                       if (!isEmpty(visible.true)) {
91109                                           missing = difference(missing, map$3(visible.true, 'id'));
91110                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
91111                                           _tree.rebase(visible.true, true);
91112                                       }
91113
91114                                       // fetch older versions of nodes that were deleted..
91115                                       forEach(visible.false, function(entity) {
91116                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
91117                                       });
91118                                   }
91119
91120                                   if (err || isEmpty(missing)) {
91121                                       loading.close();
91122                                       context.redrawEnable(true);
91123                                       dispatch$1.call('change');
91124                                       dispatch$1.call('restore', this);
91125                                   }
91126                               };
91127
91128                               osm.loadMultiple(missing, childNodesLoaded);
91129                           }
91130                       }
91131                   }
91132
91133                   _stack = h.stack.map(function(d) {
91134                       var entities = {}, entity;
91135
91136                       if (d.modified) {
91137                           d.modified.forEach(function(key) {
91138                               entity = allEntities[key];
91139                               entities[entity.id] = entity;
91140                           });
91141                       }
91142
91143                       if (d.deleted) {
91144                           d.deleted.forEach(function(id) {
91145                               entities[id] = undefined;
91146                           });
91147                       }
91148
91149                       return {
91150                           graph: coreGraph(_stack[0].graph).load(entities),
91151                           annotation: d.annotation,
91152                           imageryUsed: d.imageryUsed,
91153                           transform: d.transform,
91154                           selectedIDs: d.selectedIDs
91155                       };
91156                   });
91157
91158               } else { // original version
91159                   _stack = h.stack.map(function(d) {
91160                       var entities = {};
91161
91162                       for (var i in d.entities) {
91163                           var entity = d.entities[i];
91164                           entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
91165                       }
91166
91167                       d.graph = coreGraph(_stack[0].graph).load(entities);
91168                       return d;
91169                   });
91170               }
91171
91172               var transform = _stack[_index].transform;
91173               if (transform) {
91174                   context.map().transformEase(transform, 0);   // 0 = immediate, no easing
91175               }
91176
91177               if (loadComplete) {
91178                   dispatch$1.call('change');
91179                   dispatch$1.call('restore', this);
91180               }
91181
91182               return history;
91183           },
91184
91185
91186           save: function() {
91187               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
91188               return history;
91189           },
91190
91191
91192           clearSaved: function() {
91193               context.debouncedSave.cancel();
91194               if (lock.locked()) context.storage(getKey('saved_history'), null);
91195               return history;
91196           },
91197
91198
91199           lock: function() {
91200               return lock.lock();
91201           },
91202
91203
91204           unlock: function() {
91205               lock.unlock();
91206           },
91207
91208
91209           // is iD not open in another window and it detects that
91210           // there's a history stored in localStorage that's recoverable?
91211           restorableChanges: function() {
91212               return lock.locked() && !!context.storage(getKey('saved_history'));
91213           },
91214
91215
91216           // load history from a version stored in localStorage
91217           restore: function() {
91218               if (!lock.locked()) return;
91219
91220               var json = context.storage(getKey('saved_history'));
91221               if (json) history.fromJSON(json, true);
91222           },
91223
91224
91225           _getKey: getKey
91226
91227       };
91228
91229
91230       history.reset();
91231
91232       return utilRebind(history, dispatch$1, 'on');
91233   }
91234
91235   /** Used to store function metadata. */
91236   var metaMap = WeakMap && new WeakMap;
91237
91238   /**
91239    * The base implementation of `setData` without support for hot loop shorting.
91240    *
91241    * @private
91242    * @param {Function} func The function to associate metadata with.
91243    * @param {*} data The metadata.
91244    * @returns {Function} Returns `func`.
91245    */
91246   var baseSetData = !metaMap ? identity$8 : function(func, data) {
91247     metaMap.set(func, data);
91248     return func;
91249   };
91250
91251   /**
91252    * Creates a function that produces an instance of `Ctor` regardless of
91253    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
91254    *
91255    * @private
91256    * @param {Function} Ctor The constructor to wrap.
91257    * @returns {Function} Returns the new wrapped function.
91258    */
91259   function createCtor(Ctor) {
91260     return function() {
91261       // Use a `switch` statement to work with class constructors. See
91262       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
91263       // for more details.
91264       var args = arguments;
91265       switch (args.length) {
91266         case 0: return new Ctor;
91267         case 1: return new Ctor(args[0]);
91268         case 2: return new Ctor(args[0], args[1]);
91269         case 3: return new Ctor(args[0], args[1], args[2]);
91270         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
91271         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
91272         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
91273         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
91274       }
91275       var thisBinding = baseCreate(Ctor.prototype),
91276           result = Ctor.apply(thisBinding, args);
91277
91278       // Mimic the constructor's `return` behavior.
91279       // See https://es5.github.io/#x13.2.2 for more details.
91280       return isObject(result) ? result : thisBinding;
91281     };
91282   }
91283
91284   /** Used to compose bitmasks for function metadata. */
91285   var WRAP_BIND_FLAG = 1;
91286
91287   /**
91288    * Creates a function that wraps `func` to invoke it with the optional `this`
91289    * binding of `thisArg`.
91290    *
91291    * @private
91292    * @param {Function} func The function to wrap.
91293    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91294    * @param {*} [thisArg] The `this` binding of `func`.
91295    * @returns {Function} Returns the new wrapped function.
91296    */
91297   function createBind(func, bitmask, thisArg) {
91298     var isBind = bitmask & WRAP_BIND_FLAG,
91299         Ctor = createCtor(func);
91300
91301     function wrapper() {
91302       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
91303       return fn.apply(isBind ? thisArg : this, arguments);
91304     }
91305     return wrapper;
91306   }
91307
91308   /* Built-in method references for those with the same name as other `lodash` methods. */
91309   var nativeMax$5 = Math.max;
91310
91311   /**
91312    * Creates an array that is the composition of partially applied arguments,
91313    * placeholders, and provided arguments into a single array of arguments.
91314    *
91315    * @private
91316    * @param {Array} args The provided arguments.
91317    * @param {Array} partials The arguments to prepend to those provided.
91318    * @param {Array} holders The `partials` placeholder indexes.
91319    * @params {boolean} [isCurried] Specify composing for a curried function.
91320    * @returns {Array} Returns the new array of composed arguments.
91321    */
91322   function composeArgs(args, partials, holders, isCurried) {
91323     var argsIndex = -1,
91324         argsLength = args.length,
91325         holdersLength = holders.length,
91326         leftIndex = -1,
91327         leftLength = partials.length,
91328         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
91329         result = Array(leftLength + rangeLength),
91330         isUncurried = !isCurried;
91331
91332     while (++leftIndex < leftLength) {
91333       result[leftIndex] = partials[leftIndex];
91334     }
91335     while (++argsIndex < holdersLength) {
91336       if (isUncurried || argsIndex < argsLength) {
91337         result[holders[argsIndex]] = args[argsIndex];
91338       }
91339     }
91340     while (rangeLength--) {
91341       result[leftIndex++] = args[argsIndex++];
91342     }
91343     return result;
91344   }
91345
91346   /* Built-in method references for those with the same name as other `lodash` methods. */
91347   var nativeMax$6 = Math.max;
91348
91349   /**
91350    * This function is like `composeArgs` except that the arguments composition
91351    * is tailored for `_.partialRight`.
91352    *
91353    * @private
91354    * @param {Array} args The provided arguments.
91355    * @param {Array} partials The arguments to append to those provided.
91356    * @param {Array} holders The `partials` placeholder indexes.
91357    * @params {boolean} [isCurried] Specify composing for a curried function.
91358    * @returns {Array} Returns the new array of composed arguments.
91359    */
91360   function composeArgsRight(args, partials, holders, isCurried) {
91361     var argsIndex = -1,
91362         argsLength = args.length,
91363         holdersIndex = -1,
91364         holdersLength = holders.length,
91365         rightIndex = -1,
91366         rightLength = partials.length,
91367         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
91368         result = Array(rangeLength + rightLength),
91369         isUncurried = !isCurried;
91370
91371     while (++argsIndex < rangeLength) {
91372       result[argsIndex] = args[argsIndex];
91373     }
91374     var offset = argsIndex;
91375     while (++rightIndex < rightLength) {
91376       result[offset + rightIndex] = partials[rightIndex];
91377     }
91378     while (++holdersIndex < holdersLength) {
91379       if (isUncurried || argsIndex < argsLength) {
91380         result[offset + holders[holdersIndex]] = args[argsIndex++];
91381       }
91382     }
91383     return result;
91384   }
91385
91386   /**
91387    * Gets the number of `placeholder` occurrences in `array`.
91388    *
91389    * @private
91390    * @param {Array} array The array to inspect.
91391    * @param {*} placeholder The placeholder to search for.
91392    * @returns {number} Returns the placeholder count.
91393    */
91394   function countHolders(array, placeholder) {
91395     var length = array.length,
91396         result = 0;
91397
91398     while (length--) {
91399       if (array[length] === placeholder) {
91400         ++result;
91401       }
91402     }
91403     return result;
91404   }
91405
91406   /**
91407    * The function whose prototype chain sequence wrappers inherit from.
91408    *
91409    * @private
91410    */
91411   function baseLodash() {
91412     // No operation performed.
91413   }
91414
91415   /** Used as references for the maximum length and index of an array. */
91416   var MAX_ARRAY_LENGTH = 4294967295;
91417
91418   /**
91419    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
91420    *
91421    * @private
91422    * @constructor
91423    * @param {*} value The value to wrap.
91424    */
91425   function LazyWrapper(value) {
91426     this.__wrapped__ = value;
91427     this.__actions__ = [];
91428     this.__dir__ = 1;
91429     this.__filtered__ = false;
91430     this.__iteratees__ = [];
91431     this.__takeCount__ = MAX_ARRAY_LENGTH;
91432     this.__views__ = [];
91433   }
91434
91435   // Ensure `LazyWrapper` is an instance of `baseLodash`.
91436   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
91437   LazyWrapper.prototype.constructor = LazyWrapper;
91438
91439   /**
91440    * Gets metadata for `func`.
91441    *
91442    * @private
91443    * @param {Function} func The function to query.
91444    * @returns {*} Returns the metadata for `func`.
91445    */
91446   var getData = !metaMap ? noop$3 : function(func) {
91447     return metaMap.get(func);
91448   };
91449
91450   /** Used to lookup unminified function names. */
91451   var realNames = {};
91452
91453   /** Used for built-in method references. */
91454   var objectProto$k = Object.prototype;
91455
91456   /** Used to check objects for own properties. */
91457   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
91458
91459   /**
91460    * Gets the name of `func`.
91461    *
91462    * @private
91463    * @param {Function} func The function to query.
91464    * @returns {string} Returns the function name.
91465    */
91466   function getFuncName(func) {
91467     var result = (func.name + ''),
91468         array = realNames[result],
91469         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
91470
91471     while (length--) {
91472       var data = array[length],
91473           otherFunc = data.func;
91474       if (otherFunc == null || otherFunc == func) {
91475         return data.name;
91476       }
91477     }
91478     return result;
91479   }
91480
91481   /**
91482    * The base constructor for creating `lodash` wrapper objects.
91483    *
91484    * @private
91485    * @param {*} value The value to wrap.
91486    * @param {boolean} [chainAll] Enable explicit method chain sequences.
91487    */
91488   function LodashWrapper(value, chainAll) {
91489     this.__wrapped__ = value;
91490     this.__actions__ = [];
91491     this.__chain__ = !!chainAll;
91492     this.__index__ = 0;
91493     this.__values__ = undefined;
91494   }
91495
91496   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
91497   LodashWrapper.prototype.constructor = LodashWrapper;
91498
91499   /**
91500    * Creates a clone of `wrapper`.
91501    *
91502    * @private
91503    * @param {Object} wrapper The wrapper to clone.
91504    * @returns {Object} Returns the cloned wrapper.
91505    */
91506   function wrapperClone(wrapper) {
91507     if (wrapper instanceof LazyWrapper) {
91508       return wrapper.clone();
91509     }
91510     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
91511     result.__actions__ = copyArray(wrapper.__actions__);
91512     result.__index__  = wrapper.__index__;
91513     result.__values__ = wrapper.__values__;
91514     return result;
91515   }
91516
91517   /** Used for built-in method references. */
91518   var objectProto$l = Object.prototype;
91519
91520   /** Used to check objects for own properties. */
91521   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
91522
91523   /**
91524    * Creates a `lodash` object which wraps `value` to enable implicit method
91525    * chain sequences. Methods that operate on and return arrays, collections,
91526    * and functions can be chained together. Methods that retrieve a single value
91527    * or may return a primitive value will automatically end the chain sequence
91528    * and return the unwrapped value. Otherwise, the value must be unwrapped
91529    * with `_#value`.
91530    *
91531    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
91532    * enabled using `_.chain`.
91533    *
91534    * The execution of chained methods is lazy, that is, it's deferred until
91535    * `_#value` is implicitly or explicitly called.
91536    *
91537    * Lazy evaluation allows several methods to support shortcut fusion.
91538    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
91539    * the creation of intermediate arrays and can greatly reduce the number of
91540    * iteratee executions. Sections of a chain sequence qualify for shortcut
91541    * fusion if the section is applied to an array and iteratees accept only
91542    * one argument. The heuristic for whether a section qualifies for shortcut
91543    * fusion is subject to change.
91544    *
91545    * Chaining is supported in custom builds as long as the `_#value` method is
91546    * directly or indirectly included in the build.
91547    *
91548    * In addition to lodash methods, wrappers have `Array` and `String` methods.
91549    *
91550    * The wrapper `Array` methods are:
91551    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
91552    *
91553    * The wrapper `String` methods are:
91554    * `replace` and `split`
91555    *
91556    * The wrapper methods that support shortcut fusion are:
91557    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
91558    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
91559    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
91560    *
91561    * The chainable wrapper methods are:
91562    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
91563    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
91564    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
91565    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
91566    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
91567    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
91568    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
91569    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
91570    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
91571    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
91572    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
91573    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
91574    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
91575    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
91576    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
91577    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
91578    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
91579    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
91580    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
91581    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
91582    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
91583    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
91584    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
91585    * `zipObject`, `zipObjectDeep`, and `zipWith`
91586    *
91587    * The wrapper methods that are **not** chainable by default are:
91588    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
91589    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
91590    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
91591    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
91592    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
91593    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
91594    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
91595    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
91596    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
91597    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
91598    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
91599    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
91600    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
91601    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
91602    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
91603    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
91604    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
91605    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
91606    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
91607    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
91608    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
91609    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
91610    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
91611    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
91612    * `upperFirst`, `value`, and `words`
91613    *
91614    * @name _
91615    * @constructor
91616    * @category Seq
91617    * @param {*} value The value to wrap in a `lodash` instance.
91618    * @returns {Object} Returns the new `lodash` wrapper instance.
91619    * @example
91620    *
91621    * function square(n) {
91622    *   return n * n;
91623    * }
91624    *
91625    * var wrapped = _([1, 2, 3]);
91626    *
91627    * // Returns an unwrapped value.
91628    * wrapped.reduce(_.add);
91629    * // => 6
91630    *
91631    * // Returns a wrapped value.
91632    * var squares = wrapped.map(square);
91633    *
91634    * _.isArray(squares);
91635    * // => false
91636    *
91637    * _.isArray(squares.value());
91638    * // => true
91639    */
91640   function lodash(value) {
91641     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
91642       if (value instanceof LodashWrapper) {
91643         return value;
91644       }
91645       if (hasOwnProperty$i.call(value, '__wrapped__')) {
91646         return wrapperClone(value);
91647       }
91648     }
91649     return new LodashWrapper(value);
91650   }
91651
91652   // Ensure wrappers are instances of `baseLodash`.
91653   lodash.prototype = baseLodash.prototype;
91654   lodash.prototype.constructor = lodash;
91655
91656   /**
91657    * Checks if `func` has a lazy counterpart.
91658    *
91659    * @private
91660    * @param {Function} func The function to check.
91661    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
91662    *  else `false`.
91663    */
91664   function isLaziable(func) {
91665     var funcName = getFuncName(func),
91666         other = lodash[funcName];
91667
91668     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
91669       return false;
91670     }
91671     if (func === other) {
91672       return true;
91673     }
91674     var data = getData(other);
91675     return !!data && func === data[0];
91676   }
91677
91678   /**
91679    * Sets metadata for `func`.
91680    *
91681    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
91682    * period of time, it will trip its breaker and transition to an identity
91683    * function to avoid garbage collection pauses in V8. See
91684    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
91685    * for more details.
91686    *
91687    * @private
91688    * @param {Function} func The function to associate metadata with.
91689    * @param {*} data The metadata.
91690    * @returns {Function} Returns `func`.
91691    */
91692   var setData = shortOut(baseSetData);
91693
91694   /** Used to match wrap detail comments. */
91695   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
91696       reSplitDetails = /,? & /;
91697
91698   /**
91699    * Extracts wrapper details from the `source` body comment.
91700    *
91701    * @private
91702    * @param {string} source The source to inspect.
91703    * @returns {Array} Returns the wrapper details.
91704    */
91705   function getWrapDetails(source) {
91706     var match = source.match(reWrapDetails);
91707     return match ? match[1].split(reSplitDetails) : [];
91708   }
91709
91710   /** Used to match wrap detail comments. */
91711   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
91712
91713   /**
91714    * Inserts wrapper `details` in a comment at the top of the `source` body.
91715    *
91716    * @private
91717    * @param {string} source The source to modify.
91718    * @returns {Array} details The details to insert.
91719    * @returns {string} Returns the modified source.
91720    */
91721   function insertWrapDetails(source, details) {
91722     var length = details.length;
91723     if (!length) {
91724       return source;
91725     }
91726     var lastIndex = length - 1;
91727     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
91728     details = details.join(length > 2 ? ', ' : ' ');
91729     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
91730   }
91731
91732   /** Used to compose bitmasks for function metadata. */
91733   var WRAP_BIND_FLAG$1 = 1,
91734       WRAP_BIND_KEY_FLAG = 2,
91735       WRAP_CURRY_FLAG = 8,
91736       WRAP_CURRY_RIGHT_FLAG = 16,
91737       WRAP_PARTIAL_FLAG = 32,
91738       WRAP_PARTIAL_RIGHT_FLAG = 64,
91739       WRAP_ARY_FLAG = 128,
91740       WRAP_REARG_FLAG = 256,
91741       WRAP_FLIP_FLAG = 512;
91742
91743   /** Used to associate wrap methods with their bit flags. */
91744   var wrapFlags = [
91745     ['ary', WRAP_ARY_FLAG],
91746     ['bind', WRAP_BIND_FLAG$1],
91747     ['bindKey', WRAP_BIND_KEY_FLAG],
91748     ['curry', WRAP_CURRY_FLAG],
91749     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
91750     ['flip', WRAP_FLIP_FLAG],
91751     ['partial', WRAP_PARTIAL_FLAG],
91752     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
91753     ['rearg', WRAP_REARG_FLAG]
91754   ];
91755
91756   /**
91757    * Updates wrapper `details` based on `bitmask` flags.
91758    *
91759    * @private
91760    * @returns {Array} details The details to modify.
91761    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91762    * @returns {Array} Returns `details`.
91763    */
91764   function updateWrapDetails(details, bitmask) {
91765     arrayEach(wrapFlags, function(pair) {
91766       var value = '_.' + pair[0];
91767       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
91768         details.push(value);
91769       }
91770     });
91771     return details.sort();
91772   }
91773
91774   /**
91775    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
91776    * with wrapper details in a comment at the top of the source body.
91777    *
91778    * @private
91779    * @param {Function} wrapper The function to modify.
91780    * @param {Function} reference The reference function.
91781    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91782    * @returns {Function} Returns `wrapper`.
91783    */
91784   function setWrapToString(wrapper, reference, bitmask) {
91785     var source = (reference + '');
91786     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
91787   }
91788
91789   /** Used to compose bitmasks for function metadata. */
91790   var WRAP_BIND_FLAG$2 = 1,
91791       WRAP_BIND_KEY_FLAG$1 = 2,
91792       WRAP_CURRY_BOUND_FLAG = 4,
91793       WRAP_CURRY_FLAG$1 = 8,
91794       WRAP_PARTIAL_FLAG$1 = 32,
91795       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
91796
91797   /**
91798    * Creates a function that wraps `func` to continue currying.
91799    *
91800    * @private
91801    * @param {Function} func The function to wrap.
91802    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91803    * @param {Function} wrapFunc The function to create the `func` wrapper.
91804    * @param {*} placeholder The placeholder value.
91805    * @param {*} [thisArg] The `this` binding of `func`.
91806    * @param {Array} [partials] The arguments to prepend to those provided to
91807    *  the new function.
91808    * @param {Array} [holders] The `partials` placeholder indexes.
91809    * @param {Array} [argPos] The argument positions of the new function.
91810    * @param {number} [ary] The arity cap of `func`.
91811    * @param {number} [arity] The arity of `func`.
91812    * @returns {Function} Returns the new wrapped function.
91813    */
91814   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
91815     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
91816         newHolders = isCurry ? holders : undefined,
91817         newHoldersRight = isCurry ? undefined : holders,
91818         newPartials = isCurry ? partials : undefined,
91819         newPartialsRight = isCurry ? undefined : partials;
91820
91821     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
91822     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
91823
91824     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
91825       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
91826     }
91827     var newData = [
91828       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
91829       newHoldersRight, argPos, ary, arity
91830     ];
91831
91832     var result = wrapFunc.apply(undefined, newData);
91833     if (isLaziable(func)) {
91834       setData(result, newData);
91835     }
91836     result.placeholder = placeholder;
91837     return setWrapToString(result, func, bitmask);
91838   }
91839
91840   /**
91841    * Gets the argument placeholder value for `func`.
91842    *
91843    * @private
91844    * @param {Function} func The function to inspect.
91845    * @returns {*} Returns the placeholder value.
91846    */
91847   function getHolder(func) {
91848     var object = func;
91849     return object.placeholder;
91850   }
91851
91852   /* Built-in method references for those with the same name as other `lodash` methods. */
91853   var nativeMin$2 = Math.min;
91854
91855   /**
91856    * Reorder `array` according to the specified indexes where the element at
91857    * the first index is assigned as the first element, the element at
91858    * the second index is assigned as the second element, and so on.
91859    *
91860    * @private
91861    * @param {Array} array The array to reorder.
91862    * @param {Array} indexes The arranged array indexes.
91863    * @returns {Array} Returns `array`.
91864    */
91865   function reorder(array, indexes) {
91866     var arrLength = array.length,
91867         length = nativeMin$2(indexes.length, arrLength),
91868         oldArray = copyArray(array);
91869
91870     while (length--) {
91871       var index = indexes[length];
91872       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
91873     }
91874     return array;
91875   }
91876
91877   /** Used as the internal argument placeholder. */
91878   var PLACEHOLDER = '__lodash_placeholder__';
91879
91880   /**
91881    * Replaces all `placeholder` elements in `array` with an internal placeholder
91882    * and returns an array of their indexes.
91883    *
91884    * @private
91885    * @param {Array} array The array to modify.
91886    * @param {*} placeholder The placeholder to replace.
91887    * @returns {Array} Returns the new array of placeholder indexes.
91888    */
91889   function replaceHolders(array, placeholder) {
91890     var index = -1,
91891         length = array.length,
91892         resIndex = 0,
91893         result = [];
91894
91895     while (++index < length) {
91896       var value = array[index];
91897       if (value === placeholder || value === PLACEHOLDER) {
91898         array[index] = PLACEHOLDER;
91899         result[resIndex++] = index;
91900       }
91901     }
91902     return result;
91903   }
91904
91905   /** Used to compose bitmasks for function metadata. */
91906   var WRAP_BIND_FLAG$3 = 1,
91907       WRAP_BIND_KEY_FLAG$2 = 2,
91908       WRAP_CURRY_FLAG$2 = 8,
91909       WRAP_CURRY_RIGHT_FLAG$1 = 16,
91910       WRAP_ARY_FLAG$1 = 128,
91911       WRAP_FLIP_FLAG$1 = 512;
91912
91913   /**
91914    * Creates a function that wraps `func` to invoke it with optional `this`
91915    * binding of `thisArg`, partial application, and currying.
91916    *
91917    * @private
91918    * @param {Function|string} func The function or method name to wrap.
91919    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91920    * @param {*} [thisArg] The `this` binding of `func`.
91921    * @param {Array} [partials] The arguments to prepend to those provided to
91922    *  the new function.
91923    * @param {Array} [holders] The `partials` placeholder indexes.
91924    * @param {Array} [partialsRight] The arguments to append to those provided
91925    *  to the new function.
91926    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
91927    * @param {Array} [argPos] The argument positions of the new function.
91928    * @param {number} [ary] The arity cap of `func`.
91929    * @param {number} [arity] The arity of `func`.
91930    * @returns {Function} Returns the new wrapped function.
91931    */
91932   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
91933     var isAry = bitmask & WRAP_ARY_FLAG$1,
91934         isBind = bitmask & WRAP_BIND_FLAG$3,
91935         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
91936         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
91937         isFlip = bitmask & WRAP_FLIP_FLAG$1,
91938         Ctor = isBindKey ? undefined : createCtor(func);
91939
91940     function wrapper() {
91941       var length = arguments.length,
91942           args = Array(length),
91943           index = length;
91944
91945       while (index--) {
91946         args[index] = arguments[index];
91947       }
91948       if (isCurried) {
91949         var placeholder = getHolder(wrapper),
91950             holdersCount = countHolders(args, placeholder);
91951       }
91952       if (partials) {
91953         args = composeArgs(args, partials, holders, isCurried);
91954       }
91955       if (partialsRight) {
91956         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
91957       }
91958       length -= holdersCount;
91959       if (isCurried && length < arity) {
91960         var newHolders = replaceHolders(args, placeholder);
91961         return createRecurry(
91962           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
91963           args, newHolders, argPos, ary, arity - length
91964         );
91965       }
91966       var thisBinding = isBind ? thisArg : this,
91967           fn = isBindKey ? thisBinding[func] : func;
91968
91969       length = args.length;
91970       if (argPos) {
91971         args = reorder(args, argPos);
91972       } else if (isFlip && length > 1) {
91973         args.reverse();
91974       }
91975       if (isAry && ary < length) {
91976         args.length = ary;
91977       }
91978       if (this && this !== root$2 && this instanceof wrapper) {
91979         fn = Ctor || createCtor(fn);
91980       }
91981       return fn.apply(thisBinding, args);
91982     }
91983     return wrapper;
91984   }
91985
91986   /**
91987    * Creates a function that wraps `func` to enable currying.
91988    *
91989    * @private
91990    * @param {Function} func The function to wrap.
91991    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
91992    * @param {number} arity The arity of `func`.
91993    * @returns {Function} Returns the new wrapped function.
91994    */
91995   function createCurry(func, bitmask, arity) {
91996     var Ctor = createCtor(func);
91997
91998     function wrapper() {
91999       var length = arguments.length,
92000           args = Array(length),
92001           index = length,
92002           placeholder = getHolder(wrapper);
92003
92004       while (index--) {
92005         args[index] = arguments[index];
92006       }
92007       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
92008         ? []
92009         : replaceHolders(args, placeholder);
92010
92011       length -= holders.length;
92012       if (length < arity) {
92013         return createRecurry(
92014           func, bitmask, createHybrid, wrapper.placeholder, undefined,
92015           args, holders, undefined, undefined, arity - length);
92016       }
92017       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
92018       return apply(fn, this, args);
92019     }
92020     return wrapper;
92021   }
92022
92023   /** Used to compose bitmasks for function metadata. */
92024   var WRAP_BIND_FLAG$4 = 1;
92025
92026   /**
92027    * Creates a function that wraps `func` to invoke it with the `this` binding
92028    * of `thisArg` and `partials` prepended to the arguments it receives.
92029    *
92030    * @private
92031    * @param {Function} func The function to wrap.
92032    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
92033    * @param {*} thisArg The `this` binding of `func`.
92034    * @param {Array} partials The arguments to prepend to those provided to
92035    *  the new function.
92036    * @returns {Function} Returns the new wrapped function.
92037    */
92038   function createPartial(func, bitmask, thisArg, partials) {
92039     var isBind = bitmask & WRAP_BIND_FLAG$4,
92040         Ctor = createCtor(func);
92041
92042     function wrapper() {
92043       var argsIndex = -1,
92044           argsLength = arguments.length,
92045           leftIndex = -1,
92046           leftLength = partials.length,
92047           args = Array(leftLength + argsLength),
92048           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
92049
92050       while (++leftIndex < leftLength) {
92051         args[leftIndex] = partials[leftIndex];
92052       }
92053       while (argsLength--) {
92054         args[leftIndex++] = arguments[++argsIndex];
92055       }
92056       return apply(fn, isBind ? thisArg : this, args);
92057     }
92058     return wrapper;
92059   }
92060
92061   /** Used as the internal argument placeholder. */
92062   var PLACEHOLDER$1 = '__lodash_placeholder__';
92063
92064   /** Used to compose bitmasks for function metadata. */
92065   var WRAP_BIND_FLAG$5 = 1,
92066       WRAP_BIND_KEY_FLAG$3 = 2,
92067       WRAP_CURRY_BOUND_FLAG$1 = 4,
92068       WRAP_CURRY_FLAG$3 = 8,
92069       WRAP_ARY_FLAG$2 = 128,
92070       WRAP_REARG_FLAG$1 = 256;
92071
92072   /* Built-in method references for those with the same name as other `lodash` methods. */
92073   var nativeMin$3 = Math.min;
92074
92075   /**
92076    * Merges the function metadata of `source` into `data`.
92077    *
92078    * Merging metadata reduces the number of wrappers used to invoke a function.
92079    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
92080    * may be applied regardless of execution order. Methods like `_.ary` and
92081    * `_.rearg` modify function arguments, making the order in which they are
92082    * executed important, preventing the merging of metadata. However, we make
92083    * an exception for a safe combined case where curried functions have `_.ary`
92084    * and or `_.rearg` applied.
92085    *
92086    * @private
92087    * @param {Array} data The destination metadata.
92088    * @param {Array} source The source metadata.
92089    * @returns {Array} Returns `data`.
92090    */
92091   function mergeData(data, source) {
92092     var bitmask = data[1],
92093         srcBitmask = source[1],
92094         newBitmask = bitmask | srcBitmask,
92095         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
92096
92097     var isCombo =
92098       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
92099       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
92100       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
92101
92102     // Exit early if metadata can't be merged.
92103     if (!(isCommon || isCombo)) {
92104       return data;
92105     }
92106     // Use source `thisArg` if available.
92107     if (srcBitmask & WRAP_BIND_FLAG$5) {
92108       data[2] = source[2];
92109       // Set when currying a bound function.
92110       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
92111     }
92112     // Compose partial arguments.
92113     var value = source[3];
92114     if (value) {
92115       var partials = data[3];
92116       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
92117       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
92118     }
92119     // Compose partial right arguments.
92120     value = source[5];
92121     if (value) {
92122       partials = data[5];
92123       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
92124       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
92125     }
92126     // Use source `argPos` if available.
92127     value = source[7];
92128     if (value) {
92129       data[7] = value;
92130     }
92131     // Use source `ary` if it's smaller.
92132     if (srcBitmask & WRAP_ARY_FLAG$2) {
92133       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
92134     }
92135     // Use source `arity` if one is not provided.
92136     if (data[9] == null) {
92137       data[9] = source[9];
92138     }
92139     // Use source `func` and merge bitmasks.
92140     data[0] = source[0];
92141     data[1] = newBitmask;
92142
92143     return data;
92144   }
92145
92146   /** Error message constants. */
92147   var FUNC_ERROR_TEXT$4 = 'Expected a function';
92148
92149   /** Used to compose bitmasks for function metadata. */
92150   var WRAP_BIND_FLAG$6 = 1,
92151       WRAP_BIND_KEY_FLAG$4 = 2,
92152       WRAP_CURRY_FLAG$4 = 8,
92153       WRAP_CURRY_RIGHT_FLAG$2 = 16,
92154       WRAP_PARTIAL_FLAG$2 = 32,
92155       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
92156
92157   /* Built-in method references for those with the same name as other `lodash` methods. */
92158   var nativeMax$7 = Math.max;
92159
92160   /**
92161    * Creates a function that either curries or invokes `func` with optional
92162    * `this` binding and partially applied arguments.
92163    *
92164    * @private
92165    * @param {Function|string} func The function or method name to wrap.
92166    * @param {number} bitmask The bitmask flags.
92167    *    1 - `_.bind`
92168    *    2 - `_.bindKey`
92169    *    4 - `_.curry` or `_.curryRight` of a bound function
92170    *    8 - `_.curry`
92171    *   16 - `_.curryRight`
92172    *   32 - `_.partial`
92173    *   64 - `_.partialRight`
92174    *  128 - `_.rearg`
92175    *  256 - `_.ary`
92176    *  512 - `_.flip`
92177    * @param {*} [thisArg] The `this` binding of `func`.
92178    * @param {Array} [partials] The arguments to be partially applied.
92179    * @param {Array} [holders] The `partials` placeholder indexes.
92180    * @param {Array} [argPos] The argument positions of the new function.
92181    * @param {number} [ary] The arity cap of `func`.
92182    * @param {number} [arity] The arity of `func`.
92183    * @returns {Function} Returns the new wrapped function.
92184    */
92185   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
92186     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
92187     if (!isBindKey && typeof func != 'function') {
92188       throw new TypeError(FUNC_ERROR_TEXT$4);
92189     }
92190     var length = partials ? partials.length : 0;
92191     if (!length) {
92192       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
92193       partials = holders = undefined;
92194     }
92195     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
92196     arity = arity === undefined ? arity : toInteger(arity);
92197     length -= holders ? holders.length : 0;
92198
92199     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
92200       var partialsRight = partials,
92201           holdersRight = holders;
92202
92203       partials = holders = undefined;
92204     }
92205     var data = isBindKey ? undefined : getData(func);
92206
92207     var newData = [
92208       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
92209       argPos, ary, arity
92210     ];
92211
92212     if (data) {
92213       mergeData(newData, data);
92214     }
92215     func = newData[0];
92216     bitmask = newData[1];
92217     thisArg = newData[2];
92218     partials = newData[3];
92219     holders = newData[4];
92220     arity = newData[9] = newData[9] === undefined
92221       ? (isBindKey ? 0 : func.length)
92222       : nativeMax$7(newData[9] - length, 0);
92223
92224     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
92225       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
92226     }
92227     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
92228       var result = createBind(func, bitmask, thisArg);
92229     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
92230       result = createCurry(func, bitmask, arity);
92231     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
92232       result = createPartial(func, bitmask, thisArg, partials);
92233     } else {
92234       result = createHybrid.apply(undefined, newData);
92235     }
92236     var setter = data ? baseSetData : setData;
92237     return setWrapToString(setter(result, newData), func, bitmask);
92238   }
92239
92240   /** Used to compose bitmasks for function metadata. */
92241   var WRAP_BIND_FLAG$7 = 1,
92242       WRAP_PARTIAL_FLAG$3 = 32;
92243
92244   /**
92245    * Creates a function that invokes `func` with the `this` binding of `thisArg`
92246    * and `partials` prepended to the arguments it receives.
92247    *
92248    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
92249    * may be used as a placeholder for partially applied arguments.
92250    *
92251    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
92252    * property of bound functions.
92253    *
92254    * @static
92255    * @memberOf _
92256    * @since 0.1.0
92257    * @category Function
92258    * @param {Function} func The function to bind.
92259    * @param {*} thisArg The `this` binding of `func`.
92260    * @param {...*} [partials] The arguments to be partially applied.
92261    * @returns {Function} Returns the new bound function.
92262    * @example
92263    *
92264    * function greet(greeting, punctuation) {
92265    *   return greeting + ' ' + this.user + punctuation;
92266    * }
92267    *
92268    * var object = { 'user': 'fred' };
92269    *
92270    * var bound = _.bind(greet, object, 'hi');
92271    * bound('!');
92272    * // => 'hi fred!'
92273    *
92274    * // Bound with placeholders.
92275    * var bound = _.bind(greet, object, _, '!');
92276    * bound('hi');
92277    * // => 'hi fred!'
92278    */
92279   var bind$2 = baseRest(function(func, thisArg, partials) {
92280     var bitmask = WRAP_BIND_FLAG$7;
92281     if (partials.length) {
92282       var holders = replaceHolders(partials, getHolder(bind$2));
92283       bitmask |= WRAP_PARTIAL_FLAG$3;
92284     }
92285     return createWrap(func, bitmask, thisArg, partials, holders);
92286   });
92287
92288   // Assign default placeholders.
92289   bind$2.placeholder = {};
92290
92291   function presetCollection(collection) {
92292       var maxSearchResults = 50;
92293
92294       var presets = {
92295
92296           collection: collection,
92297
92298
92299           item: function(id) {
92300               return find$1(this.collection, function(d) {
92301                   return d.id === id;
92302               });
92303           },
92304
92305           index: function(id) {
92306               return findIndex(this.collection, function(d) {
92307                   return d.id === id;
92308               });
92309           },
92310
92311           matchGeometry: function(geometry) {
92312               return presetCollection(this.collection.filter(function(d) {
92313                   return d.matchGeometry(geometry);
92314               }));
92315           },
92316
92317
92318           search: function(value, geometry) {
92319               if (!value) return this;
92320
92321               value = value.toLowerCase();
92322
92323               // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
92324               function leading(a) {
92325                   var index = a.indexOf(value);
92326                   return index === 0 || a[index - 1] === ' ';
92327               }
92328
92329               // match at name beginning only
92330               function leadingStrict(a) {
92331                   var index = a.indexOf(value);
92332                   return index === 0;
92333               }
92334
92335               function sortNames(a, b) {
92336                   var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
92337                   var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
92338
92339                   // priority if search string matches preset name exactly - #4325
92340                   if (value === aCompare) return -1;
92341                   if (value === bCompare) return 1;
92342
92343                   // priority for higher matchScore
92344                   var i = b.originalScore - a.originalScore;
92345                   if (i !== 0) return i;
92346
92347                   // priority if search string appears earlier in preset name
92348                   i = aCompare.indexOf(value) - bCompare.indexOf(value);
92349                   if (i !== 0) return i;
92350
92351                   // priority for shorter preset names
92352                   return aCompare.length - bCompare.length;
92353               }
92354
92355
92356               var searchable = this.collection.filter(function(a) {
92357                   return a.searchable !== false && a.suggestion !== true;
92358               });
92359               var suggestions = this.collection.filter(function(a) {
92360                   return a.suggestion === true;
92361               });
92362
92363               // matches value to preset.name
92364               var leading_name = searchable
92365                   .filter(function(a) {
92366                       return leading(a.name().toLowerCase());
92367                   }).sort(sortNames);
92368
92369               // matches value to preset.terms values
92370               var leading_terms = searchable
92371                   .filter(function(a) {
92372                       return some(a.terms() || [], leading);
92373                   });
92374
92375               // matches value to preset.tags values
92376               var leading_tag_values = searchable
92377                   .filter(function(a) {
92378                       return some(without(values$1(a.tags || {}), '*'), leading);
92379                   });
92380
92381               var leading_suggestions = suggestions
92382                   .filter(function(a) {
92383                       return leadingStrict(a.originalName.toLowerCase());
92384                   }).sort(sortNames);
92385
92386               // finds close matches to value in preset.name
92387               var similar_name = searchable
92388                   .map(function(a) {
92389                       return { preset: a, dist: utilEditDistance(value, a.name()) };
92390                   }).filter(function(a) {
92391                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
92392                   }).sort(function(a, b) {
92393                       return a.dist - b.dist;
92394                   }).map(function(a) {
92395                       return a.preset;
92396                   });
92397
92398               // finds close matches to value in preset.terms
92399               var similar_terms = searchable
92400                   .filter(function(a) {
92401                       return some(a.terms() || [], function(b) {
92402                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
92403                       });
92404                   });
92405
92406               var similar_suggestions = suggestions
92407                   .map(function(a) {
92408                       return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
92409                   }).filter(function(a) {
92410                       return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
92411                   }).sort(function(a, b) {
92412                       return a.dist - b.dist;
92413                   }).map(function(a) {
92414                       return a.preset;
92415                   });
92416
92417               var other = presets.item(geometry);
92418
92419               var results = leading_name.concat(
92420                   leading_suggestions,
92421                   leading_terms,
92422                   leading_tag_values,
92423                   similar_name,
92424                   similar_suggestions,
92425                   similar_terms
92426               ).slice(0, maxSearchResults - 1);
92427
92428               return presetCollection(uniq(results.concat(other)));
92429           }
92430       };
92431
92432
92433       return presets;
92434   }
92435
92436   function presetCategory(id, category, all) {
92437       category = clone(category);
92438
92439       category.id = id;
92440
92441
92442       category.members = presetCollection(category.members.map(function(id) {
92443           return all.item(id);
92444       }));
92445
92446
92447       category.matchGeometry = function(geometry) {
92448           return category.geometry.indexOf(geometry) >= 0;
92449       };
92450
92451
92452       category.matchScore = function() {
92453           return -1;
92454       };
92455
92456
92457       category.name = function() {
92458           return t('presets.categories.' + id + '.name', {'default': id});
92459       };
92460
92461
92462       category.terms = function() {
92463           return [];
92464       };
92465
92466
92467       return category;
92468   }
92469
92470   function presetField(id, field) {
92471       field = clone(field);
92472
92473       field.id = id;
92474
92475       // for use in classes, element ids, css selectors
92476       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
92477
92478       field.matchGeometry = function(geometry) {
92479           return !field.geometry || field.geometry === geometry;
92480       };
92481
92482
92483       field.t = function(scope, options) {
92484           return t('presets.fields.' + id + '.' + scope, options);
92485       };
92486
92487
92488       field.label = function() {
92489           return field.overrideLabel || field.t('label', {'default': id});
92490       };
92491
92492
92493       var placeholder = field.placeholder;
92494       field.placeholder = function() {
92495           return field.t('placeholder', {'default': placeholder});
92496       };
92497
92498
92499       return field;
92500   }
92501
92502   function presetPreset(id, preset, fields, visible, rawPresets) {
92503       preset = clone(preset);
92504
92505       preset.id = id;
92506
92507       preset.parentPresetID = function() {
92508           var endIndex = preset.id.lastIndexOf('/');
92509           if (endIndex < 0) return null;
92510
92511           return preset.id.substring(0, endIndex);
92512       };
92513
92514
92515       // For a preset without fields, use the fields of the parent preset.
92516       // Replace {preset} placeholders with the fields of the specified presets.
92517       function resolveFieldInheritance() {
92518
92519           // Skip `fields` for the keys which define the preset.
92520           // These are usually `typeCombo` fields like `shop=*`
92521           function shouldInheritFieldWithID(fieldID) {
92522               var f = fields[fieldID];
92523               if (f.key) {
92524                   if (preset.tags[f.key] !== undefined &&
92525                       // inherit anyway if multiple values are allowed
92526                       f.type !== 'multiCombo' && f.type !== 'semiCombo') {
92527                       return false;
92528                   }
92529               }
92530               return true;
92531           }
92532
92533           // returns an array of field IDs to inherit from the given presetID, if found
92534           function inheritedFieldIDs(presetID, prop) {
92535               if (!presetID) return null;
92536
92537               var inheritPreset = rawPresets[presetID];
92538               if (!inheritPreset) return null;
92539
92540               var inheritFieldIDs = inheritPreset[prop] || [];
92541
92542               if (prop === 'fields') {
92543                   inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
92544               }
92545
92546               return inheritFieldIDs;
92547           }
92548
92549
92550           ['fields', 'moreFields'].forEach(function(prop) {
92551               var fieldIDs = [];
92552               if (preset[prop] && preset[prop].length) {    // fields were defined
92553                   preset[prop].forEach(function(fieldID) {
92554                       var match = fieldID.match(/\{(.*)\}/);
92555                       if (match !== null) {        // presetID wrapped in braces {}
92556                           var inheritIDs = inheritedFieldIDs(match[1], prop);
92557                           if (inheritIDs !== null) {
92558                               fieldIDs = fieldIDs.concat(inheritIDs);
92559                           } else {
92560                               /* eslint-disable no-console */
92561                               console.log('Cannot resolve presetID ' + match[0] +
92562                                   ' found in ' + preset.id + ' ' + prop);
92563                               /* eslint-enable no-console */
92564                           }
92565                       } else {
92566                           fieldIDs.push(fieldID);  // no braces - just a normal field
92567                       }
92568                   });
92569
92570               } else {  // no fields defined, so use the parent's if possible
92571                   fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
92572               }
92573               // resolve duplicate fields
92574               fieldIDs = uniq(fieldIDs);
92575
92576               // update this preset with the results
92577               preset[prop] = fieldIDs;
92578
92579               // update the raw object to allow for multiple levels of inheritance
92580               rawPresets[preset.id][prop] = fieldIDs;
92581           });
92582       }
92583
92584       if (rawPresets) {
92585           resolveFieldInheritance();
92586       }
92587
92588       preset.fields = (preset.fields || []).map(getFields);
92589       preset.moreFields = (preset.moreFields || []).map(getFields);
92590       preset.geometry = (preset.geometry || []);
92591
92592       visible = visible || false;
92593
92594       function getFields(f) {
92595           return fields[f];
92596       }
92597
92598
92599       preset.matchGeometry = function(geometry) {
92600           return preset.geometry.indexOf(geometry) >= 0;
92601       };
92602
92603
92604       preset.originalScore = preset.matchScore || 1;
92605
92606
92607       preset.matchScore = function(entityTags) {
92608           var tags = preset.tags;
92609           var score = 0;
92610
92611           for (var t in tags) {
92612               if (entityTags[t] === tags[t]) {
92613                   score += preset.originalScore;
92614               } else if (tags[t] === '*' && t in entityTags) {
92615                   score += preset.originalScore / 2;
92616               } else {
92617                   return -1;
92618               }
92619           }
92620
92621           return score;
92622       };
92623
92624
92625       preset.t = function(scope, options) {
92626           return t('presets.presets.' + id + '.' + scope, options);
92627       };
92628
92629
92630       preset.originalName = preset.name || '';
92631
92632
92633       preset.name = function() {
92634           if (preset.suggestion) {
92635               var path = id.split('/');
92636               path.pop();  // remove brand name
92637               // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
92638               return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
92639           }
92640           return preset.t('name', { 'default': preset.originalName });
92641       };
92642
92643
92644       preset.originalTerms = (preset.terms || []).join();
92645
92646
92647       preset.terms = function() {
92648           return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
92649       };
92650
92651
92652       preset.isFallback = function() {
92653           var tagCount = Object.keys(preset.tags).length;
92654           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
92655       };
92656
92657       preset.visible = function(val) {
92658           if (!arguments.length) return visible;
92659           visible = val;
92660           return visible;
92661       };
92662
92663
92664       var reference = preset.reference || {};
92665       preset.reference = function(geometry) {
92666           // Lookup documentation on Wikidata...
92667           var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
92668           if (qid) {
92669               return { qid: qid };
92670           }
92671
92672           // Lookup documentation on OSM Wikibase...
92673           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0];
92674           var value = reference.value || preset.tags[key];
92675
92676           if (geometry === 'relation' && key === 'type') {
92677               if (value in preset.tags) {
92678                   key = value;
92679                   value = preset.tags[key];
92680               } else {
92681                   return { rtype: value };
92682               }
92683           }
92684
92685           if (value === '*') {
92686               return { key: key };
92687           } else {
92688               return { key: key, value: value };
92689           }
92690       };
92691
92692
92693       preset.removeTags = preset.removeTags || preset.tags || {};
92694       preset.unsetTags = function(tags, geometry) {
92695           tags = omit(tags, Object.keys(preset.removeTags));
92696
92697           for (var f in preset.fields) {
92698               var field = preset.fields[f];
92699               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
92700                   delete tags[field.key];
92701               }
92702           }
92703
92704           delete tags.area;
92705           return tags;
92706       };
92707
92708
92709       preset.addTags = preset.addTags || preset.tags || {};
92710       preset.setTags = function(tags, geometry) {
92711           var addTags = preset.addTags;
92712           var k;
92713
92714           tags = clone(tags);
92715
92716           for (k in addTags) {
92717               if (addTags[k] === '*') {
92718                   tags[k] = 'yes';
92719               } else {
92720                   tags[k] = addTags[k];
92721               }
92722           }
92723
92724           // Add area=yes if necessary.
92725           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
92726           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
92727           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
92728           if (!addTags.hasOwnProperty('area')) {
92729               delete tags.area;
92730               if (geometry === 'area') {
92731                   var needsAreaTag = true;
92732                   if (preset.geometry.indexOf('line') === -1) {
92733                       for (k in addTags) {
92734                           if (k in areaKeys) {
92735                               needsAreaTag = false;
92736                               break;
92737                           }
92738                       }
92739                   }
92740                   if (needsAreaTag) {
92741                       tags.area = 'yes';
92742                   }
92743               }
92744           }
92745
92746           for (var f in preset.fields) {
92747               var field = preset.fields[f];
92748               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
92749                   tags[field.key] = field.default;
92750               }
92751           }
92752
92753           return tags;
92754       };
92755
92756
92757       return preset;
92758   }
92759
92760   function presetIndex() {
92761       // a presetCollection with methods for
92762       // loading new data and returning defaults
92763
92764       var all = presetCollection([]);
92765       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
92766       var _fields = {};
92767       var _universal = [];
92768       var _recent = presetCollection([]);
92769
92770       // Index of presets by (geometry, tag key).
92771       var _index = {
92772           point: {},
92773           vertex: {},
92774           line: {},
92775           area: {},
92776           relation: {}
92777       };
92778
92779       all.match = function(entity, resolver) {
92780           return resolver.transient(entity, 'presetMatch', function() {
92781               var geometry = entity.geometry(resolver);
92782
92783               // Treat entities on addr:interpolation lines as points, not vertices - #3241
92784               if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
92785                   geometry = 'point';
92786               }
92787
92788               return all.matchTags(entity.tags, geometry);
92789           });
92790       };
92791
92792       all.matchTags = function(tags, geometry) {
92793
92794           var address;
92795           var geometryMatches = _index[geometry];
92796           var best = -1;
92797           var match;
92798
92799           for (var k in tags) {
92800               // If any part of an address is present,
92801               // allow fallback to "Address" preset - #4353
92802               if (/^addr:/.test(k) && geometryMatches['addr:*']) {
92803                   address = geometryMatches['addr:*'][0];
92804               }
92805
92806               var keyMatches = geometryMatches[k];
92807               if (!keyMatches) continue;
92808
92809               for (var i = 0; i < keyMatches.length; i++) {
92810                   var score = keyMatches[i].matchScore(tags);
92811                   if (score > best) {
92812                       best = score;
92813                       match = keyMatches[i];
92814                   }
92815               }
92816
92817           }
92818
92819           if (address && (!match || match.isFallback())) {
92820               match = address;
92821           }
92822           return match || all.item(geometry);
92823       };
92824
92825       all.allowsVertex = function(entity, resolver) {
92826           if (entity.type !== 'node') return false;
92827           if (isEmpty(entity.tags)) return true;
92828           return resolver.transient(entity, 'vertexMatch', function() {
92829               var vertexPresets = _index.vertex;
92830               if (entity.isOnAddressLine(resolver)) {
92831                   return true;
92832               } else {
92833                   var didFindMatches = false;
92834                   for (var k in entity.tags) {
92835                       var keyMatches = vertexPresets[k];
92836                       if (!keyMatches) continue;
92837                       didFindMatches = true;
92838                       for (var i = 0; i < keyMatches.length; i++) {
92839                           var preset = keyMatches[i];
92840                           if (preset.searchable !== false && preset.matchScore(entity.tags) > -1) {
92841                               return preset;
92842                           }
92843                       }
92844                   }
92845                   return !didFindMatches;
92846               }
92847           });
92848       };
92849
92850
92851       // Because of the open nature of tagging, iD will never have a complete
92852       // list of tags used in OSM, so we want it to have logic like "assume
92853       // that a closed way with an amenity tag is an area, unless the amenity
92854       // is one of these specific types". This function computes a structure
92855       // that allows testing of such conditions, based on the presets designated
92856       // as as supporting (or not supporting) the area geometry.
92857       //
92858       // The returned object L is a whitelist/blacklist of tags. A closed way
92859       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
92860       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
92861       // and the subkeys form the blacklist.
92862       all.areaKeys = function() {
92863           var areaKeys = {};
92864           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
92865           var presets = reject(all.collection, 'suggestion');
92866
92867           // whitelist
92868           presets.forEach(function(d) {
92869               for (var key in d.tags) break;
92870               if (!key) return;
92871               if (ignore.indexOf(key) !== -1) return;
92872
92873               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
92874                   areaKeys[key] = areaKeys[key] || {};
92875               }
92876           });
92877
92878           // blacklist
92879           presets.forEach(function(d) {
92880               for (var key in d.tags) break;
92881               if (!key) return;
92882               if (ignore.indexOf(key) !== -1) return;
92883
92884               var value = d.tags[key];
92885               if (key in areaKeys &&                      // probably an area...
92886                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
92887                   value !== '*') {
92888                   areaKeys[key][value] = true;
92889               }
92890           });
92891
92892           return areaKeys;
92893       };
92894
92895       all.build = function(d, visible) {
92896           if (d.fields) {
92897               forEach(d.fields, function(d, id) {
92898                   _fields[id] = presetField(id, d);
92899                   if (d.universal) {
92900                       _universal.push(_fields[id]);
92901                   }
92902               });
92903           }
92904
92905           if (d.presets) {
92906               var rawPresets = d.presets;
92907               forEach(d.presets, function(d, id) {
92908                   var existing = all.index(id);
92909                   if (existing !== -1) {
92910                       all.collection[existing] = presetPreset(id, d, _fields, visible, rawPresets);
92911                   } else {
92912                       all.collection.push(presetPreset(id, d, _fields, visible, rawPresets));
92913                   }
92914               });
92915           }
92916
92917           if (d.categories) {
92918               forEach(d.categories, function(d, id) {
92919                   var existing = all.index(id);
92920                   if (existing !== -1) {
92921                       all.collection[existing] = presetCategory(id, d, all);
92922                   } else {
92923                       all.collection.push(presetCategory(id, d, all));
92924                   }
92925               });
92926           }
92927
92928           if (d.defaults) {
92929               var getItem = bind$2(all.item, all);
92930               _defaults = {
92931                   area: presetCollection(d.defaults.area.map(getItem)),
92932                   line: presetCollection(d.defaults.line.map(getItem)),
92933                   point: presetCollection(d.defaults.point.map(getItem)),
92934                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
92935                   relation: presetCollection(d.defaults.relation.map(getItem))
92936               };
92937           }
92938
92939           for (var i = 0; i < all.collection.length; i++) {
92940               var preset = all.collection[i];
92941               var geometry = preset.geometry;
92942
92943               for (var j = 0; j < geometry.length; j++) {
92944                   var g = _index[geometry[j]];
92945                   for (var k in preset.tags) {
92946                       (g[k] = g[k] || []).push(preset);
92947                   }
92948               }
92949           }
92950           return all;
92951       };
92952
92953       all.init = function() {
92954           all.collection = [];
92955           _recent.collection = [];
92956           _fields = {};
92957           _universal = [];
92958           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
92959
92960           return all.build(data.presets, true);
92961       };
92962
92963
92964       all.reset = function() {
92965           all.collection = [];
92966           _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
92967           _fields = {};
92968           _universal = [];
92969           _recent = presetCollection([]);
92970
92971           // Index of presets by (geometry, tag key).
92972           _index = {
92973               point: {},
92974               vertex: {},
92975               line: {},
92976               area: {},
92977               relation: {}
92978           };
92979
92980           return all;
92981       };
92982
92983       all.fromExternal = function(external, done) {
92984           all.reset();
92985           d3_json(external, function(err, externalPresets) {
92986               if (err) {
92987                   all.init();
92988               } else {
92989                   all.build(data.presets, false); // make default presets hidden to begin
92990                   all.build(externalPresets, true); // make the external visible
92991               }
92992               done(all);
92993           });
92994       };
92995
92996       all.field = function(id) {
92997           return _fields[id];
92998       };
92999
93000       all.universal = function() {
93001           return _universal;
93002       };
93003
93004       all.defaults = function(geometry, n) {
93005           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
93006           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
93007           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
93008       };
93009
93010       all.choose = function(preset) {
93011           if (preset.searchable !== false) {
93012               _recent = presetCollection(uniq([preset].concat(_recent.collection)));
93013           }
93014           return all;
93015       };
93016
93017       return all;
93018   }
93019
93020   var areaKeys = {};
93021
93022   function setAreaKeys(value) {
93023       areaKeys = value;
93024   }
93025
93026
93027   function coreContext() {
93028       var context = {};
93029       context.version = '2.14.3';
93030
93031       // create a special translation that contains the keys in place of the strings
93032       var tkeys = cloneDeep(en);
93033       var parents = [];
93034
93035       function traverser(v, k, obj) {
93036           parents.push(k);
93037           if (isObject(v)) {
93038               forOwn(v, traverser);
93039           } else if (isString(v)) {
93040               obj[k] = parents.join('.');
93041           }
93042           parents.pop();
93043       }
93044
93045       forOwn(tkeys, traverser);
93046       addTranslation('_tkeys_', tkeys);
93047
93048       addTranslation('en', en);
93049       setLocale('en');
93050
93051       var dispatch$1 = dispatch('enter', 'exit', 'change');
93052
93053       // https://github.com/openstreetmap/iD/issues/772
93054       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
93055       var storage;
93056       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
93057       storage = storage || (function() {
93058           var s = {};
93059           return {
93060               getItem: function(k) { return s[k]; },
93061               setItem: function(k, v) { s[k] = v; },
93062               removeItem: function(k) { delete s[k]; }
93063           };
93064       })();
93065
93066       context.storage = function(k, v) {
93067           try {
93068               if (arguments.length === 1) return storage.getItem(k);
93069               else if (v === null) storage.removeItem(k);
93070               else storage.setItem(k, v);
93071           } catch (e) {
93072               // localstorage quota exceeded
93073               /* eslint-disable no-console */
93074               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
93075               /* eslint-enable no-console */
93076           }
93077       };
93078
93079
93080       /* User interface and keybinding */
93081       var ui;
93082       context.ui = function() { return ui; };
93083
93084       var keybinding = utilKeybinding('context');
93085       context.keybinding = function() { return keybinding; };
93086       select(document).call(keybinding);
93087
93088
93089       /* Straight accessors. Avoid using these if you can. */
93090       var connection, history, validator;
93091       context.connection = function() { return connection; };
93092       context.history = function() { return history; };
93093       context.validator = function() { return validator; };
93094
93095       /* Connection */
93096       context.preauth = function(options) {
93097           if (connection) {
93098               connection.switch(options);
93099           }
93100           return context;
93101       };
93102
93103       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
93104           var cid;
93105           function done(err, result) {
93106               if (connection.getConnectionId() !== cid) {
93107                   if (callback) callback({ message: 'Connection Switched', status: -1 });
93108                   return;
93109               }
93110               if (!err) history.merge(result.data, result.extent);
93111               if (callback) callback(err, result);
93112           }
93113           if (connection && context.editable()) {
93114               cid = connection.getConnectionId();
93115               connection.loadTiles(projection, done);
93116           }
93117       });
93118
93119       context.loadEntity = function(entityID, callback) {
93120           var cid;
93121           function done(err, result) {
93122               if (connection.getConnectionId() !== cid) {
93123                   if (callback) callback({ message: 'Connection Switched', status: -1 });
93124                   return;
93125               }
93126               if (!err) history.merge(result.data, result.extent);
93127               if (callback) callback(err, result);
93128           }
93129           if (connection) {
93130               cid = connection.getConnectionId();
93131               connection.loadEntity(entityID, done);
93132           }
93133       };
93134
93135       context.zoomToEntity = function(entityID, zoomTo) {
93136           if (zoomTo !== false) {
93137               this.loadEntity(entityID, function(err, result) {
93138                   if (err) return;
93139                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
93140                   if (entity) {
93141                       map.zoomTo(entity);
93142                   }
93143               });
93144           }
93145
93146           map.on('drawn.zoomToEntity', function() {
93147               if (!context.hasEntity(entityID)) return;
93148               map.on('drawn.zoomToEntity', null);
93149               context.on('enter.zoomToEntity', null);
93150               context.enter(modeSelect(context, [entityID]));
93151           });
93152
93153           context.on('enter.zoomToEntity', function() {
93154               if (mode.id !== 'browse') {
93155                   map.on('drawn.zoomToEntity', null);
93156                   context.on('enter.zoomToEntity', null);
93157               }
93158           });
93159       };
93160
93161       var minEditableZoom = 16;
93162       context.minEditableZoom = function(_) {
93163           if (!arguments.length) return minEditableZoom;
93164           minEditableZoom = _;
93165           if (connection) {
93166               connection.tileZoom(_);
93167           }
93168           return context;
93169       };
93170
93171
93172       /* History */
93173       var inIntro = false;
93174       context.inIntro = function(_) {
93175           if (!arguments.length) return inIntro;
93176           inIntro = _;
93177           return context;
93178       };
93179
93180       context.save = function() {
93181           // no history save, no message onbeforeunload
93182           if (inIntro || select('.modal').size()) return;
93183
93184           var canSave;
93185           if (mode && mode.id === 'save') {
93186               canSave = false;
93187
93188               // Attempt to prevent user from creating duplicate changes - see #5200
93189               if (services.osm && services.osm.isChangesetInflight()) {
93190                   history.clearSaved();
93191                   return;
93192               }
93193
93194           } else {
93195               canSave = context.selectedIDs().every(function(id) {
93196                   var entity = context.hasEntity(id);
93197                   return entity && !entity.isDegenerate();
93198               });
93199           }
93200
93201           if (canSave) {
93202               history.save();
93203           }
93204           if (history.hasChanges()) {
93205               return t('save.unsaved_changes');
93206           }
93207       };
93208
93209
93210       /* Graph */
93211       context.hasEntity = function(id) {
93212           return history.graph().hasEntity(id);
93213       };
93214       context.entity = function(id) {
93215           return history.graph().entity(id);
93216       };
93217       context.childNodes = function(way) {
93218           return history.graph().childNodes(way);
93219       };
93220       context.geometry = function(id) {
93221           return context.entity(id).geometry(history.graph());
93222       };
93223
93224
93225       /* Modes */
93226       var mode;
93227       context.mode = function() {
93228           return mode;
93229       };
93230       context.enter = function(newMode) {
93231           if (mode) {
93232               mode.exit();
93233               dispatch$1.call('exit', this, mode);
93234           }
93235
93236           mode = newMode;
93237           mode.enter();
93238           dispatch$1.call('enter', this, mode);
93239       };
93240
93241       context.selectedIDs = function() {
93242           if (mode && mode.selectedIDs) {
93243               return mode.selectedIDs();
93244           } else {
93245               return [];
93246           }
93247       };
93248
93249       context.activeID = function() {
93250           return mode && mode.activeID && mode.activeID();
93251       };
93252
93253       var _selectedNoteID;
93254       context.selectedNoteID = function(noteID) {
93255           if (!arguments.length) return _selectedNoteID;
93256           _selectedNoteID = noteID;
93257           return context;
93258       };
93259
93260       var _selectedErrorID;
93261       context.selectedErrorID = function(errorID) {
93262           if (!arguments.length) return _selectedErrorID;
93263           _selectedErrorID = errorID;
93264           return context;
93265       };
93266
93267
93268       /* Behaviors */
93269       context.install = function(behavior) {
93270           context.surface().call(behavior);
93271       };
93272       context.uninstall = function(behavior) {
93273           context.surface().call(behavior.off);
93274       };
93275
93276
93277       /* Copy/Paste */
93278       var copyIDs = [], copyGraph;
93279       context.copyGraph = function() { return copyGraph; };
93280       context.copyIDs = function(_) {
93281           if (!arguments.length) return copyIDs;
93282           copyIDs = _;
93283           copyGraph = history.graph();
93284           return context;
93285       };
93286
93287
93288       /* Background */
93289       var background;
93290       context.background = function() { return background; };
93291
93292
93293       /* Features */
93294       var features;
93295       context.features = function() { return features; };
93296       context.hasHiddenConnections = function(id) {
93297           var graph = history.graph(),
93298               entity = graph.entity(id);
93299           return features.hasHiddenConnections(entity, graph);
93300       };
93301
93302
93303       /* Presets */
93304       var presets;
93305       context.presets = function() { return presets; };
93306
93307
93308       /* Map */
93309       var map;
93310       context.map = function() { return map; };
93311       context.layers = function() { return map.layers; };
93312       context.surface = function() { return map.surface; };
93313       context.editable = function() { return map.editable(); };
93314       context.surfaceRect = function() {
93315           return map.surface.node().getBoundingClientRect();
93316       };
93317
93318
93319       /* Debug */
93320       var debugFlags = {
93321           tile: false,        // tile boundaries
93322           collision: false,   // label collision bounding boxes
93323           imagery: false,     // imagery bounding polygons
93324           community: false,   // community bounding polygons
93325           imperial: false,    // imperial (not metric) bounding polygons
93326           driveLeft: false,   // driveLeft bounding polygons
93327           target: false       // touch targets
93328       };
93329       context.debugFlags = function() {
93330           return debugFlags;
93331       };
93332       context.setDebug = function(flag, val) {
93333           if (arguments.length === 1) val = true;
93334           debugFlags[flag] = val;
93335           dispatch$1.call('change');
93336           return context;
93337       };
93338       context.getDebug = function(flag) {
93339           return flag && debugFlags[flag];
93340       };
93341
93342
93343       /* Container */
93344       var container = select(document.body);
93345       context.container = function(_) {
93346           if (!arguments.length) return container;
93347           container = _;
93348           container.classed('id-container', true);
93349           return context;
93350       };
93351       var embed;
93352       context.embed = function(_) {
93353           if (!arguments.length) return embed;
93354           embed = _;
93355           return context;
93356       };
93357
93358
93359       /* Assets */
93360       var assetPath = '';
93361       context.assetPath = function(_) {
93362           if (!arguments.length) return assetPath;
93363           assetPath = _;
93364           return context;
93365       };
93366
93367       var assetMap = {};
93368       context.assetMap = function(_) {
93369           if (!arguments.length) return assetMap;
93370           assetMap = _;
93371           return context;
93372       };
93373
93374       context.asset = function(_) {
93375           var filename = assetPath + _;
93376           return assetMap[filename] || filename;
93377       };
93378
93379       context.imagePath = function(_) {
93380           return context.asset('img/' + _);
93381       };
93382
93383
93384       /* locales */
93385       // `locale` variable contains a "requested locale".
93386       // It won't become the `currentLocale` until after loadLocale() is called.
93387       var locale, localePath;
93388
93389       context.locale = function(loc, path) {
93390           if (!arguments.length) return currentLocale;
93391           locale = loc;
93392           localePath = path;
93393           return context;
93394       };
93395
93396       context.loadLocale = function(callback) {
93397           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
93398               localePath = localePath || context.asset('locales/' + locale + '.json');
93399               d3_json(localePath, function(err, result) {
93400                   if (!err) {
93401                       addTranslation(locale, result[locale]);
93402                       setLocale(locale);
93403                       utilDetect(true);
93404                   }
93405                   if (callback) {
93406                       callback(err);
93407                   }
93408               });
93409           } else {
93410               if (locale) {
93411                   setLocale(locale);
93412                   utilDetect(true);
93413               }
93414               if (callback) {
93415                   callback();
93416               }
93417           }
93418       };
93419
93420
93421       /* reset (aka flush) */
93422       context.reset = context.flush = function() {
93423           context.debouncedSave.cancel();
93424           forEach(services, function(service) {
93425               if (service && typeof service.reset === 'function') {
93426                   service.reset(context);
93427               }
93428           });
93429           features.reset();
93430           history.reset();
93431           return context;
93432       };
93433
93434
93435       /* Init */
93436
93437       context.projection = geoRawMercator();
93438       context.curtainProjection = geoRawMercator();
93439
93440       locale = utilDetect().locale;
93441       if (locale && !dataLocales.hasOwnProperty(locale)) {
93442           locale = locale.split('-')[0];
93443       }
93444
93445       history = coreHistory(context);
93446
93447       context.graph = history.graph;
93448       context.changes = history.changes;
93449       context.intersects = history.intersects;
93450
93451       validator = coreValidator(context);
93452
93453       // run validation upon restoring from page reload
93454       history.on('restore', function() {
93455           validator.validate();
93456       });
93457       // re-run validation upon a significant graph change
93458       history.on('annotatedChange', function(difference) {
93459           if (difference) {
93460               validator.validate();
93461           }
93462       });
93463       // re-run validation upon merging fetched data
93464       history.on('merge', function(entities) {
93465           if (entities && entities.length > 0) {
93466               validator.validate();
93467           }
93468       });
93469
93470       // Debounce save, since it's a synchronous localStorage write,
93471       // and history changes can happen frequently (e.g. when dragging).
93472       context.debouncedSave = debounce(context.save, 350);
93473       function withDebouncedSave(fn) {
93474           return function() {
93475               var result = fn.apply(history, arguments);
93476               context.debouncedSave();
93477               return result;
93478           };
93479       }
93480
93481       context.perform = withDebouncedSave(history.perform);
93482       context.replace = withDebouncedSave(history.replace);
93483       context.pop = withDebouncedSave(history.pop);
93484       context.overwrite = withDebouncedSave(history.overwrite);
93485       context.undo = withDebouncedSave(history.undo);
93486       context.redo = withDebouncedSave(history.redo);
93487
93488       ui = uiInit(context);
93489
93490       connection = services.osm;
93491       background = rendererBackground(context);
93492       features = rendererFeatures(context);
93493       presets = presetIndex();
93494
93495       if (services.maprules && utilStringQs(window.location.hash).maprules) {
93496           var maprules = utilStringQs(window.location.hash).maprules;
93497           d3_json(maprules, function (err, mapcss) {
93498               if (err) return;
93499               services.maprules.init();
93500               forEach(mapcss, function(mapcssSelector) {
93501                   return services.maprules.addRule(mapcssSelector);
93502               });
93503           });
93504       }
93505
93506       map = rendererMap(context);
93507       context.mouse = map.mouse;
93508       context.extent = map.extent;
93509       context.pan = map.pan;
93510       context.zoomIn = map.zoomIn;
93511       context.zoomOut = map.zoomOut;
93512       context.zoomInFurther = map.zoomInFurther;
93513       context.zoomOutFurther = map.zoomOutFurther;
93514       context.redrawEnable = map.redrawEnable;
93515
93516       forEach(services, function(service) {
93517           if (service && typeof service.init === 'function') {
93518               service.init(context);
93519           }
93520       });
93521
93522       background.init();
93523       features.init();
93524       if (utilStringQs(window.location.hash).presets) {
93525           var external = utilStringQs(window.location.hash).presets;
93526           presets.fromExternal(external, function(externalPresets) {
93527               context.presets = function() { return externalPresets; }; // default + external presets...
93528               areaKeys = presets.areaKeys();
93529           });
93530       } else {
93531           presets.init();
93532           areaKeys = presets.areaKeys();
93533       }
93534
93535       return utilRebind(context, dispatch$1, 'on');
93536   }
93537
93538   function osmWay() {
93539       if (!(this instanceof osmWay)) {
93540           return (new osmWay()).initialize(arguments);
93541       } else if (arguments.length) {
93542           this.initialize(arguments);
93543       }
93544   }
93545
93546
93547   osmEntity.way = osmWay;
93548
93549   osmWay.prototype = Object.create(osmEntity.prototype);
93550
93551
93552   assignIn(osmWay.prototype, {
93553       type: 'way',
93554       nodes: [],
93555
93556
93557       copy: function(resolver, copies) {
93558           if (copies[this.id]) return copies[this.id];
93559
93560           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
93561
93562           var nodes = this.nodes.map(function(id) {
93563               return resolver.entity(id).copy(resolver, copies).id;
93564           });
93565
93566           copy = copy.update({ nodes: nodes });
93567           copies[this.id] = copy;
93568
93569           return copy;
93570       },
93571
93572
93573       extent: function(resolver) {
93574           return resolver.transient(this, 'extent', function() {
93575               var extent = geoExtent();
93576               for (var i = 0; i < this.nodes.length; i++) {
93577                   var node = resolver.hasEntity(this.nodes[i]);
93578                   if (node) {
93579                       extent._extend(node.extent());
93580                   }
93581               }
93582               return extent;
93583           });
93584       },
93585
93586
93587       first: function() {
93588           return this.nodes[0];
93589       },
93590
93591
93592       last: function() {
93593           return this.nodes[this.nodes.length - 1];
93594       },
93595
93596
93597       contains: function(node) {
93598           return this.nodes.indexOf(node) >= 0;
93599       },
93600
93601
93602       affix: function(node) {
93603           if (this.nodes[0] === node) return 'prefix';
93604           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
93605       },
93606
93607
93608       layer: function() {
93609           // explicit layer tag, clamp between -10, 10..
93610           if (isFinite(this.tags.layer)) {
93611               return Math.max(-10, Math.min(+(this.tags.layer), 10));
93612           }
93613
93614           // implied layer tag..
93615           if (this.tags.covered === 'yes') return -1;
93616           if (this.tags.location === 'overground') return 1;
93617           if (this.tags.location === 'underground') return -1;
93618           if (this.tags.location === 'underwater') return -10;
93619
93620           if (this.tags.power === 'line') return 10;
93621           if (this.tags.power === 'minor_line') return 10;
93622           if (this.tags.aerialway) return 10;
93623           if (this.tags.bridge) return 1;
93624           if (this.tags.cutting) return -1;
93625           if (this.tags.tunnel) return -1;
93626           if (this.tags.waterway) return -1;
93627           if (this.tags.man_made === 'pipeline') return -10;
93628           if (this.tags.boundary) return -10;
93629           return 0;
93630       },
93631
93632
93633       isOneWay: function() {
93634           // explicit oneway tag..
93635           var values = {
93636               'yes': true,
93637               '1': true,
93638               '-1': true,
93639               'reversible': true,
93640               'alternating': true,
93641               'no': false,
93642               '0': false
93643           };
93644           if (values[this.tags.oneway] !== undefined) {
93645               return values[this.tags.oneway];
93646           }
93647
93648           // implied oneway tag..
93649           for (var key in this.tags) {
93650               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
93651                   return true;
93652           }
93653           return false;
93654       },
93655
93656       // Some identifier for tag that implies that this way is "sided",
93657       // i.e. the right side is the 'inside' (e.g. the right side of a
93658       // natural=cliff is lower).
93659       sidednessIdentifier: function() {
93660           for (var key in this.tags) {
93661               var value = this.tags[key];
93662               if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
93663                   if (osmRightSideIsInsideTags[key][value] === true) {
93664                       return key;
93665                   } else {
93666                       // if the map's value is something other than a
93667                       // literal true, we should use it so we can
93668                       // special case some keys (e.g. natural=coastline
93669                       // is handled differently to other naturals).
93670                       return osmRightSideIsInsideTags[key][value];
93671                   }
93672               }
93673           }
93674
93675           return null;
93676       },
93677       isSided: function() {
93678           if (this.tags.two_sided === 'yes') {
93679               return false;
93680           }
93681
93682           return this.sidednessIdentifier() != null;
93683       },
93684
93685       lanes: function() {
93686           return osmLanes(this);
93687       },
93688
93689
93690       isClosed: function() {
93691           return this.nodes.length > 1 && this.first() === this.last();
93692       },
93693
93694
93695       isConvex: function(resolver) {
93696           if (!this.isClosed() || this.isDegenerate()) return null;
93697
93698           var nodes = uniq(resolver.childNodes(this));
93699           var coords = map$3(nodes, 'loc');
93700           var curr = 0;
93701           var prev = 0;
93702
93703           for (var i = 0; i < coords.length; i++) {
93704               var o = coords[(i+1) % coords.length];
93705               var a = coords[i];
93706               var b = coords[(i+2) % coords.length];
93707               var res = geoVecCross(a, b, o);
93708
93709               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
93710               if (curr === 0) {
93711                   continue;
93712               } else if (prev && curr !== prev) {
93713                   return false;
93714               }
93715               prev = curr;
93716           }
93717           return true;
93718       },
93719
93720       // returns an object with the tag that implies this is an area, if any
93721       tagSuggestingArea: function() {
93722
93723           if (this.tags.area === 'yes') return { area: 'yes' };
93724           if (this.tags.area === 'no') return null;
93725
93726           // `highway` and `railway` are typically linear features, but there
93727           // are a few exceptions that should be treated as areas, even in the
93728           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
93729           var lineKeys = {
93730               highway: {
93731                   rest_area: true,
93732                   services: true
93733               },
93734               railway: {
93735                   roundhouse: true,
93736                   station: true,
93737                   traverser: true,
93738                   turntable: true,
93739                   wash: true
93740               }
93741           };
93742           var returnTags = {};
93743           for (var key in this.tags) {
93744               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
93745                   returnTags[key] = this.tags[key];
93746                   return returnTags;
93747               }
93748               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
93749                   returnTags[key] = this.tags[key];
93750                   return returnTags;
93751               }
93752           }
93753           return null;
93754       },
93755
93756       isArea: function() {
93757
93758           if (this.tags.area === 'yes')
93759               return true;
93760           if (!this.isClosed() || this.tags.area === 'no')
93761               return false;
93762           return this.tagSuggestingArea() !== null;
93763       },
93764
93765
93766       isDegenerate: function() {
93767           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
93768       },
93769
93770
93771       areAdjacent: function(n1, n2) {
93772           for (var i = 0; i < this.nodes.length; i++) {
93773               if (this.nodes[i] === n1) {
93774                   if (this.nodes[i - 1] === n2) return true;
93775                   if (this.nodes[i + 1] === n2) return true;
93776               }
93777           }
93778           return false;
93779       },
93780
93781
93782       geometry: function(graph) {
93783           return graph.transient(this, 'geometry', function() {
93784               return this.isArea() ? 'area' : 'line';
93785           });
93786       },
93787
93788
93789       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
93790       close: function() {
93791           if (this.isClosed() || !this.nodes.length) return this;
93792
93793           var nodes = this.nodes.slice();
93794           nodes = nodes.filter(noRepeatNodes);
93795           nodes.push(nodes[0]);
93796           return this.update({ nodes: nodes });
93797       },
93798
93799
93800       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
93801       unclose: function() {
93802           if (!this.isClosed()) return this;
93803
93804           var nodes = this.nodes.slice();
93805           var connector = this.first();
93806           var i = nodes.length - 1;
93807
93808           // remove trailing connectors..
93809           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93810               nodes.splice(i, 1);
93811               i = nodes.length - 1;
93812           }
93813
93814           nodes = nodes.filter(noRepeatNodes);
93815           return this.update({ nodes: nodes });
93816       },
93817
93818
93819       // Adds a node (id) in front of the node which is currently at position index.
93820       // If index is undefined, the node will be added to the end of the way for linear ways,
93821       //   or just before the final connecting node for circular ways.
93822       // Consecutive duplicates are eliminated including existing ones.
93823       // Circularity is always preserved when adding a node.
93824       addNode: function(id, index) {
93825           var nodes = this.nodes.slice();
93826           var isClosed = this.isClosed();
93827           var max = isClosed ? nodes.length - 1 : nodes.length;
93828
93829           if (index === undefined) {
93830               index = max;
93831           }
93832
93833           if (index < 0 || index > max) {
93834               throw new RangeError('index ' + index + ' out of range 0..' + max);
93835           }
93836
93837           // If this is a closed way, remove all connector nodes except the first one
93838           // (there may be duplicates) and adjust index if necessary..
93839           if (isClosed) {
93840               var connector = this.first();
93841
93842               // leading connectors..
93843               var i = 1;
93844               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
93845                   nodes.splice(i, 1);
93846                   if (index > i) index--;
93847               }
93848
93849               // trailing connectors..
93850               i = nodes.length - 1;
93851               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93852                   nodes.splice(i, 1);
93853                   if (index > i) index--;
93854                   i = nodes.length - 1;
93855               }
93856           }
93857
93858           nodes.splice(index, 0, id);
93859           nodes = nodes.filter(noRepeatNodes);
93860
93861           // If the way was closed before, append a connector node to keep it closed..
93862           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93863               nodes.push(nodes[0]);
93864           }
93865
93866           return this.update({ nodes: nodes });
93867       },
93868
93869
93870       // Replaces the node which is currently at position index with the given node (id).
93871       // Consecutive duplicates are eliminated including existing ones.
93872       // Circularity is preserved when updating a node.
93873       updateNode: function(id, index) {
93874           var nodes = this.nodes.slice();
93875           var isClosed = this.isClosed();
93876           var max = nodes.length - 1;
93877
93878           if (index === undefined || index < 0 || index > max) {
93879               throw new RangeError('index ' + index + ' out of range 0..' + max);
93880           }
93881
93882           // If this is a closed way, remove all connector nodes except the first one
93883           // (there may be duplicates) and adjust index if necessary..
93884           if (isClosed) {
93885               var connector = this.first();
93886
93887               // leading connectors..
93888               var i = 1;
93889               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
93890                   nodes.splice(i, 1);
93891                   if (index > i) index--;
93892               }
93893
93894               // trailing connectors..
93895               i = nodes.length - 1;
93896               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
93897                   nodes.splice(i, 1);
93898                   if (index === i) index = 0;  // update leading connector instead
93899                   i = nodes.length - 1;
93900               }
93901           }
93902
93903           nodes.splice(index, 1, id);
93904           nodes = nodes.filter(noRepeatNodes);
93905
93906           // If the way was closed before, append a connector node to keep it closed..
93907           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93908               nodes.push(nodes[0]);
93909           }
93910
93911           return this.update({nodes: nodes});
93912       },
93913
93914
93915       // Replaces each occurrence of node id needle with replacement.
93916       // Consecutive duplicates are eliminated including existing ones.
93917       // Circularity is preserved.
93918       replaceNode: function(needleID, replacementID) {
93919           var nodes = this.nodes.slice();
93920           var isClosed = this.isClosed();
93921
93922           for (var i = 0; i < nodes.length; i++) {
93923               if (nodes[i] === needleID) {
93924                   nodes[i] = replacementID;
93925               }
93926           }
93927
93928           nodes = nodes.filter(noRepeatNodes);
93929
93930           // If the way was closed before, append a connector node to keep it closed..
93931           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93932               nodes.push(nodes[0]);
93933           }
93934
93935           return this.update({nodes: nodes});
93936       },
93937
93938
93939       // Removes each occurrence of node id.
93940       // Consecutive duplicates are eliminated including existing ones.
93941       // Circularity is preserved.
93942       removeNode: function(id) {
93943           var nodes = this.nodes.slice();
93944           var isClosed = this.isClosed();
93945
93946           nodes = nodes
93947               .filter(function(node) { return node !== id; })
93948               .filter(noRepeatNodes);
93949
93950           // If the way was closed before, append a connector node to keep it closed..
93951           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
93952               nodes.push(nodes[0]);
93953           }
93954
93955           return this.update({nodes: nodes});
93956       },
93957
93958
93959       asJXON: function(changeset_id) {
93960           var r = {
93961               way: {
93962                   '@id': this.osmId(),
93963                   '@version': this.version || 0,
93964                   nd: map$3(this.nodes, function(id) {
93965                       return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
93966                   }),
93967                   tag: map$3(this.tags, function(v, k) {
93968                       return { keyAttributes: { k: k, v: v } };
93969                   })
93970               }
93971           };
93972           if (changeset_id) {
93973               r.way['@changeset'] = changeset_id;
93974           }
93975           return r;
93976       },
93977
93978
93979       asGeoJSON: function(resolver) {
93980           return resolver.transient(this, 'GeoJSON', function() {
93981               var coordinates = map$3(resolver.childNodes(this), 'loc');
93982               if (this.isArea() && this.isClosed()) {
93983                   return {
93984                       type: 'Polygon',
93985                       coordinates: [coordinates]
93986                   };
93987               } else {
93988                   return {
93989                       type: 'LineString',
93990                       coordinates: coordinates
93991                   };
93992               }
93993           });
93994       },
93995
93996
93997       area: function(resolver) {
93998           return resolver.transient(this, 'area', function() {
93999               var nodes = resolver.childNodes(this);
94000
94001               var json = {
94002                   type: 'Polygon',
94003                   coordinates: [map$3(nodes, 'loc')]
94004               };
94005
94006               if (!this.isClosed() && nodes.length) {
94007                   json.coordinates[0].push(nodes[0].loc);
94008               }
94009
94010               var area = d3_geoArea(json);
94011
94012               // Heuristic for detecting counterclockwise winding order. Assumes
94013               // that OpenStreetMap polygons are not hemisphere-spanning.
94014               if (area > 2 * Math.PI) {
94015                   json.coordinates[0] = json.coordinates[0].reverse();
94016                   area = d3_geoArea(json);
94017               }
94018
94019               return isNaN(area) ? 0 : area;
94020           });
94021       }
94022   });
94023
94024
94025   // Filter function to eliminate consecutive duplicates.
94026   function noRepeatNodes(node, i, arr) {
94027       return i === 0 || node !== arr[i - 1];
94028   }
94029
94030   // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
94031   //
94032   // 1. Relation tagged with `type=multipolygon` and no interesting tags.
94033   // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
94034   // 3. No members without a role.
94035   //
94036   // Old multipolygons are no longer recommended but are still rendered as areas by iD.
94037
94038   function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
94039       if (entity.type !== 'relation' ||
94040           !entity.isMultipolygon()
94041           || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
94042           return false;
94043       }
94044
94045       var outerMember;
94046       for (var memberIndex in entity.members) {
94047           var member = entity.members[memberIndex];
94048           if (!member.role || member.role === 'outer') {
94049               if (outerMember) return false;
94050               if (member.type !== 'way') return false;
94051               if (!graph.hasEntity(member.id)) return false;
94052
94053               outerMember = graph.entity(member.id);
94054
94055               if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
94056                   return false;
94057               }
94058           }
94059       }
94060
94061       return outerMember;
94062   }
94063
94064   // For fixing up rendering of multipolygons with tags on the outer member.
94065   // https://github.com/openstreetmap/iD/issues/613
94066   function osmIsOldMultipolygonOuterMember(entity, graph) {
94067       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
94068           return false;
94069
94070       var parents = graph.parentRelations(entity);
94071       if (parents.length !== 1)
94072           return false;
94073
94074       var parent = parents[0];
94075       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
94076           return false;
94077
94078       var members = parent.members, member;
94079       for (var i = 0; i < members.length; i++) {
94080           member = members[i];
94081           if (member.id === entity.id && member.role && member.role !== 'outer')
94082               return false; // Not outer member
94083           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
94084               return false; // Not a simple multipolygon
94085       }
94086
94087       return parent;
94088   }
94089
94090
94091   function osmOldMultipolygonOuterMember(entity, graph) {
94092       if (entity.type !== 'way')
94093           return false;
94094
94095       var parents = graph.parentRelations(entity);
94096       if (parents.length !== 1)
94097           return false;
94098
94099       var parent = parents[0];
94100       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
94101           return false;
94102
94103       var members = parent.members, member, outerMember;
94104       for (var i = 0; i < members.length; i++) {
94105           member = members[i];
94106           if (!member.role || member.role === 'outer') {
94107               if (outerMember)
94108                   return false; // Not a simple multipolygon
94109               outerMember = member;
94110           }
94111       }
94112
94113       if (!outerMember)
94114           return false;
94115
94116       var outerEntity = graph.hasEntity(outerMember.id);
94117       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
94118           return false;
94119
94120       return outerEntity;
94121   }
94122
94123
94124   // Join `toJoin` array into sequences of connecting ways.
94125
94126   // Segments which share identical start/end nodes will, as much as possible,
94127   // be connected with each other.
94128   //
94129   // The return value is a nested array. Each constituent array contains elements
94130   // of `toJoin` which have been determined to connect.
94131   //
94132   // Each consitituent array also has a `nodes` property whose value is an
94133   // ordered array of member nodes, with appropriate order reversal and
94134   // start/end coordinate de-duplication.
94135   //
94136   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
94137   // Thus either an array of `osmWay`s or a relation member array may be used.
94138   //
94139   // If an member is an `osmWay`, its tags and childnodes may be reversed via
94140   // `actionReverse` in the output.
94141   //
94142   // The returned sequences array also has an `actions` array property, containing
94143   // any reversal actions that should be applied to the graph, should the calling
94144   // code attempt to actually join the given ways.
94145   //
94146   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
94147   // false) and non-way members are ignored.
94148   //
94149   function osmJoinWays(toJoin, graph) {
94150       function resolve(member) {
94151           return graph.childNodes(graph.entity(member.id));
94152       }
94153
94154       function reverse(item) {
94155           var action = actionReverse(item.id, { reverseOneway: true });
94156           sequences.actions.push(action);
94157           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
94158       }
94159
94160       // make a copy containing only the items to join
94161       toJoin = toJoin.filter(function(member) {
94162           return member.type === 'way' && graph.hasEntity(member.id);
94163       });
94164
94165       // Are the things we are joining relation members or `osmWays`?
94166       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
94167       var i;
94168       var joinAsMembers = true;
94169       for (i = 0; i < toJoin.length; i++) {
94170           if (toJoin[i] instanceof osmWay) {
94171               joinAsMembers = false;
94172               break;
94173           }
94174       }
94175
94176       var sequences = [];
94177       sequences.actions = [];
94178
94179       while (toJoin.length) {
94180           // start a new sequence
94181           var item = toJoin.shift();
94182           var currWays = [item];
94183           var currNodes = resolve(item).slice();
94184           var doneSequence = false;
94185
94186           // add to it
94187           while (toJoin.length && !doneSequence) {
94188               var start = currNodes[0];
94189               var end = currNodes[currNodes.length - 1];
94190               var fn = null;
94191               var nodes = null;
94192
94193               // Find the next way/member to join.
94194               for (i = 0; i < toJoin.length; i++) {
94195                   item = toJoin[i];
94196                   nodes = resolve(item);
94197
94198                   // (for member ordering only, not way ordering - see #4872)
94199                   // Strongly prefer to generate a forward path that preserves the order
94200                   // of the members array. For multipolygons and most relations, member
94201                   // order does not matter - but for routes, it does. (see #4589)
94202                   // If we started this sequence backwards (i.e. next member way attaches to
94203                   // the start node and not the end node), reverse the initial way before continuing.
94204                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
94205                       (nodes[nodes.length - 1] === start || nodes[0] === start)
94206                   ) {
94207                       currWays[0] = reverse(currWays[0]);
94208                       currNodes.reverse();
94209                       start = currNodes[0];
94210                       end = currNodes[currNodes.length - 1];
94211                   }
94212
94213                   if (nodes[0] === end) {
94214                       fn = currNodes.push;               // join to end
94215                       nodes = nodes.slice(1);
94216                       break;
94217                   } else if (nodes[nodes.length - 1] === end) {
94218                       fn = currNodes.push;               // join to end
94219                       nodes = nodes.slice(0, -1).reverse();
94220                       item = reverse(item);
94221                       break;
94222                   } else if (nodes[nodes.length - 1] === start) {
94223                       fn = currNodes.unshift;            // join to beginning
94224                       nodes = nodes.slice(0, -1);
94225                       break;
94226                   } else if (nodes[0] === start) {
94227                       fn = currNodes.unshift;            // join to beginning
94228                       nodes = nodes.slice(1).reverse();
94229                       item = reverse(item);
94230                       break;
94231                   } else {
94232                       fn = nodes = null;
94233                   }
94234               }
94235
94236               if (!nodes) {     // couldn't find a joinable way/member
94237                   doneSequence = true;
94238                   break;
94239               }
94240
94241               fn.apply(currWays, [item]);
94242               fn.apply(currNodes, nodes);
94243
94244               toJoin.splice(i, 1);
94245           }
94246
94247           currWays.nodes = currNodes;
94248           sequences.push(currWays);
94249       }
94250
94251       return sequences;
94252   }
94253
94254   function osmRelation() {
94255       if (!(this instanceof osmRelation)) {
94256           return (new osmRelation()).initialize(arguments);
94257       } else if (arguments.length) {
94258           this.initialize(arguments);
94259       }
94260   }
94261
94262
94263   osmEntity.relation = osmRelation;
94264
94265   osmRelation.prototype = Object.create(osmEntity.prototype);
94266
94267
94268   osmRelation.creationOrder = function(a, b) {
94269       var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
94270       var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
94271
94272       if (aId < 0 || bId < 0) return aId - bId;
94273       return bId - aId;
94274   };
94275
94276
94277   assignIn(osmRelation.prototype, {
94278       type: 'relation',
94279       members: [],
94280
94281
94282       copy: function(resolver, copies) {
94283           if (copies[this.id]) return copies[this.id];
94284
94285           var copy = osmEntity.prototype.copy.call(this, resolver, copies);
94286
94287           var members = this.members.map(function(member) {
94288               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
94289           });
94290
94291           copy = copy.update({members: members});
94292           copies[this.id] = copy;
94293
94294           return copy;
94295       },
94296
94297
94298       extent: function(resolver, memo) {
94299           return resolver.transient(this, 'extent', function() {
94300               if (memo && memo[this.id]) return geoExtent();
94301               memo = memo || {};
94302               memo[this.id] = true;
94303
94304               var extent = geoExtent();
94305               for (var i = 0; i < this.members.length; i++) {
94306                   var member = resolver.hasEntity(this.members[i].id);
94307                   if (member) {
94308                       extent._extend(member.extent(resolver, memo));
94309                   }
94310               }
94311               return extent;
94312           });
94313       },
94314
94315
94316       geometry: function(graph) {
94317           return graph.transient(this, 'geometry', function() {
94318               return this.isMultipolygon() ? 'area' : 'relation';
94319           });
94320       },
94321
94322
94323       isDegenerate: function() {
94324           return this.members.length === 0;
94325       },
94326
94327
94328       // Return an array of members, each extended with an 'index' property whose value
94329       // is the member index.
94330       indexedMembers: function() {
94331           var result = new Array(this.members.length);
94332           for (var i = 0; i < this.members.length; i++) {
94333               result[i] = assignIn({}, this.members[i], {index: i});
94334           }
94335           return result;
94336       },
94337
94338
94339       // Return the first member with the given role. A copy of the member object
94340       // is returned, extended with an 'index' property whose value is the member index.
94341       memberByRole: function(role) {
94342           for (var i = 0; i < this.members.length; i++) {
94343               if (this.members[i].role === role) {
94344                   return assignIn({}, this.members[i], {index: i});
94345               }
94346           }
94347       },
94348
94349       // Same as memberByRole, but returns all members with the given role
94350       membersByRole: function(role) {
94351           var result = [];
94352           for (var i = 0; i < this.members.length; i++) {
94353               if (this.members[i].role === role) {
94354                   result.push(assignIn({}, this.members[i], {index: i}));
94355               }
94356           }
94357           return result;
94358       },
94359
94360       // Return the first member with the given id. A copy of the member object
94361       // is returned, extended with an 'index' property whose value is the member index.
94362       memberById: function(id) {
94363           for (var i = 0; i < this.members.length; i++) {
94364               if (this.members[i].id === id) {
94365                   return assignIn({}, this.members[i], {index: i});
94366               }
94367           }
94368       },
94369
94370
94371       // Return the first member with the given id and role. A copy of the member object
94372       // is returned, extended with an 'index' property whose value is the member index.
94373       memberByIdAndRole: function(id, role) {
94374           for (var i = 0; i < this.members.length; i++) {
94375               if (this.members[i].id === id && this.members[i].role === role) {
94376                   return assignIn({}, this.members[i], {index: i});
94377               }
94378           }
94379       },
94380
94381
94382       addMember: function(member, index) {
94383           var members = this.members.slice();
94384           members.splice(index === undefined ? members.length : index, 0, member);
94385           return this.update({members: members});
94386       },
94387
94388
94389       updateMember: function(member, index) {
94390           var members = this.members.slice();
94391           members.splice(index, 1, assignIn({}, members[index], member));
94392           return this.update({members: members});
94393       },
94394
94395
94396       removeMember: function(index) {
94397           var members = this.members.slice();
94398           members.splice(index, 1);
94399           return this.update({members: members});
94400       },
94401
94402
94403       removeMembersWithID: function(id) {
94404           var members = reject(this.members, function(m) { return m.id === id; });
94405           return this.update({members: members});
94406       },
94407
94408
94409       // Wherever a member appears with id `needle.id`, replace it with a member
94410       // with id `replacement.id`, type `replacement.type`, and the original role,
94411       // By default, adding a duplicate member (by id and role) is prevented.
94412       // Return an updated relation.
94413       replaceMember: function(needle, replacement, keepDuplicates) {
94414           if (!this.memberById(needle.id))
94415               return this;
94416
94417           var members = [];
94418
94419           for (var i = 0; i < this.members.length; i++) {
94420               var member = this.members[i];
94421               if (member.id !== needle.id) {
94422                   members.push(member);
94423               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
94424                   members.push({id: replacement.id, type: replacement.type, role: member.role});
94425               }
94426           }
94427
94428           return this.update({members: members});
94429       },
94430
94431
94432       asJXON: function(changeset_id) {
94433           var r = {
94434               relation: {
94435                   '@id': this.osmId(),
94436                   '@version': this.version || 0,
94437                   member: map$3(this.members, function(member) {
94438                       return {
94439                           keyAttributes: {
94440                               type: member.type,
94441                               role: member.role,
94442                               ref: osmEntity.id.toOSM(member.id)
94443                           }
94444                       };
94445                   }),
94446                   tag: map$3(this.tags, function(v, k) {
94447                       return { keyAttributes: { k: k, v: v } };
94448                   })
94449               }
94450           };
94451           if (changeset_id) r.relation['@changeset'] = changeset_id;
94452           return r;
94453       },
94454
94455
94456       asGeoJSON: function(resolver) {
94457           return resolver.transient(this, 'GeoJSON', function () {
94458               if (this.isMultipolygon()) {
94459                   return {
94460                       type: 'MultiPolygon',
94461                       coordinates: this.multipolygon(resolver)
94462                   };
94463               } else {
94464                   return {
94465                       type: 'FeatureCollection',
94466                       properties: this.tags,
94467                       features: this.members.map(function (member) {
94468                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
94469                       })
94470                   };
94471               }
94472           });
94473       },
94474
94475
94476       area: function(resolver) {
94477           return resolver.transient(this, 'area', function() {
94478               return d3_geoArea(this.asGeoJSON(resolver));
94479           });
94480       },
94481
94482
94483       isMultipolygon: function() {
94484           return this.tags.type === 'multipolygon';
94485       },
94486
94487
94488       isComplete: function(resolver) {
94489           for (var i = 0; i < this.members.length; i++) {
94490               if (!resolver.hasEntity(this.members[i].id)) {
94491                   return false;
94492               }
94493           }
94494           return true;
94495       },
94496
94497
94498       isRestriction: function() {
94499           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
94500       },
94501
94502
94503       isValidRestriction: function() {
94504           if (!this.isRestriction()) return false;
94505
94506           var froms = this.members.filter(function(m) { return m.role === 'from'; });
94507           var vias = this.members.filter(function(m) { return m.role === 'via'; });
94508           var tos = this.members.filter(function(m) { return m.role === 'to'; });
94509
94510           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
94511           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
94512
94513           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
94514           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
94515
94516           if (vias.length === 0) return false;
94517           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
94518
94519           return true;
94520       },
94521
94522
94523       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
94524       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
94525       //
94526       // This corresponds to the structure needed for rendering a multipolygon path using a
94527       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
94528       //
94529       // In the case of invalid geometries, this function will still return a result which
94530       // includes the nodes of all way members, but some Nds may be unclosed and some inner
94531       // rings not matched with the intended outer ring.
94532       //
94533       multipolygon: function(resolver) {
94534           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
94535           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
94536
94537           outers = osmJoinWays(outers, resolver);
94538           inners = osmJoinWays(inners, resolver);
94539
94540           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
94541           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
94542
94543           var result = outers.map(function(o) {
94544               // Heuristic for detecting counterclockwise winding order. Assumes
94545               // that OpenStreetMap polygons are not hemisphere-spanning.
94546               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
94547           });
94548
94549           function findOuter(inner) {
94550               var o, outer;
94551
94552               for (o = 0; o < outers.length; o++) {
94553                   outer = outers[o];
94554                   if (geoPolygonContainsPolygon(outer, inner))
94555                       return o;
94556               }
94557
94558               for (o = 0; o < outers.length; o++) {
94559                   outer = outers[o];
94560                   if (geoPolygonIntersectsPolygon(outer, inner, false))
94561                       return o;
94562               }
94563           }
94564
94565           for (var i = 0; i < inners.length; i++) {
94566               var inner = inners[i];
94567
94568               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
94569                   inner = inner.reverse();
94570               }
94571
94572               var o = findOuter(inners[i]);
94573               if (o !== undefined)
94574                   result[o].push(inners[i]);
94575               else
94576                   result.push([inners[i]]); // Invalid geometry
94577           }
94578
94579           return result;
94580       }
94581   });
94582
94583   var services$1 = {improveOSM:{errorTypes:{ow:{icon:"fas-long-arrow-alt-right",category:"routing"},"mr-both":{icon:"maki-car",category:"geometry"},"mr-parking":{icon:"maki-parking",category:"geometry"},"mr-path":{icon:"maki-shoe",category:"geometry"},"mr-road":{icon:"maki-car",category:"geometry"},tr:{icon:"temaki-junction",category:"routing"}}},keepRight:{errorTypes:{}}};
94584
94585   function qaError() {
94586       if (!(this instanceof qaError)) {
94587           return (new qaError()).initialize(arguments);
94588       } else if (arguments.length) {
94589           this.initialize(arguments);
94590       }
94591   }
94592
94593   // Generic handling for services without nice IDs
94594   qaError.id = function() {
94595       return qaError.id.next--;
94596   };
94597
94598   qaError.id.next = -1;
94599
94600   assignIn(qaError.prototype, {
94601       type: 'qaError',
94602
94603       // All errors need a position
94604       loc: [0, 0],
94605
94606       // These should be passed in, used to retrieve from qa_errors.json
94607       service: '',
94608       error_type: '',
94609
94610       initialize: function(sources) {
94611           for (var i = 0; i < sources.length; ++i) {
94612               var source = sources[i];
94613               for (var prop in source) {
94614                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
94615                       if (source[prop] === undefined) {
94616                           delete this[prop];
94617                       } else {
94618                           this[prop] = source[prop];
94619                       }
94620                   }
94621               }
94622           }
94623
94624           // Extract common error information from data
94625           if (this.service && this.error_type) {
94626               var serviceInfo = services$1[this.service];
94627
94628               if (serviceInfo) {
94629                   var errInfo = serviceInfo.errorTypes[this.error_type];
94630
94631                   if (errInfo) {
94632                       this.icon = errInfo.icon;
94633                       this.category = errInfo.category;
94634                   }
94635               }
94636           }
94637
94638           // All errors must have an ID for selection
94639           if (!this.id) {
94640               this.id = qaError.id() + '';  // as string
94641           }
94642
94643           return this;
94644       },
94645
94646       update: function(attrs) {
94647           return qaError(this, attrs); // {v: 1 + (this.v || 0)}
94648       }
94649   });
94650
94651   function osmTurn(turn) {
94652       if (!(this instanceof osmTurn)) {
94653           return new osmTurn(turn);
94654       }
94655       assignIn(this, turn);
94656   }
94657
94658
94659   function osmIntersection(graph, startVertexId, maxDistance) {
94660       maxDistance = maxDistance || 30;    // in meters
94661       var vgraph = coreGraph();           // virtual graph
94662       var i, j, k;
94663
94664
94665       function memberOfRestriction(entity) {
94666           return graph.parentRelations(entity)
94667               .some(function(r) { return r.isRestriction(); });
94668       }
94669
94670       function isRoad(way) {
94671           if (way.isArea() || way.isDegenerate()) return false;
94672           var roads = {
94673               'motorway': true,
94674               'motorway_link': true,
94675               'trunk': true,
94676               'trunk_link': true,
94677               'primary': true,
94678               'primary_link': true,
94679               'secondary': true,
94680               'secondary_link': true,
94681               'tertiary': true,
94682               'tertiary_link': true,
94683               'residential': true,
94684               'unclassified': true,
94685               'living_street': true,
94686               'service': true,
94687               'road': true,
94688               'track': true
94689           };
94690           return roads[way.tags.highway];
94691       }
94692
94693
94694       var startNode = graph.entity(startVertexId);
94695       var checkVertices = [startNode];
94696       var checkWays;
94697       var vertices = [];
94698       var vertexIds = [];
94699       var vertex;
94700       var ways = [];
94701       var wayIds = [];
94702       var way;
94703       var nodes = [];
94704       var node;
94705       var parents = [];
94706       var parent;
94707
94708       // `actions` will store whatever actions must be performed to satisfy
94709       // preconditions for adding a turn restriction to this intersection.
94710       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
94711       //  - Reverse oneways so that they are drawn in the forward direction
94712       //  - Split ways on key vertices
94713       var actions = [];
94714
94715
94716       // STEP 1:  walk the graph outwards from starting vertex to search
94717       //  for more key vertices and ways to include in the intersection..
94718
94719       while (checkVertices.length) {
94720           vertex = checkVertices.pop();
94721
94722           // check this vertex for parent ways that are roads
94723           checkWays = graph.parentWays(vertex);
94724           var hasWays = false;
94725           for (i = 0; i < checkWays.length; i++) {
94726               way = checkWays[i];
94727               if (!isRoad(way) && !memberOfRestriction(way)) continue;
94728
94729               ways.push(way);   // it's a road, or it's already in a turn restriction
94730               hasWays = true;
94731
94732               // check the way's children for more key vertices
94733               nodes = uniq(graph.childNodes(way));
94734               for (j = 0; j < nodes.length; j++) {
94735                   node = nodes[j];
94736                   if (node === vertex) continue;                                           // same thing
94737                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
94738                   if (node.loc && startNode.loc &&
94739                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
94740
94741                   // a key vertex will have parents that are also roads
94742                   var hasParents = false;
94743                   parents = graph.parentWays(node);
94744                   for (k = 0; k < parents.length; k++) {
94745                       parent = parents[k];
94746                       if (parent === way) continue;                 // same thing
94747                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
94748                       if (!isRoad(parent)) continue;                // not a road
94749                       hasParents = true;
94750                       break;
94751                   }
94752
94753                   if (hasParents) {
94754                       checkVertices.push(node);
94755                   }
94756               }
94757           }
94758
94759           if (hasWays) {
94760               vertices.push(vertex);
94761           }
94762       }
94763
94764       vertices = uniq(vertices);
94765       ways = uniq(ways);
94766
94767
94768       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
94769       // Everything done after this step should act on the virtual graph
94770       // Any actions that must be performed later to the main graph go in `actions` array
94771       ways.forEach(function(way) {
94772           graph.childNodes(way).forEach(function(node) {
94773               vgraph = vgraph.replace(node);
94774           });
94775
94776           vgraph = vgraph.replace(way);
94777
94778           graph.parentRelations(way).forEach(function(relation) {
94779               if (relation.isRestriction()) {
94780                   if (relation.isValidRestriction(graph)) {
94781                       vgraph = vgraph.replace(relation);
94782                   } else if (relation.isComplete(graph)) {
94783                       actions.push(actionDeleteRelation(relation.id));
94784                   }
94785               }
94786           });
94787       });
94788
94789
94790       // STEP 3:  Force all oneways to be drawn in the forward direction
94791       ways.forEach(function(w) {
94792           var way = vgraph.entity(w.id);
94793           if (way.tags.oneway === '-1') {
94794               var action = actionReverse(way.id, { reverseOneway: true });
94795               actions.push(action);
94796               vgraph = action(vgraph);
94797           }
94798       });
94799
94800
94801       // STEP 4:  Split ways on key vertices
94802       var origCount = osmEntity.id.next.way;
94803       vertices.forEach(function(v) {
94804           // This is an odd way to do it, but we need to find all the ways that
94805           // will be split here, then split them one at a time to ensure that these
94806           // actions can be replayed on the main graph exactly in the same order.
94807           // (It is unintuitive, but the order of ways returned from graph.parentWays()
94808           // is arbitrary, depending on how the main graph and vgraph were built)
94809           var splitAll = actionSplit(v.id);
94810           if (!splitAll.disabled(vgraph)) {
94811               splitAll.ways(vgraph).forEach(function(way) {
94812                   var splitOne = actionSplit(v.id).limitWays([way.id]);
94813                   actions.push(splitOne);
94814                   vgraph = splitOne(vgraph);
94815               });
94816           }
94817       });
94818
94819       // In here is where we should also split the intersection at nearby junction.
94820       //   for https://github.com/mapbox/iD-internal/issues/31
94821       // nearbyVertices.forEach(function(v) {
94822       // });
94823
94824       // Reasons why we reset the way id count here:
94825       //  1. Continuity with way ids created by the splits so that we can replay
94826       //     these actions later if the user decides to create a turn restriction
94827       //  2. Avoids churning way ids just by hovering over a vertex
94828       //     and displaying the turn restriction editor
94829       osmEntity.id.next.way = origCount;
94830
94831
94832       // STEP 5:  Update arrays to point to vgraph entities
94833       vertexIds = vertices.map(function(v) { return v.id; });
94834       vertices = [];
94835       ways = [];
94836
94837       vertexIds.forEach(function(id) {
94838           var vertex = vgraph.entity(id);
94839           var parents = vgraph.parentWays(vertex);
94840           vertices.push(vertex);
94841           ways = ways.concat(parents);
94842       });
94843
94844       vertices = uniq(vertices);
94845       ways = uniq(ways);
94846
94847       vertexIds = vertices.map(function(v) { return v.id; });
94848       wayIds = ways.map(function(w) { return w.id; });
94849
94850
94851       // STEP 6:  Update the ways with some metadata that will be useful for
94852       // walking the intersection graph later and rendering turn arrows.
94853
94854       function withMetadata(way, vertexIds) {
94855           var __oneWay = way.isOneWay();
94856
94857           // which affixes are key vertices?
94858           var __first = (vertexIds.indexOf(way.first()) !== -1);
94859           var __last = (vertexIds.indexOf(way.last()) !== -1);
94860
94861           // what roles is this way eligible for?
94862           var __via = (__first && __last);
94863           var __from = ((__first && !__oneWay) || __last);
94864           var __to = (__first || (__last && !__oneWay));
94865
94866           return way.update({
94867               __first:  __first,
94868               __last:  __last,
94869               __from:  __from,
94870               __via: __via,
94871               __to:  __to,
94872               __oneWay:  __oneWay
94873           });
94874       }
94875
94876       ways = [];
94877       wayIds.forEach(function(id) {
94878           var way = withMetadata(vgraph.entity(id), vertexIds);
94879           vgraph = vgraph.replace(way);
94880           ways.push(way);
94881       });
94882
94883
94884       // STEP 7:  Simplify - This is an iterative process where we:
94885       //  1. Find trivial vertices with only 2 parents
94886       //  2. trim off the leaf way from those vertices and remove from vgraph
94887
94888       var keepGoing;
94889       var removeWayIds = [];
94890       var removeVertexIds = [];
94891
94892       do {
94893           keepGoing = false;
94894           checkVertices = vertexIds.slice();
94895
94896           for (i = 0; i < checkVertices.length; i++) {
94897               var vertexId = checkVertices[i];
94898               vertex = vgraph.hasEntity(vertexId);
94899
94900               if (!vertex) {
94901                   if (vertexIds.indexOf(vertexId) !== -1) {
94902                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94903                   }
94904                   removeVertexIds.push(vertexId);
94905                   continue;
94906               }
94907
94908               parents = vgraph.parentWays(vertex);
94909               if (parents.length < 3) {
94910                   if (vertexIds.indexOf(vertexId) !== -1) {
94911                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94912                   }
94913               }
94914
94915               if (parents.length === 2) {     // vertex with 2 parents is trivial
94916                   var a = parents[0];
94917                   var b = parents[1];
94918                   var aIsLeaf = a && !a.__via;
94919                   var bIsLeaf = b && !b.__via;
94920                   var leaf, survivor;
94921
94922                   if (aIsLeaf && !bIsLeaf) {
94923                       leaf = a;
94924                       survivor = b;
94925                   } else if (!aIsLeaf && bIsLeaf) {
94926                       leaf = b;
94927                       survivor = a;
94928                   }
94929
94930                   if (leaf && survivor) {
94931                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
94932                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
94933                       removeWayIds.push(leaf.id);
94934                       keepGoing = true;
94935                   }
94936               }
94937
94938               parents = vgraph.parentWays(vertex);
94939
94940               if (parents.length < 2) {     // vertex is no longer a key vertex
94941                   if (vertexIds.indexOf(vertexId) !== -1) {
94942                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
94943                   }
94944                   removeVertexIds.push(vertexId);
94945                   keepGoing = true;
94946               }
94947
94948               if (parents.length < 1) {     // vertex is no longer attached to anything
94949                   vgraph = vgraph.remove(vertex);
94950               }
94951
94952           }
94953       } while (keepGoing);
94954
94955
94956       vertices = vertices
94957           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
94958           .map(function(vertex) { return vgraph.entity(vertex.id); });
94959       ways = ways
94960           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
94961           .map(function(way) { return vgraph.entity(way.id); });
94962
94963
94964       // OK!  Here is our intersection..
94965       var intersection = {
94966           graph: vgraph,
94967           actions: actions,
94968           vertices: vertices,
94969           ways: ways,
94970       };
94971
94972
94973
94974       // Get all the valid turns through this intersection given a starting way id.
94975       // This operates on the virtual graph for everything.
94976       //
94977       // Basically, walk through all possible paths from starting way,
94978       //   honoring the existing turn restrictions as we go (watch out for loops!)
94979       //
94980       // For each path found, generate and return a `osmTurn` datastructure.
94981       //
94982       intersection.turns = function(fromWayId, maxViaWay) {
94983           if (!fromWayId) return [];
94984           if (!maxViaWay) maxViaWay = 0;
94985
94986           var vgraph = intersection.graph;
94987           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
94988
94989           var start = vgraph.entity(fromWayId);
94990           if (!start || !(start.__from || start.__via)) return [];
94991
94992           // maxViaWay=0   from-*-to              (0 vias)
94993           // maxViaWay=1   from-*-via-*-to        (1 via max)
94994           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
94995           var maxPathLength = (maxViaWay * 2) + 3;
94996           var turns = [];
94997
94998           step(start);
94999           return turns;
95000
95001
95002           // traverse the intersection graph and find all the valid paths
95003           function step(entity, currPath, currRestrictions, matchedRestriction) {
95004               currPath = clone(currPath || []);
95005               if (currPath.length >= maxPathLength) return;
95006               currPath.push(entity.id);
95007               currRestrictions = clone(currRestrictions || []);
95008               var i, j;
95009
95010               if (entity.type === 'node') {
95011                   var parents = vgraph.parentWays(entity);
95012                   var nextWays = [];
95013
95014                   // which ways can we step into?
95015                   for (i = 0; i < parents.length; i++) {
95016                       var way = parents[i];
95017
95018                       // if next way is a oneway incoming to this vertex, skip
95019                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
95020
95021                       // if we have seen it before (allowing for an initial u-turn), skip
95022                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
95023
95024                       // Check all "current" restrictions (where we've already walked the `FROM`)
95025                       var restrict = undefined;
95026                       for (j = 0; j < currRestrictions.length; j++) {
95027                           var restriction = currRestrictions[j];
95028                           var f = restriction.memberByRole('from');
95029                           var v = restriction.membersByRole('via');
95030                           var t = restriction.memberByRole('to');
95031                           var isOnly = /^only_/.test(restriction.tags.restriction);
95032
95033                           // Does the current path match this turn restriction?
95034                           var matchesFrom = (f.id === fromWayId);
95035                           var matchesViaTo = false;
95036                           var isAlongOnlyPath = false;
95037
95038                           if (t.id === way.id) {     // match TO
95039
95040                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
95041                                   matchesViaTo = (v[0].id === entity.id && (
95042                                       (matchesFrom && currPath.length === 2) ||
95043                                       (!matchesFrom && currPath.length > 2)
95044                                   ));
95045
95046                               } else {                                         // match all VIA ways
95047                                   var pathVias = [];
95048                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
95049                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
95050                                   }
95051                                   var restrictionVias = [];
95052                                   for (k = 0; k < v.length; k++) {
95053                                       if (v[k].type === 'way') {
95054                                           restrictionVias.push(v[k].id);
95055                                       }
95056                                   }
95057                                   var diff = difference(pathVias, restrictionVias);
95058                                   matchesViaTo = !diff.length;
95059                               }
95060
95061                           } else if (isOnly) {
95062                               for (k = 0; k < v.length; k++) {
95063                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
95064                                   if (v[k].type === 'way' && v[k].id === way.id) {
95065                                       isAlongOnlyPath = true;
95066                                       break;
95067                                   }
95068                               }
95069                           }
95070
95071                           if (matchesViaTo) {
95072                               if (isOnly) {
95073                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
95074                               } else {
95075                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
95076                               }
95077                           } else {    // indirect - caused by a different nearby restriction
95078                               if (isAlongOnlyPath) {
95079                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
95080                               } else if (isOnly) {
95081                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
95082                               }
95083                           }
95084
95085                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
95086                           if (restrict && restrict.direct)
95087                               break;
95088                       }
95089
95090                       nextWays.push({ way: way, restrict: restrict });
95091                   }
95092
95093                   nextWays.forEach(function(nextWay) {
95094                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
95095                   });
95096
95097
95098               } else {  // entity.type === 'way'
95099                   if (currPath.length >= 3) {     // this is a "complete" path..
95100                       var turnPath = clone(currPath);
95101
95102                       // an indirect restriction - only include the partial path (starting at FROM)
95103                       if (matchedRestriction && matchedRestriction.direct === false) {
95104                           for (i = 0; i < turnPath.length; i++) {
95105                               if (turnPath[i] === matchedRestriction.from) {
95106                                   turnPath = turnPath.slice(i);
95107                                   break;
95108                               }
95109                           }
95110                       }
95111
95112                       var turn = pathToTurn(turnPath);
95113                       if (turn) {
95114                           if (matchedRestriction) {
95115                               turn.restrictionID = matchedRestriction.id;
95116                               turn.no = matchedRestriction.no;
95117                               turn.only = matchedRestriction.only;
95118                               turn.direct = matchedRestriction.direct;
95119                           }
95120                           turns.push(osmTurn(turn));
95121                       }
95122
95123                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
95124                   }
95125
95126                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
95127
95128                   // which nodes can we step into?
95129                   var n1 = vgraph.entity(entity.first());
95130                   var n2 = vgraph.entity(entity.last());
95131                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
95132                   var nextNodes = [];
95133
95134                   if (currPath.length > 1) {
95135                       if (dist > maxDistance) return;   // the next node is too far
95136                       if (!entity.__via) return;        // this way is a leaf / can't be a via
95137                   }
95138
95139                   if (!entity.__oneWay &&                     // bidirectional..
95140                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
95141                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
95142                       nextNodes.push(n1);                     // can advance to first node
95143                   }
95144                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
95145                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
95146                       nextNodes.push(n2);                     // can advance to last node
95147                   }
95148
95149                   nextNodes.forEach(function(nextNode) {
95150                       // gather restrictions FROM this way
95151                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
95152                           if (!r.isRestriction()) return false;
95153
95154                           var f = r.memberByRole('from');
95155                           if (!f || f.id !== entity.id) return false;
95156
95157                           var isOnly = /^only_/.test(r.tags.restriction);
95158                           if (!isOnly) return true;
95159
95160                           // `only_` restrictions only matter along the direction of the VIA - #4849
95161                           var isOnlyVia = false;
95162                           var v = r.membersByRole('via');
95163                           if (v.length === 1 && v[0].type === 'node') {   // via node
95164                               isOnlyVia = (v[0].id === nextNode.id);
95165                           } else {                                        // via way(s)
95166                               for (var i = 0; i < v.length; i++) {
95167                                   if (v[i].type !== 'way') continue;
95168                                   var viaWay = vgraph.entity(v[i].id);
95169                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
95170                                       isOnlyVia = true;
95171                                       break;
95172                                   }
95173                               }
95174                           }
95175                           return isOnlyVia;
95176                       });
95177
95178                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
95179                   });
95180               }
95181           }
95182
95183
95184           // assumes path is alternating way-node-way of odd length
95185           function pathToTurn(path) {
95186               if (path.length < 3) return;
95187               var fromWayId, fromNodeId, fromVertexId;
95188               var toWayId, toNodeId, toVertexId;
95189               var viaWayIds, viaNodeId, isUturn;
95190
95191               fromWayId = path[0];
95192               toWayId = path[path.length - 1];
95193
95194               if (path.length === 3 && fromWayId === toWayId) {  // u turn
95195                   var way = vgraph.entity(fromWayId);
95196                   if (way.__oneWay) return null;
95197
95198                   isUturn = true;
95199                   viaNodeId = fromVertexId = toVertexId = path[1];
95200                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
95201
95202               } else {
95203                   isUturn = false;
95204                   fromVertexId = path[1];
95205                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
95206                   toVertexId = path[path.length - 2];
95207                   toNodeId = adjacentNode(toWayId, toVertexId);
95208
95209                   if (path.length === 3) {
95210                       viaNodeId = path[1];
95211                   } else {
95212                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
95213                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
95214                   }
95215               }
95216
95217               return {
95218                   key:  path.join('_'),
95219                   path: path,
95220                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
95221                   via:  { node: viaNodeId,  ways: viaWayIds },
95222                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
95223                   u:    isUturn
95224               };
95225
95226
95227               function adjacentNode(wayId, affixId) {
95228                   var nodes = vgraph.entity(wayId).nodes;
95229                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
95230               }
95231           }
95232
95233       };
95234
95235       return intersection;
95236   }
95237
95238
95239   function osmInferRestriction(graph, turn, projection) {
95240       var fromWay = graph.entity(turn.from.way);
95241       var fromNode = graph.entity(turn.from.node);
95242       var fromVertex = graph.entity(turn.from.vertex);
95243       var toWay = graph.entity(turn.to.way);
95244       var toNode = graph.entity(turn.to.node);
95245       var toVertex = graph.entity(turn.to.vertex);
95246
95247       var fromOneWay = (fromWay.tags.oneway === 'yes');
95248       var toOneWay = (toWay.tags.oneway === 'yes');
95249       var angle = (geoAngle(fromVertex, fromNode, projection) -
95250                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
95251
95252       while (angle < 0)
95253           angle += 360;
95254
95255       if (fromNode === toNode)
95256           return 'no_u_turn';
95257       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
95258           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
95259       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
95260           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
95261       if (angle < 158)
95262           return 'no_right_turn';
95263       if (angle > 202)
95264           return 'no_left_turn';
95265
95266       return 'no_straight_on';
95267   }
95268
95269   function actionAddMember(relationId, member, memberIndex, insertPair) {
95270
95271       return function action(graph) {
95272           var relation = graph.entity(relationId);
95273
95274           // There are some special rules for Public Transport v2 routes.
95275           var isPTv2 = /stop|platform/.test(member.role);
95276
95277           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
95278               // Try to perform sensible inserts based on how the ways join together
95279               graph = addWayMember(relation, graph);
95280           } else {
95281               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
95282               // Stops and Platforms for PTv2 should be ordered first.
95283               // hack: We do not currently have the ability to place them in the exactly correct order.
95284               if (isPTv2 && isNaN(memberIndex)) {
95285                   memberIndex = 0;
95286               }
95287
95288               graph = graph.replace(relation.addMember(member, memberIndex));
95289           }
95290
95291           return graph;
95292       };
95293
95294
95295       // Add a way member into the relation "wherever it makes sense".
95296       // In this situation we were not supplied a memberIndex.
95297       function addWayMember(relation, graph) {
95298           var groups, tempWay, item, i, j, k;
95299
95300           // remove PTv2 stops and platforms before doing anything.
95301           var PTv2members = [];
95302           var members = [];
95303           for (i = 0; i < relation.members.length; i++) {
95304               var m = relation.members[i];
95305               if (/stop|platform/.test(m.role)) {
95306                   PTv2members.push(m);
95307               } else {
95308                   members.push(m);
95309               }
95310           }
95311           relation = relation.update({ members: members });
95312
95313
95314           if (insertPair) {
95315               // We're adding a member that must stay paired with an existing member.
95316               // (This feature is used by `actionSplit`)
95317               //
95318               // This is tricky because the members may exist multiple times in the
95319               // member list, and with different A-B/B-A ordering and different roles.
95320               // (e.g. a bus route that loops out and back - #4589).
95321               //
95322               // Replace the existing member with a temporary way,
95323               // so that `osmJoinWays` can treat the pair like a single way.
95324               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
95325               graph = graph.replace(tempWay);
95326               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
95327               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
95328               groups = groupBy(tempRelation.members, function(m) { return m.type; });
95329               groups.way = groups.way || [];
95330
95331           } else {
95332               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
95333               groups = groupBy(relation.members, function(m) { return m.type; });
95334               groups.way = groups.way || [];
95335               groups.way.push(member);
95336           }
95337
95338           members = withIndex(groups.way);
95339           var joined = osmJoinWays(members, graph);
95340
95341           // `joined` might not contain all of the way members,
95342           // But will contain only the completed (downloaded) members
95343           for (i = 0; i < joined.length; i++) {
95344               var segment = joined[i];
95345               var nodes = segment.nodes.slice();
95346               var startIndex = segment[0].index;
95347
95348               // j = array index in `members` where this segment starts
95349               for (j = 0; j < members.length; j++) {
95350                   if (members[j].index === startIndex) {
95351                       break;
95352                   }
95353               }
95354
95355               // k = each member in segment
95356               for (k = 0; k < segment.length; k++) {
95357                   item = segment[k];
95358                   var way = graph.entity(item.id);
95359
95360                   // If this is a paired item, generate members in correct order and role
95361                   if (tempWay && item.id === tempWay.id) {
95362                       if (nodes[0].id === insertPair.nodes[0]) {
95363                           item.pair = [
95364                               { id: insertPair.originalID, type: 'way', role: item.role },
95365                               { id: insertPair.insertedID, type: 'way', role: item.role }
95366                           ];
95367                       } else {
95368                           item.pair = [
95369                               { id: insertPair.insertedID, type: 'way', role: item.role },
95370                               { id: insertPair.originalID, type: 'way', role: item.role }
95371                           ];
95372                       }
95373                   }
95374
95375                   // reorder `members` if necessary
95376                   if (k > 0) {
95377                       if (j+k >= members.length || item.index !== members[j+k].index) {
95378                           moveMember(members, item.index, j+k);
95379                       }
95380                   }
95381
95382                   nodes.splice(0, way.nodes.length - 1);
95383               }
95384           }
95385
95386           if (tempWay) {
95387               graph = graph.remove(tempWay);
95388           }
95389
95390           // Final pass: skip dead items, split pairs, remove index properties
95391           var wayMembers = [];
95392           for (i = 0; i < members.length; i++) {
95393               item = members[i];
95394               if (item.index === -1) continue;
95395
95396               if (item.pair) {
95397                   wayMembers.push(item.pair[0]);
95398                   wayMembers.push(item.pair[1]);
95399               } else {
95400                   wayMembers.push(omit(item, 'index'));
95401               }
95402           }
95403
95404           // Put stops and platforms first, then nodes, ways, relations
95405           // This is recommended for Public Transport v2 routes:
95406           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
95407           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
95408
95409           return graph.replace(relation.update({members: newMembers}));
95410
95411
95412           // `moveMember()` changes the `members` array in place by splicing
95413           // the item with `.index = findIndex` to where it belongs,
95414           // and marking the old position as "dead" with `.index = -1`
95415           //
95416           // j=5, k=0                jk
95417           // segment                 5 4 7 6
95418           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
95419           //
95420           // j=5, k=1                j k
95421           // segment                 5 4 7 6
95422           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
95423           // members       0 1 2 3 x 5 4 6 7 8 9      moved
95424           //
95425           // j=5, k=2                j   k
95426           // segment                 5 4 7 6
95427           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
95428           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
95429           //
95430           // j=5, k=3                j     k
95431           // segment                 5 4 7 6
95432           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
95433           //
95434           function moveMember(arr, findIndex, toIndex) {
95435               for (var i = 0; i < arr.length; i++) {
95436                   if (arr[i].index === findIndex) {
95437                       break;
95438                   }
95439               }
95440
95441               var item = clone(arr[i]);
95442               arr[i].index = -1;   // mark as dead
95443               item.index = toIndex;
95444               arr.splice(toIndex, 0, item);
95445           }
95446
95447
95448           // This is the same as `Relation.indexedMembers`,
95449           // Except we don't want to index all the members, only the ways
95450           function withIndex(arr) {
95451               var result = new Array(arr.length);
95452               for (var i = 0; i < arr.length; i++) {
95453                   result[i] = clone(arr[i]);
95454                   result[i].index = i;
95455               }
95456               return result;
95457           }
95458       }
95459
95460   }
95461
95462   function actionAddMidpoint(midpoint, node) {
95463       return function(graph) {
95464           graph = graph.replace(node.move(midpoint.loc));
95465
95466           var parents = intersection(
95467               graph.parentWays(graph.entity(midpoint.edge[0])),
95468               graph.parentWays(graph.entity(midpoint.edge[1])));
95469
95470           parents.forEach(function(way) {
95471               for (var i = 0; i < way.nodes.length - 1; i++) {
95472                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
95473                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
95474
95475                       // Add only one midpoint on doubled-back segments,
95476                       // turning them into self-intersections.
95477                       return;
95478                   }
95479               }
95480           });
95481
95482           return graph;
95483       };
95484   }
95485
95486   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
95487   function actionAddVertex(wayId, nodeId, index) {
95488       return function(graph) {
95489           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
95490       };
95491   }
95492
95493   function actionChangeMember(relationId, member, memberIndex) {
95494       return function(graph) {
95495           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
95496       };
95497   }
95498
95499   function actionChangePreset(entityID, oldPreset, newPreset) {
95500       return function action(graph) {
95501           var entity = graph.entity(entityID);
95502           var geometry = entity.geometry(graph);
95503           var tags = entity.tags;
95504
95505           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
95506           if (newPreset) tags = newPreset.setTags(tags, geometry);
95507
95508           return graph.replace(entity.update({tags: tags}));
95509       };
95510   }
95511
95512   function actionChangeTags(entityId, tags) {
95513       return function(graph) {
95514           var entity = graph.entity(entityId);
95515           return graph.replace(entity.update({tags: tags}));
95516       };
95517   }
95518
95519   function actionCircularize(wayId, projection, maxAngle) {
95520       maxAngle = (maxAngle || 20) * Math.PI / 180;
95521
95522
95523       var action = function(graph, t) {
95524           if (t === null || !isFinite(t)) t = 1;
95525           t = Math.min(Math.max(+t, 0), 1);
95526
95527           var way = graph.entity(wayId),
95528               origNodes = {};
95529
95530           graph.childNodes(way).forEach(function(node) {
95531               if (!origNodes[node.id]) origNodes[node.id] = node;
95532           });
95533
95534           if (!way.isConvex(graph)) {
95535               graph = action.makeConvex(graph);
95536           }
95537
95538           var nodes = uniq(graph.childNodes(way)),
95539               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
95540               points = nodes.map(function(n) { return projection(n.loc); }),
95541               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
95542               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
95543               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
95544               sign = d3_polygonArea(points) > 0 ? 1 : -1,
95545               ids;
95546
95547           // we need atleast two key nodes for the algorithm to work
95548           if (!keyNodes.length) {
95549               keyNodes = [nodes[0]];
95550               keyPoints = [points[0]];
95551           }
95552
95553           if (keyNodes.length === 1) {
95554               var index = nodes.indexOf(keyNodes[0]),
95555                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
95556
95557               keyNodes.push(nodes[oppositeIndex]);
95558               keyPoints.push(points[oppositeIndex]);
95559           }
95560
95561           // key points and nodes are those connected to the ways,
95562           // they are projected onto the circle, inbetween nodes are moved
95563           // to constant intervals between key nodes, extra inbetween nodes are
95564           // added if necessary.
95565           for (var i = 0; i < keyPoints.length; i++) {
95566               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
95567                   startNode = keyNodes[i],
95568                   endNode = keyNodes[nextKeyNodeIndex],
95569                   startNodeIndex = nodes.indexOf(startNode),
95570                   endNodeIndex = nodes.indexOf(endNode),
95571                   numberNewPoints = -1,
95572                   indexRange = endNodeIndex - startNodeIndex,
95573                   nearNodes = {},
95574                   inBetweenNodes = [],
95575                   startAngle, endAngle, totalAngle, eachAngle,
95576                   angle, loc, node, origNode, j;
95577
95578               if (indexRange < 0) {
95579                   indexRange += nodes.length;
95580               }
95581
95582               // position this key node
95583               var distance = geoVecLength(centroid, keyPoints[i]);
95584               if (distance === 0) { distance = 1e-4; }
95585               keyPoints[i] = [
95586                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
95587                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
95588               ];
95589               loc = projection.invert(keyPoints[i]);
95590               node = keyNodes[i];
95591               origNode = origNodes[node.id];
95592               node = node.move(geoVecInterp(origNode.loc, loc, t));
95593               graph = graph.replace(node);
95594
95595               // figure out the between delta angle we want to match to
95596               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
95597               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
95598               totalAngle = endAngle - startAngle;
95599
95600               // detects looping around -pi/pi
95601               if (totalAngle * sign > 0) {
95602                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
95603               }
95604
95605               do {
95606                   numberNewPoints++;
95607                   eachAngle = totalAngle / (indexRange + numberNewPoints);
95608               } while (Math.abs(eachAngle) > maxAngle);
95609
95610
95611               // move existing nodes
95612               for (j = 1; j < indexRange; j++) {
95613                   angle = startAngle + j * eachAngle;
95614                   loc = projection.invert([
95615                       centroid[0] + Math.cos(angle) * radius,
95616                       centroid[1] + Math.sin(angle) * radius
95617                   ]);
95618
95619                   node = nodes[(j + startNodeIndex) % nodes.length];
95620                   origNode = origNodes[node.id];
95621                   nearNodes[node.id] = angle;
95622
95623                   node = node.move(geoVecInterp(origNode.loc, loc, t));
95624                   graph = graph.replace(node);
95625               }
95626
95627               // add new inbetween nodes if necessary
95628               for (j = 0; j < numberNewPoints; j++) {
95629                   angle = startAngle + (indexRange + j) * eachAngle;
95630                   loc = projection.invert([
95631                       centroid[0] + Math.cos(angle) * radius,
95632                       centroid[1] + Math.sin(angle) * radius
95633                   ]);
95634
95635                   // choose a nearnode to use as the original
95636                   var min = Infinity;
95637                   for (var nodeId in nearNodes) {
95638                       var nearAngle = nearNodes[nodeId],
95639                           dist = Math.abs(nearAngle - angle);
95640                       if (dist < min) {
95641                           dist = min;
95642                           origNode = origNodes[nodeId];
95643                       }
95644                   }
95645
95646                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
95647                   graph = graph.replace(node);
95648
95649                   nodes.splice(endNodeIndex + j, 0, node);
95650                   inBetweenNodes.push(node.id);
95651               }
95652
95653               // Check for other ways that share these keyNodes..
95654               // If keyNodes are adjacent in both ways,
95655               // we can add inBetween nodes to that shared way too..
95656               if (indexRange === 1 && inBetweenNodes.length) {
95657                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
95658                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
95659                       wayDirection1 = (endIndex1 - startIndex1);
95660                   if (wayDirection1 < -1) { wayDirection1 = 1; }
95661
95662                   /* eslint-disable no-loop-func */
95663                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
95664                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
95665                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
95666                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
95667                               wayDirection2 = (endIndex2 - startIndex2),
95668                               insertAt = endIndex2;
95669                           if (wayDirection2 < -1) { wayDirection2 = 1; }
95670
95671                           if (wayDirection1 !== wayDirection2) {
95672                               inBetweenNodes.reverse();
95673                               insertAt = startIndex2;
95674                           }
95675                           for (j = 0; j < inBetweenNodes.length; j++) {
95676                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
95677                           }
95678                           graph = graph.replace(sharedWay);
95679                       }
95680                   });
95681                   /* eslint-enable no-loop-func */
95682               }
95683
95684           }
95685
95686           // update the way to have all the new nodes
95687           ids = nodes.map(function(n) { return n.id; });
95688           ids.push(ids[0]);
95689
95690           way = way.update({nodes: ids});
95691           graph = graph.replace(way);
95692
95693           return graph;
95694       };
95695
95696
95697       action.makeConvex = function(graph) {
95698           var way = graph.entity(wayId),
95699               nodes = uniq(graph.childNodes(way)),
95700               points = nodes.map(function(n) { return projection(n.loc); }),
95701               sign = d3_polygonArea(points) > 0 ? 1 : -1,
95702               hull = d3_polygonHull(points);
95703
95704           // D3 convex hulls go counterclockwise..
95705           if (sign === -1) {
95706               nodes.reverse();
95707               points.reverse();
95708           }
95709
95710           for (var i = 0; i < hull.length - 1; i++) {
95711               var startIndex = points.indexOf(hull[i]),
95712                   endIndex = points.indexOf(hull[i+1]),
95713                   indexRange = (endIndex - startIndex);
95714
95715               if (indexRange < 0) {
95716                   indexRange += nodes.length;
95717               }
95718
95719               // move interior nodes to the surface of the convex hull..
95720               for (var j = 1; j < indexRange; j++) {
95721                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
95722                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
95723                   graph = graph.replace(node);
95724               }
95725           }
95726           return graph;
95727       };
95728
95729
95730       action.disabled = function(graph) {
95731           if (!graph.entity(wayId).isClosed())
95732               return 'not_closed';
95733       };
95734
95735
95736       action.transitionable = true;
95737
95738
95739       return action;
95740   }
95741
95742   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
95743   function actionDeleteWay(wayId) {
95744
95745
95746       function canDeleteNode(node, graph) {
95747           return !graph.parentWays(node).length &&
95748               !graph.parentRelations(node).length &&
95749               !node.hasInterestingTags();
95750       }
95751
95752
95753       var action = function(graph) {
95754           var way = graph.entity(wayId);
95755
95756           graph.parentRelations(way)
95757               .forEach(function(parent) {
95758                   parent = parent.removeMembersWithID(wayId);
95759                   graph = graph.replace(parent);
95760
95761                   if (parent.isDegenerate()) {
95762                       graph = actionDeleteRelation(parent.id)(graph);
95763                   }
95764               });
95765
95766           uniq(way.nodes).forEach(function(nodeId) {
95767               graph = graph.replace(way.removeNode(nodeId));
95768
95769               var node = graph.entity(nodeId);
95770               if (canDeleteNode(node, graph)) {
95771                   graph = graph.remove(node);
95772               }
95773           });
95774
95775           return graph.remove(way);
95776       };
95777
95778
95779       return action;
95780   }
95781
95782   function actionDeleteMultiple(ids) {
95783       var actions = {
95784           way: actionDeleteWay,
95785           node: actionDeleteNode,
95786           relation: actionDeleteRelation
95787       };
95788
95789
95790       var action = function(graph) {
95791           ids.forEach(function(id) {
95792               if (graph.hasEntity(id)) { // It may have been deleted aready.
95793                   graph = actions[graph.entity(id).type](id)(graph);
95794               }
95795           });
95796
95797           return graph;
95798       };
95799
95800
95801       return action;
95802   }
95803
95804   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
95805   function actionDeleteRelation(relationId) {
95806
95807
95808       function canDeleteEntity(entity, graph) {
95809           return !graph.parentWays(entity).length &&
95810               !graph.parentRelations(entity).length &&
95811               !entity.hasInterestingTags();
95812       }
95813
95814
95815       var action = function(graph) {
95816           var relation = graph.entity(relationId);
95817
95818           graph.parentRelations(relation)
95819               .forEach(function(parent) {
95820                   parent = parent.removeMembersWithID(relationId);
95821                   graph = graph.replace(parent);
95822
95823                   if (parent.isDegenerate()) {
95824                       graph = actionDeleteRelation(parent.id)(graph);
95825                   }
95826               });
95827
95828           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
95829               graph = graph.replace(relation.removeMembersWithID(memberId));
95830
95831               var entity = graph.entity(memberId);
95832               if (canDeleteEntity(entity, graph)) {
95833                   graph = actionDeleteMultiple([memberId])(graph);
95834               }
95835           });
95836
95837           return graph.remove(relation);
95838       };
95839
95840
95841       return action;
95842   }
95843
95844   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
95845   function actionDeleteNode(nodeId) {
95846       var action = function(graph) {
95847           var node = graph.entity(nodeId);
95848
95849           graph.parentWays(node)
95850               .forEach(function(parent) {
95851                   parent = parent.removeNode(nodeId);
95852                   graph = graph.replace(parent);
95853
95854                   if (parent.isDegenerate()) {
95855                       graph = actionDeleteWay(parent.id)(graph);
95856                   }
95857               });
95858
95859           graph.parentRelations(node)
95860               .forEach(function(parent) {
95861                   parent = parent.removeMembersWithID(nodeId);
95862                   graph = graph.replace(parent);
95863
95864                   if (parent.isDegenerate()) {
95865                       graph = actionDeleteRelation(parent.id)(graph);
95866                   }
95867               });
95868
95869           return graph.remove(node);
95870       };
95871
95872
95873       return action;
95874   }
95875
95876   // Connect the ways at the given nodes.
95877   //
95878   // First choose a node to be the survivor, with preference given
95879   // to an existing (not new) node.
95880   //
95881   // Tags and relation memberships of of non-surviving nodes are merged
95882   // to the survivor.
95883   //
95884   // This is the inverse of `iD.actionDisconnect`.
95885   //
95886   // Reference:
95887   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
95888   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
95889   //
95890   function actionConnect(nodeIDs) {
95891       var action = function(graph) {
95892           var survivor;
95893           var node;
95894           var parents;
95895           var i, j;
95896
95897           // Choose a survivor node, prefer an existing (not new) node - #4974
95898           for (i = 0; i < nodeIDs.length; i++) {
95899               survivor = graph.entity(nodeIDs[i]);
95900               if (survivor.version) break;  // found one
95901           }
95902
95903           // Replace all non-surviving nodes with the survivor and merge tags.
95904           for (i = 0; i < nodeIDs.length; i++) {
95905               node = graph.entity(nodeIDs[i]);
95906               if (node.id === survivor.id) continue;
95907
95908               parents = graph.parentWays(node);
95909               for (j = 0; j < parents.length; j++) {
95910                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
95911                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
95912                   }
95913               }
95914
95915               parents = graph.parentRelations(node);
95916               for (j = 0; j < parents.length; j++) {
95917                   graph = graph.replace(parents[j].replaceMember(node, survivor));
95918               }
95919
95920               survivor = survivor.mergeTags(node.tags);
95921               graph = actionDeleteNode(node.id)(graph);
95922           }
95923
95924           graph = graph.replace(survivor);
95925
95926           return graph;
95927       };
95928
95929
95930       action.disabled = function(graph) {
95931           var seen = {};
95932           var restrictionIDs = [];
95933           var survivor;
95934           var node, way;
95935           var relations, relation, role;
95936           var i, j, k;
95937
95938           // Choose a survivor node, prefer an existing (not new) node - #4974
95939           for (i = 0; i < nodeIDs.length; i++) {
95940               survivor = graph.entity(nodeIDs[i]);
95941               if (survivor.version) break;  // found one
95942           }
95943
95944           // 1. disable if the nodes being connected have conflicting relation roles
95945           for (i = 0; i < nodeIDs.length; i++) {
95946               node = graph.entity(nodeIDs[i]);
95947               relations = graph.parentRelations(node);
95948
95949               for (j = 0; j < relations.length; j++) {
95950                   relation = relations[j];
95951                   role = relation.memberById(node.id).role || '';
95952
95953                   // if this node is a via node in a restriction, remember for later
95954                   if (relation.isValidRestriction()) {
95955                       restrictionIDs.push(relation.id);
95956                   }
95957
95958                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
95959                       return 'relation';
95960                   } else {
95961                       seen[relation.id] = role;
95962                   }
95963               }
95964           }
95965
95966           // gather restrictions for parent ways
95967           for (i = 0; i < nodeIDs.length; i++) {
95968               node = graph.entity(nodeIDs[i]);
95969
95970               var parents = graph.parentWays(node);
95971               for (j = 0; j < parents.length; j++) {
95972                   var parent = parents[j];
95973                   relations = graph.parentRelations(parent);
95974
95975                   for (k = 0; k < relations.length; k++) {
95976                       relation = relations[k];
95977                       if (relation.isValidRestriction()) {
95978                           restrictionIDs.push(relation.id);
95979                       }
95980                   }
95981               }
95982           }
95983
95984
95985           // test restrictions
95986           restrictionIDs = uniq(restrictionIDs);
95987           for (i = 0; i < restrictionIDs.length; i++) {
95988               relation = graph.entity(restrictionIDs[i]);
95989               if (!relation.isComplete(graph)) continue;
95990
95991               var memberWays = relation.members
95992                   .filter(function(m) { return m.type === 'way'; })
95993                   .map(function(m) { return graph.entity(m.id); });
95994
95995               memberWays = uniq(memberWays);
95996               var f = relation.memberByRole('from');
95997               var t = relation.memberByRole('to');
95998               var isUturn = (f.id === t.id);
95999
96000               // 2a. disable if connection would damage a restriction
96001               // (a key node is a node at the junction of ways)
96002               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
96003               for (j = 0; j < relation.members.length; j++) {
96004                   collectNodes(relation.members[j], nodes);
96005               }
96006
96007               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
96008               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
96009
96010               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
96011               nodes.from = nodes.from.filter(filter);
96012               nodes.via = nodes.via.filter(filter);
96013               nodes.to = nodes.to.filter(filter);
96014
96015               var connectFrom = false;
96016               var connectVia = false;
96017               var connectTo = false;
96018               var connectKeyFrom = false;
96019               var connectKeyTo = false;
96020
96021               for (j = 0; j < nodeIDs.length; j++) {
96022                   var n = nodeIDs[j];
96023                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
96024                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
96025                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
96026                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
96027                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
96028               }
96029               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
96030               if (connectFrom && connectVia) { return 'restriction'; }
96031               if (connectTo   && connectVia) { return 'restriction'; }
96032
96033               // connecting to a key node -
96034               // if both nodes are on a member way (i.e. part of the turn restriction),
96035               // the connecting node must be adjacent to the key node.
96036               if (connectKeyFrom || connectKeyTo) {
96037                   if (nodeIDs.length !== 2) { return 'restriction'; }
96038
96039                   var n0 = null;
96040                   var n1 = null;
96041                   for (j = 0; j < memberWays.length; j++) {
96042                       way = memberWays[j];
96043                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
96044                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
96045                   }
96046
96047                   if (n0 && n1) {    // both nodes are part of the restriction
96048                       var ok = false;
96049                       for (j = 0; j < memberWays.length; j++) {
96050                           way = memberWays[j];
96051                           if (way.areAdjacent(n0, n1)) {
96052                               ok = true;
96053                               break;
96054                           }
96055                       }
96056                       if (!ok) {
96057                           return 'restriction';
96058                       }
96059                   }
96060               }
96061
96062               // 2b. disable if nodes being connected will destroy a member way in a restriction
96063               // (to test, make a copy and try actually connecting the nodes)
96064               for (j = 0; j < memberWays.length; j++) {
96065                   way = memberWays[j].update({});   // make copy
96066                   for (k = 0; k < nodeIDs.length; k++) {
96067                       if (nodeIDs[k] === survivor.id) continue;
96068
96069                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
96070                           way = way.removeNode(nodeIDs[k]);
96071                       } else {
96072                           way = way.replaceNode(nodeIDs[k], survivor.id);
96073                       }
96074                   }
96075                   if (way.isDegenerate()) {
96076                       return 'restriction';
96077                   }
96078               }
96079           }
96080
96081           return false;
96082
96083
96084           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
96085           function hasDuplicates(n, i, arr) {
96086               return arr.indexOf(n) !== arr.lastIndexOf(n);
96087           }
96088
96089           function keyNodeFilter(froms, tos) {
96090               return function(n) {
96091                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
96092               };
96093           }
96094
96095           function collectNodes(member, collection) {
96096               var entity = graph.hasEntity(member.id);
96097               if (!entity) return;
96098
96099               var role = member.role || '';
96100               if (!collection[role]) {
96101                   collection[role] = [];
96102               }
96103
96104               if (member.type === 'node') {
96105                   collection[role].push(member.id);
96106                   if (role === 'via') {
96107                       collection.keyfrom.push(member.id);
96108                       collection.keyto.push(member.id);
96109                   }
96110
96111               } else if (member.type === 'way') {
96112                   collection[role].push.apply(collection[role], entity.nodes);
96113                   if (role === 'from' || role === 'via') {
96114                       collection.keyfrom.push(entity.first());
96115                       collection.keyfrom.push(entity.last());
96116                   }
96117                   if (role === 'to' || role === 'via') {
96118                       collection.keyto.push(entity.first());
96119                       collection.keyto.push(entity.last());
96120                   }
96121               }
96122           }
96123       };
96124
96125
96126       return action;
96127   }
96128
96129   function actionCopyEntities(ids, fromGraph) {
96130       var copies = {};
96131
96132
96133       var action = function(graph) {
96134           ids.forEach(function(id) {
96135               fromGraph.entity(id).copy(fromGraph, copies);
96136           });
96137
96138           for (var id in copies) {
96139               graph = graph.replace(copies[id]);
96140           }
96141
96142           return graph;
96143       };
96144
96145
96146       action.copies = function() {
96147           return copies;
96148       };
96149
96150
96151       return action;
96152   }
96153
96154   function actionDeleteMember(relationId, memberIndex) {
96155       return function(graph) {
96156           var relation = graph.entity(relationId)
96157               .removeMember(memberIndex);
96158
96159           graph = graph.replace(relation);
96160
96161           if (relation.isDegenerate())
96162               graph = actionDeleteRelation(relation.id)(graph);
96163
96164           return graph;
96165       };
96166   }
96167
96168   function actionDiscardTags(difference) {
96169
96170       return function(graph) {
96171           function discardTags(entity) {
96172               var tags = {};
96173               var keys = Object.keys(entity.tags);
96174               var discarded = false;
96175
96176               for (var i = 0; i < keys.length; i++) {
96177                   var k = keys[i];
96178                   if (dataDiscarded[k] || !entity.tags[k]) {
96179                       discarded = true;
96180                   } else {
96181                       tags[k] = entity.tags[k];
96182                   }
96183               }
96184
96185               if (discarded) {
96186                   graph = graph.replace(entity.update({ tags: tags }));
96187               }
96188           }
96189
96190           difference.modified().forEach(discardTags);
96191           difference.created().forEach(discardTags);
96192
96193           return graph;
96194       };
96195   }
96196
96197   // Disconect the ways at the given node.
96198   //
96199   // Optionally, disconnect only the given ways.
96200   //
96201   // For testing convenience, accepts an ID to assign to the (first) new node.
96202   // Normally, this will be undefined and the way will automatically
96203   // be assigned a new ID.
96204   //
96205   // This is the inverse of `iD.actionConnect`.
96206   //
96207   // Reference:
96208   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
96209   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
96210   //
96211   function actionDisconnect(nodeId, newNodeId) {
96212       var wayIds;
96213
96214
96215       var action = function(graph) {
96216           var node = graph.entity(nodeId);
96217           var connections = action.connections(graph);
96218
96219           connections.forEach(function(connection) {
96220               var way = graph.entity(connection.wayID);
96221               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
96222
96223               graph = graph.replace(newNode);
96224               if (connection.index === 0 && way.isArea()) {
96225                   // replace shared node with shared node..
96226                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
96227               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
96228                   // replace closing node with new new node..
96229                   graph = graph.replace(way.unclose().addNode(newNode.id));
96230               } else {
96231                   // replace shared node with multiple new nodes..
96232                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
96233               }
96234           });
96235
96236           return graph;
96237       };
96238
96239
96240       action.connections = function(graph) {
96241           var candidates = [];
96242           var keeping = false;
96243           var parentWays = graph.parentWays(graph.entity(nodeId));
96244
96245           parentWays.forEach(function(way) {
96246               if (wayIds && wayIds.indexOf(way.id) === -1) {
96247                   keeping = true;
96248                   return;
96249               }
96250               if (way.isArea() && (way.nodes[0] === nodeId)) {
96251                   candidates.push({ wayID: way.id, index: 0 });
96252               } else {
96253                   way.nodes.forEach(function(waynode, index) {
96254                       if (waynode === nodeId) {
96255                           candidates.push({ wayID: way.id, index: index });
96256                       }
96257                   });
96258               }
96259           });
96260
96261           return keeping ? candidates : candidates.slice(1);
96262       };
96263
96264
96265       action.disabled = function(graph) {
96266           var connections = action.connections(graph);
96267           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
96268               return 'not_connected';
96269
96270           var parentWays = graph.parentWays(graph.entity(nodeId));
96271           var seenRelationIds = {};
96272           var sharedRelation;
96273
96274           parentWays.forEach(function(way) {
96275               if (wayIds && wayIds.indexOf(way.id) === -1)
96276                   return;
96277
96278               var relations = graph.parentRelations(way);
96279               relations.forEach(function(relation) {
96280                   if (relation.id in seenRelationIds) {
96281                       sharedRelation = relation;
96282                   } else {
96283                       seenRelationIds[relation.id] = true;
96284                   }
96285               });
96286           });
96287
96288           if (sharedRelation)
96289               return 'relation';
96290       };
96291
96292
96293       action.limitWays = function(_) {
96294           if (!arguments.length) return wayIds;
96295           wayIds = _;
96296           return action;
96297       };
96298
96299
96300       return action;
96301   }
96302
96303   // Join ways at the end node they share.
96304   //
96305   // This is the inverse of `iD.actionSplit`.
96306   //
96307   // Reference:
96308   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
96309   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
96310   //
96311   function actionJoin(ids) {
96312
96313       function groupEntitiesByGeometry(graph) {
96314           var entities = ids.map(function(id) { return graph.entity(id); });
96315           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
96316       }
96317
96318
96319       var action = function(graph) {
96320           var ways = ids.map(graph.entity, graph);
96321           var survivorID = ways[0].id;
96322
96323           // Prefer to keep an existing way.
96324           for (var i = 0; i < ways.length; i++) {
96325               if (!ways[i].isNew()) {
96326                   survivorID = ways[i].id;
96327                   break;
96328               }
96329           }
96330
96331           var sequences = osmJoinWays(ways, graph);
96332           var joined = sequences[0];
96333
96334           // We might need to reverse some of these ways before joining them.  #4688
96335           // `joined.actions` property will contain any actions we need to apply.
96336           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
96337
96338           var survivor = graph.entity(survivorID);
96339           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
96340           graph = graph.replace(survivor);
96341
96342           joined.forEach(function(way) {
96343               if (way.id === survivorID) return;
96344
96345               graph.parentRelations(way).forEach(function(parent) {
96346                   graph = graph.replace(parent.replaceMember(way, survivor));
96347               });
96348
96349               survivor = survivor.mergeTags(way.tags);
96350
96351               graph = graph.replace(survivor);
96352               graph = actionDeleteWay(way.id)(graph);
96353           });
96354
96355           return graph;
96356       };
96357
96358
96359       action.disabled = function(graph) {
96360           var geometries = groupEntitiesByGeometry(graph);
96361           if (ids.length < 2 || ids.length !== geometries.line.length)
96362               return 'not_eligible';
96363
96364           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
96365           if (joined.length > 1)
96366               return 'not_adjacent';
96367
96368           // Loop through all combinations of path-pairs to check potential intersections
96369           //  between all pairs
96370           for (var i = 0; i < ids.length-1; i++) {
96371               for (var j = i+1; j < ids.length; j++) {
96372                   var path1 = graph.childNodes(graph.entity(ids[i])).map(function(e) {
96373                       return e.loc;
96374                   });
96375                   var path2 = graph.childNodes(graph.entity(ids[j])).map(function(e) {
96376                       return e.loc;
96377                   });
96378                   var intersections = geoPathIntersections(path1, path2);
96379
96380                   // Check if intersections are just nodes lying on top of each other/the line,
96381                   //  as opposed to crossing it
96382                   if (intersection(
96383                           joined[0].nodes.map(function(n) { return n.loc.toString(); }),
96384                           intersections.map(function(n) { return n.toString(); })
96385                       ).length !== intersections.length) return 'paths_intersect';
96386               }
96387           }
96388
96389           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
96390           var relation;
96391           var tags = {};
96392           var conflicting = false;
96393
96394           joined[0].forEach(function(way) {
96395               var parents = graph.parentRelations(way);
96396               parents.forEach(function(parent) {
96397                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
96398                       relation = parent;
96399               });
96400
96401               for (var k in way.tags) {
96402                   if (!(k in tags)) {
96403                       tags[k] = way.tags[k];
96404                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
96405                       conflicting = true;
96406                   }
96407               }
96408           });
96409
96410           if (relation)
96411               return 'restriction';
96412
96413           if (conflicting)
96414               return 'conflicting_tags';
96415       };
96416
96417
96418       return action;
96419   }
96420
96421   function actionMerge(ids) {
96422
96423       function groupEntitiesByGeometry(graph) {
96424           var entities = ids.map(function(id) { return graph.entity(id); });
96425           return assignIn({point: [], area: [], line: [], relation: []},
96426               groupBy(entities, function(entity) { return entity.geometry(graph); }));
96427       }
96428
96429
96430       var action = function(graph) {
96431           var geometries = groupEntitiesByGeometry(graph),
96432               target = geometries.area[0] || geometries.line[0],
96433               points = geometries.point;
96434
96435           points.forEach(function(point) {
96436               target = target.mergeTags(point.tags);
96437               graph = graph.replace(target);
96438
96439               graph.parentRelations(point).forEach(function(parent) {
96440                   graph = graph.replace(parent.replaceMember(point, target));
96441               });
96442
96443               var nodes = uniq(graph.childNodes(target)),
96444                   removeNode = point;
96445
96446               for (var i = 0; i < nodes.length; i++) {
96447                   var node = nodes[i];
96448                   if (graph.parentWays(node).length > 1 ||
96449                       graph.parentRelations(node).length ||
96450                       node.hasInterestingTags()) {
96451                       continue;
96452                   }
96453
96454                   // Found an uninteresting child node on the target way.
96455                   // Move orig point into its place to preserve point's history. #3683
96456                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
96457                   target = target.replaceNode(node.id, point.id);
96458                   graph = graph.replace(target);
96459                   removeNode = node;
96460                   break;
96461               }
96462
96463               graph = graph.remove(removeNode);
96464           });
96465
96466           return graph;
96467       };
96468
96469
96470       action.disabled = function(graph) {
96471           var geometries = groupEntitiesByGeometry(graph);
96472           if (geometries.point.length === 0 ||
96473               (geometries.area.length + geometries.line.length) !== 1 ||
96474               geometries.relation.length !== 0)
96475               return 'not_eligible';
96476       };
96477
96478
96479       return action;
96480   }
96481
96482   // `actionMergeNodes` is just a combination of:
96483   //
96484   // 1. move all the nodes to a common location
96485   // 2. `actionConnect` them
96486
96487   function actionMergeNodes(nodeIDs, loc) {
96488
96489       // If there is a single "interesting" node, use that as the location.
96490       // Otherwise return the average location of all the nodes.
96491       function chooseLoc(graph) {
96492           if (!nodeIDs.length) return null;
96493           var sum = [0,0];
96494           var interestingCount = 0;
96495           var interestingLoc;
96496
96497           for (var i = 0; i < nodeIDs.length; i++) {
96498               var node = graph.entity(nodeIDs[i]);
96499               if (node.hasInterestingTags()) {
96500                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
96501               }
96502               sum = geoVecAdd(sum, node.loc);
96503           }
96504
96505           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
96506       }
96507
96508
96509       var action = function(graph) {
96510           if (nodeIDs.length < 2) return graph;
96511           var toLoc = loc;
96512           if (!toLoc) {
96513               toLoc = chooseLoc(graph);
96514           }
96515
96516           for (var i = 0; i < nodeIDs.length; i++) {
96517               var node = graph.entity(nodeIDs[i]);
96518               if (node.loc !== toLoc) {
96519                   graph = graph.replace(node.move(toLoc));
96520               }
96521           }
96522
96523           return actionConnect(nodeIDs)(graph);
96524       };
96525
96526
96527       action.disabled = function(graph) {
96528           if (nodeIDs.length < 2) return 'not_eligible';
96529
96530           for (var i = 0; i < nodeIDs.length; i++) {
96531               var entity = graph.entity(nodeIDs[i]);
96532               if (entity.type !== 'node') return 'not_eligible';
96533           }
96534
96535           return actionConnect(nodeIDs).disabled(graph);
96536       };
96537
96538       return action;
96539   }
96540
96541   function actionMergePolygon(ids, newRelationId) {
96542
96543       function groupEntities(graph) {
96544           var entities = ids.map(function (id) { return graph.entity(id); });
96545           return assignIn({
96546                   closedWay: [],
96547                   multipolygon: [],
96548                   other: []
96549               }, groupBy(entities, function(entity) {
96550                   if (entity.type === 'way' && entity.isClosed()) {
96551                       return 'closedWay';
96552                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
96553                       return 'multipolygon';
96554                   } else {
96555                       return 'other';
96556                   }
96557               }));
96558       }
96559
96560
96561       var action = function(graph) {
96562           var entities = groupEntities(graph);
96563
96564           // An array representing all the polygons that are part of the multipolygon.
96565           //
96566           // Each element is itself an array of objects with an id property, and has a
96567           // locs property which is an array of the locations forming the polygon.
96568           var polygons = entities.multipolygon.reduce(function(polygons, m) {
96569               return polygons.concat(osmJoinWays(m.members, graph));
96570           }, []).concat(entities.closedWay.map(function(d) {
96571               var member = [{id: d.id}];
96572               member.nodes = graph.childNodes(d);
96573               return member;
96574           }));
96575
96576           // contained is an array of arrays of boolean values,
96577           // where contained[j][k] is true iff the jth way is
96578           // contained by the kth way.
96579           var contained = polygons.map(function(w, i) {
96580               return polygons.map(function(d, n) {
96581                   if (i === n) return null;
96582                   return geoPolygonContainsPolygon(
96583                       map$3(d.nodes, 'loc'),
96584                       map$3(w.nodes, 'loc'));
96585               });
96586           });
96587
96588           // Sort all polygons as either outer or inner ways
96589           var members = [],
96590               outer = true;
96591
96592           while (polygons.length) {
96593               extractUncontained(polygons);
96594               polygons = polygons.filter(isContained);
96595               contained = contained.filter(isContained).map(filterContained);
96596           }
96597
96598           function isContained(d, i) {
96599               return some(contained[i]);
96600           }
96601
96602           function filterContained(d) {
96603               return d.filter(isContained);
96604           }
96605
96606           function extractUncontained(polygons) {
96607               polygons.forEach(function(d, i) {
96608                   if (!isContained(d, i)) {
96609                       d.forEach(function(member) {
96610                           members.push({
96611                               type: 'way',
96612                               id: member.id,
96613                               role: outer ? 'outer' : 'inner'
96614                           });
96615                       });
96616                   }
96617               });
96618               outer = !outer;
96619           }
96620
96621           // Move all tags to one relation
96622           var relation = entities.multipolygon[0] ||
96623               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
96624
96625           entities.multipolygon.slice(1).forEach(function(m) {
96626               relation = relation.mergeTags(m.tags);
96627               graph = graph.remove(m);
96628           });
96629
96630           entities.closedWay.forEach(function(way) {
96631               function isThisOuter(m) {
96632                   return m.id === way.id && m.role !== 'inner';
96633               }
96634               if (members.some(isThisOuter)) {
96635                   relation = relation.mergeTags(way.tags);
96636                   graph = graph.replace(way.update({ tags: {} }));
96637               }
96638           });
96639
96640           return graph.replace(relation.update({
96641               members: members,
96642               tags: omit(relation.tags, 'area')
96643           }));
96644       };
96645
96646
96647       action.disabled = function(graph) {
96648           var entities = groupEntities(graph);
96649           if (entities.other.length > 0 ||
96650               entities.closedWay.length + entities.multipolygon.length < 2)
96651               return 'not_eligible';
96652           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
96653               return 'incomplete_relation';
96654       };
96655
96656
96657       return action;
96658   }
96659
96660   // Text diff algorithm following Hunt and McIlroy 1976.
96661   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
96662   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
96663   // http://www.cs.dartmouth.edu/~doug/
96664   //
96665   // Expects two arrays of strings.
96666   function LCS(file1, file2) {
96667     var equivalenceClasses;
96668     var file2indices;
96669     var newCandidate;
96670     var candidates;
96671     var line;
96672     var c, i, j, jX, r, s;
96673
96674     equivalenceClasses = {};
96675     for (j = 0; j < file2.length; j++) {
96676       line = file2[j];
96677       if (equivalenceClasses[line]) {
96678         equivalenceClasses[line].push(j);
96679       } else {
96680         equivalenceClasses[line] = [j];
96681       }
96682     }
96683
96684     candidates = [
96685       { file1index: -1, file2index: -1, chain: null }
96686     ];
96687
96688     for (i = 0; i < file1.length; i++) {
96689       line = file1[i];
96690       file2indices = equivalenceClasses[line] || [];
96691
96692       r = 0;
96693       c = candidates[0];
96694
96695       for (jX = 0; jX < file2indices.length; jX++) {
96696         j = file2indices[jX];
96697
96698         for (s = r; s < candidates.length; s++) {
96699           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
96700             break;
96701           }
96702         }
96703
96704         if (s < candidates.length) {
96705           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
96706           if (r === candidates.length) {
96707             candidates.push(c);
96708           } else {
96709             candidates[r] = c;
96710           }
96711           r = s + 1;
96712           c = newCandidate;
96713           if (r === candidates.length) {
96714             break; // no point in examining further (j)s
96715           }
96716         }
96717       }
96718
96719       candidates[r] = c;
96720     }
96721
96722     // At this point, we know the LCS: it's in the reverse of the
96723     // linked-list through .chain of candidates[candidates.length - 1].
96724
96725     return candidates[candidates.length - 1];
96726   }
96727
96728
96729   // We apply the LCS to give a simple representation of the
96730   // offsets and lengths of mismatched chunks in the input
96731   // files. This is used by diff3MergeIndices below.
96732   function diffIndices(file1, file2) {
96733     var result = [];
96734     var tail1 = file1.length;
96735     var tail2 = file2.length;
96736
96737     for (var candidate = LCS(file1, file2);
96738        candidate !== null;
96739        candidate = candidate.chain)
96740     {
96741       var mismatchLength1 = tail1 - candidate.file1index - 1;
96742       var mismatchLength2 = tail2 - candidate.file2index - 1;
96743       tail1 = candidate.file1index;
96744       tail2 = candidate.file2index;
96745
96746       if (mismatchLength1 || mismatchLength2) {
96747         result.push({
96748           file1: [tail1 + 1, mismatchLength1],
96749           file2: [tail2 + 1, mismatchLength2]
96750         });
96751       }
96752     }
96753
96754     result.reverse();
96755     return result;
96756   }
96757
96758
96759   // Given three files, A, O, and B, where both A and B are
96760   // independently derived from O, returns a fairly complicated
96761   // internal representation of merge decisions it's taken. The
96762   // interested reader may wish to consult
96763   //
96764   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
96765   // 'A Formal Investigation of ' In Arvind and Prasad,
96766   // editors, Foundations of Software Technology and Theoretical
96767   // Computer Science (FSTTCS), December 2007.
96768   //
96769   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
96770   function diff3MergeIndices(a, o, b) {
96771     var i;
96772     var m1 = diffIndices(o, a);
96773     var m2 = diffIndices(o, b);
96774
96775     var hunks = [];
96776     function addHunk(h, side) {
96777       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
96778     }
96779     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
96780     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
96781     hunks.sort(function (x, y) { return x[0] - y[0]; });
96782
96783     var result = [];
96784     var commonOffset = 0;
96785     function copyCommon(targetOffset) {
96786       if (targetOffset > commonOffset) {
96787         result.push([1, commonOffset, targetOffset - commonOffset]);
96788         commonOffset = targetOffset;
96789       }
96790     }
96791
96792     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
96793       var firstHunkIndex = hunkIndex;
96794       var hunk = hunks[hunkIndex];
96795       var regionLhs = hunk[0];
96796       var regionRhs = regionLhs + hunk[2];
96797       while (hunkIndex < hunks.length - 1) {
96798         var maybeOverlapping = hunks[hunkIndex + 1];
96799         var maybeLhs = maybeOverlapping[0];
96800         if (maybeLhs > regionRhs) {
96801           break;
96802         }
96803         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
96804         hunkIndex++;
96805       }
96806
96807       copyCommon(regionLhs);
96808       if (firstHunkIndex === hunkIndex) {
96809         // The 'overlap' was only one hunk long, meaning that
96810         // there's no conflict here. Either a and o were the
96811         // same, or b and o were the same.
96812         if (hunk[4] > 0) {
96813           result.push([hunk[1], hunk[3], hunk[4]]);
96814         }
96815       } else {
96816         // A proper conflict. Determine the extents of the
96817         // regions involved from a, o and b. Effectively merge
96818         // all the hunks on the left into one giant hunk, and
96819         // do the same for the right; then, correct for skew
96820         // in the regions of o that each side changed, and
96821         // report appropriate spans for the three sides.
96822         var regions = {
96823           0: [a.length, -1, o.length, -1],
96824           2: [b.length, -1, o.length, -1]
96825         };
96826         for (i = firstHunkIndex; i <= hunkIndex; i++) {
96827           hunk = hunks[i];
96828           var side = hunk[1];
96829           var r = regions[side];
96830           var oLhs = hunk[0];
96831           var oRhs = oLhs + hunk[2];
96832           var abLhs = hunk[3];
96833           var abRhs = abLhs + hunk[4];
96834           r[0] = Math.min(abLhs, r[0]);
96835           r[1] = Math.max(abRhs, r[1]);
96836           r[2] = Math.min(oLhs, r[2]);
96837           r[3] = Math.max(oRhs, r[3]);
96838         }
96839         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
96840         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
96841         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
96842         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
96843         result.push([-1,
96844                      aLhs,      aRhs      - aLhs,
96845                      regionLhs, regionRhs - regionLhs,
96846                      bLhs,      bRhs      - bLhs]);
96847       }
96848       commonOffset = regionRhs;
96849     }
96850
96851     copyCommon(o.length);
96852     return result;
96853   }
96854
96855
96856   // Applies the output of diff3MergeIndices to actually
96857   // construct the merged file; the returned result alternates
96858   // between 'ok' and 'conflict' blocks.
96859   function diff3Merge(a, o, b, excludeFalseConflicts) {
96860     var result = [];
96861     var files = [a, o, b];
96862     var indices = diff3MergeIndices(a, o, b);
96863
96864     var okLines = [];
96865     function flushOk() {
96866       if (okLines.length) {
96867         result.push({ok: okLines});
96868       }
96869       okLines = [];
96870     }
96871     function pushOk(xs) {
96872       for (var j = 0; j < xs.length; j++) {
96873         okLines.push(xs[j]);
96874       }
96875     }
96876
96877     function isTrueConflict(rec) {
96878       if (rec[2] !== rec[6]) return true;
96879       var aoff = rec[1];
96880       var boff = rec[5];
96881       for (var j = 0; j < rec[2]; j++) {
96882         if (a[j + aoff] !== b[j + boff]) {
96883           return true;
96884         }
96885       }
96886       return false;
96887     }
96888
96889     for (var i = 0; i < indices.length; i++) {
96890       var x = indices[i];
96891       var side = x[0];
96892       if (side === -1) {
96893         if (excludeFalseConflicts && !isTrueConflict(x)) {
96894           pushOk(files[0].slice(x[1], x[1] + x[2]));
96895         } else {
96896           flushOk();
96897           result.push({
96898             conflict: {
96899               a: a.slice(x[1], x[1] + x[2]),
96900               aIndex: x[1],
96901               o: o.slice(x[3], x[3] + x[4]),
96902               oIndex: x[3],
96903               b: b.slice(x[5], x[5] + x[6]),
96904               bIndex: x[5]
96905             }
96906           });
96907         }
96908       } else {
96909         pushOk(files[side].slice(x[1], x[1] + x[2]));
96910       }
96911     }
96912
96913     flushOk();
96914     return result;
96915   }
96916
96917   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
96918       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
96919       var _conflicts = [];
96920
96921
96922       function user(d) {
96923           return isFunction(formatUser) ? formatUser(d) : d;
96924       }
96925
96926
96927       function mergeLocation(remote, target) {
96928           function pointEqual(a, b) {
96929               var epsilon = 1e-6;
96930               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
96931           }
96932
96933           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
96934               return target;
96935           }
96936           if (_option === 'force_remote') {
96937               return target.update({loc: remote.loc});
96938           }
96939
96940           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
96941           return target;
96942       }
96943
96944
96945       function mergeNodes(base, remote, target) {
96946           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
96947               return target;
96948           }
96949           if (_option === 'force_remote') {
96950               return target.update({nodes: remote.nodes});
96951           }
96952
96953           var ccount = _conflicts.length;
96954           var o = base.nodes || [];
96955           var a = target.nodes || [];
96956           var b = remote.nodes || [];
96957           var nodes = [];
96958           var hunks = diff3Merge(a, o, b, true);
96959
96960           for (var i = 0; i < hunks.length; i++) {
96961               var hunk = hunks[i];
96962               if (hunk.ok) {
96963                   nodes.push.apply(nodes, hunk.ok);
96964               } else {
96965                   // for all conflicts, we can assume c.a !== c.b
96966                   // because `diff3Merge` called with `true` option to exclude false conflicts..
96967                   var c = hunk.conflict;
96968                   if (isEqual(c.o, c.a)) {  // only changed remotely
96969                       nodes.push.apply(nodes, c.b);
96970                   } else if (isEqual(c.o, c.b)) {  // only changed locally
96971                       nodes.push.apply(nodes, c.a);
96972                   } else {       // changed both locally and remotely
96973                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
96974                       break;
96975                   }
96976               }
96977           }
96978
96979           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
96980       }
96981
96982
96983       function mergeChildren(targetWay, children, updates, graph) {
96984           function isUsed(node, targetWay) {
96985               var parentWays = map$3(graph.parentWays(node), 'id');
96986               return node.hasInterestingTags() ||
96987                   without(parentWays, targetWay.id).length > 0 ||
96988                   graph.parentRelations(node).length > 0;
96989           }
96990
96991           var ccount = _conflicts.length;
96992
96993           for (var i = 0; i < children.length; i++) {
96994               var id = children[i];
96995               var node = graph.hasEntity(id);
96996
96997               // remove unused childNodes..
96998               if (targetWay.nodes.indexOf(id) === -1) {
96999                   if (node && !isUsed(node, targetWay)) {
97000                       updates.removeIds.push(id);
97001                   }
97002                   continue;
97003               }
97004
97005               // restore used childNodes..
97006               var local = localGraph.hasEntity(id);
97007               var remote = remoteGraph.hasEntity(id);
97008               var target;
97009
97010               if (_option === 'force_remote' && remote && remote.visible) {
97011                   updates.replacements.push(remote);
97012
97013               } else if (_option === 'force_local' && local) {
97014                   target = osmEntity(local);
97015                   if (remote) {
97016                       target = target.update({ version: remote.version });
97017                   }
97018                   updates.replacements.push(target);
97019
97020               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
97021                   target = osmEntity(local, { version: remote.version });
97022                   if (remote.visible) {
97023                       target = mergeLocation(remote, target);
97024                   } else {
97025                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
97026                   }
97027
97028                   if (_conflicts.length !== ccount) break;
97029                   updates.replacements.push(target);
97030               }
97031           }
97032
97033           return targetWay;
97034       }
97035
97036
97037       function updateChildren(updates, graph) {
97038           for (var i = 0; i < updates.replacements.length; i++) {
97039               graph = graph.replace(updates.replacements[i]);
97040           }
97041           if (updates.removeIds.length) {
97042               graph = actionDeleteMultiple(updates.removeIds)(graph);
97043           }
97044           return graph;
97045       }
97046
97047
97048       function mergeMembers(remote, target) {
97049           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
97050               return target;
97051           }
97052           if (_option === 'force_remote') {
97053               return target.update({members: remote.members});
97054           }
97055
97056           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
97057           return target;
97058       }
97059
97060
97061       function mergeTags(base, remote, target) {
97062           function ignoreKey(k) {
97063               return dataDiscarded[k];
97064           }
97065
97066           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
97067               return target;
97068           }
97069           if (_option === 'force_remote') {
97070               return target.update({tags: remote.tags});
97071           }
97072
97073           var ccount = _conflicts.length;
97074           var o = base.tags || {};
97075           var a = target.tags || {};
97076           var b = remote.tags || {};
97077           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
97078           var tags = clone(a);
97079           var changed = false;
97080
97081           for (var i = 0; i < keys.length; i++) {
97082               var k = keys[i];
97083
97084               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
97085                   if (o[k] !== a[k]) {      // changed locally..
97086                       _conflicts.push(t('merge_remote_changes.conflict.tags',
97087                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
97088
97089                   } else {                  // unchanged locally, accept remote change..
97090                       if (b.hasOwnProperty(k)) {
97091                           tags[k] = b[k];
97092                       } else {
97093                           delete tags[k];
97094                       }
97095                       changed = true;
97096                   }
97097               }
97098           }
97099
97100           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
97101       }
97102
97103
97104       //  `graph.base()` is the common ancestor of the two graphs.
97105       //  `localGraph` contains user's edits up to saving
97106       //  `remoteGraph` contains remote edits to modified nodes
97107       //  `graph` must be a descendent of `localGraph` and may include
97108       //      some conflict resolution actions performed on it.
97109       //
97110       //                  --- ... --- `localGraph` -- ... -- `graph`
97111       //                 /
97112       //  `graph.base()` --- ... --- `remoteGraph`
97113       //
97114       var action = function(graph) {
97115           var updates = { replacements: [], removeIds: [] };
97116           var base = graph.base().entities[id];
97117           var local = localGraph.entity(id);
97118           var remote = remoteGraph.entity(id);
97119           var target = osmEntity(local, { version: remote.version });
97120
97121           // delete/undelete
97122           if (!remote.visible) {
97123               if (_option === 'force_remote') {
97124                   return actionDeleteMultiple([id])(graph);
97125
97126               } else if (_option === 'force_local') {
97127                   if (target.type === 'way') {
97128                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
97129                       graph = updateChildren(updates, graph);
97130                   }
97131                   return graph.replace(target);
97132
97133               } else {
97134                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
97135                   return graph;  // do nothing
97136               }
97137           }
97138
97139           // merge
97140           if (target.type === 'node') {
97141               target = mergeLocation(remote, target);
97142
97143           } else if (target.type === 'way') {
97144               // pull in any child nodes that may not be present locally..
97145               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
97146               target = mergeNodes(base, remote, target);
97147               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
97148
97149           } else if (target.type === 'relation') {
97150               target = mergeMembers(remote, target);
97151           }
97152
97153           target = mergeTags(base, remote, target);
97154
97155           if (!_conflicts.length) {
97156               graph = updateChildren(updates, graph).replace(target);
97157           }
97158
97159           return graph;
97160       };
97161
97162
97163       action.withOption = function(opt) {
97164           _option = opt;
97165           return action;
97166       };
97167
97168
97169       action.conflicts = function() {
97170           return _conflicts;
97171       };
97172
97173
97174       return action;
97175   }
97176
97177   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
97178   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
97179   function actionMove(moveIds, tryDelta, projection, cache) {
97180       var _delta = tryDelta;
97181
97182       function setupCache(graph) {
97183           function canMove(nodeId) {
97184               // Allow movement of any node that is in the selectedIDs list..
97185               if (moveIds.indexOf(nodeId) !== -1) return true;
97186
97187               // Allow movement of a vertex where 2 ways meet..
97188               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
97189               if (parents.length < 3) return true;
97190
97191               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
97192               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
97193               if (!parentsMoving) delete cache.moving[nodeId];
97194
97195               return parentsMoving;
97196           }
97197
97198           function cacheEntities(ids) {
97199               for (var i = 0; i < ids.length; i++) {
97200                   var id = ids[i];
97201                   if (cache.moving[id]) continue;
97202                   cache.moving[id] = true;
97203
97204                   var entity = graph.hasEntity(id);
97205                   if (!entity) continue;
97206
97207                   if (entity.type === 'node') {
97208                       cache.nodes.push(id);
97209                       cache.startLoc[id] = entity.loc;
97210                   } else if (entity.type === 'way') {
97211                       cache.ways.push(id);
97212                       cacheEntities(entity.nodes);
97213                   } else {
97214                       cacheEntities(entity.members.map(function(member) {
97215                           return member.id;
97216                       }));
97217                   }
97218               }
97219           }
97220
97221           function cacheIntersections(ids) {
97222               function isEndpoint(way, id) {
97223                   return !way.isClosed() && !!way.affix(id);
97224               }
97225
97226               for (var i = 0; i < ids.length; i++) {
97227                   var id = ids[i];
97228
97229                   // consider only intersections with 1 moved and 1 unmoved way.
97230                   var childNodes = graph.childNodes(graph.entity(id));
97231                   for (var j = 0; j < childNodes.length; j++) {
97232                       var node = childNodes[j];
97233                       var parents = graph.parentWays(node);
97234                       if (parents.length !== 2) continue;
97235
97236                       var moved = graph.entity(id);
97237                       var unmoved = null;
97238                       for (var k = 0; k < parents.length; k++) {
97239                           var way = parents[k];
97240                           if (!cache.moving[way.id]) {
97241                               unmoved = way;
97242                               break;
97243                           }
97244                       }
97245                       if (!unmoved) continue;
97246
97247                       // exclude ways that are overly connected..
97248                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
97249                       if (moved.isArea() || unmoved.isArea()) continue;
97250
97251                       cache.intersections.push({
97252                           nodeId: node.id,
97253                           movedId: moved.id,
97254                           unmovedId: unmoved.id,
97255                           movedIsEP: isEndpoint(moved, node.id),
97256                           unmovedIsEP: isEndpoint(unmoved, node.id)
97257                       });
97258                   }
97259               }
97260           }
97261
97262
97263           if (!cache) {
97264               cache = {};
97265           }
97266           if (!cache.ok) {
97267               cache.moving = {};
97268               cache.intersections = [];
97269               cache.replacedVertex = {};
97270               cache.startLoc = {};
97271               cache.nodes = [];
97272               cache.ways = [];
97273
97274               cacheEntities(moveIds);
97275               cacheIntersections(cache.ways);
97276               cache.nodes = filter(cache.nodes, canMove);
97277
97278               cache.ok = true;
97279           }
97280       }
97281
97282
97283       // Place a vertex where the moved vertex used to be, to preserve way shape..
97284       //
97285       //  Start:
97286       //      b ---- e
97287       //     / \
97288       //    /   \
97289       //   /     \
97290       //  a       c
97291       //
97292       //      *               node '*' added to preserve shape
97293       //     / \
97294       //    /   b ---- e      way `b,e` moved here:
97295       //   /     \
97296       //  a       c
97297       //
97298       //
97299       function replaceMovedVertex(nodeId, wayId, graph, delta) {
97300           var way = graph.entity(wayId);
97301           var moved = graph.entity(nodeId);
97302           var movedIndex = way.nodes.indexOf(nodeId);
97303           var len, prevIndex, nextIndex;
97304
97305           if (way.isClosed()) {
97306               len = way.nodes.length - 1;
97307               prevIndex = (movedIndex + len - 1) % len;
97308               nextIndex = (movedIndex + len + 1) % len;
97309           } else {
97310               len = way.nodes.length;
97311               prevIndex = movedIndex - 1;
97312               nextIndex = movedIndex + 1;
97313           }
97314
97315           var prev = graph.hasEntity(way.nodes[prevIndex]);
97316           var next = graph.hasEntity(way.nodes[nextIndex]);
97317
97318           // Don't add orig vertex at endpoint..
97319           if (!prev || !next) return graph;
97320
97321           var key = wayId + '_' + nodeId;
97322           var orig = cache.replacedVertex[key];
97323           if (!orig) {
97324               orig = osmNode();
97325               cache.replacedVertex[key] = orig;
97326               cache.startLoc[orig.id] = cache.startLoc[nodeId];
97327           }
97328
97329           var start, end;
97330           if (delta) {
97331               start = projection(cache.startLoc[nodeId]);
97332               end = projection.invert(geoVecAdd(start, delta));
97333           } else {
97334               end = cache.startLoc[nodeId];
97335           }
97336           orig = orig.move(end);
97337
97338           var angle = Math.abs(geoAngle(orig, prev, projection) -
97339                   geoAngle(orig, next, projection)) * 180 / Math.PI;
97340
97341           // Don't add orig vertex if it would just make a straight line..
97342           if (angle > 175 && angle < 185) return graph;
97343
97344           // moving forward or backward along way?
97345           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
97346           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
97347           var d1 = geoPathLength(p1);
97348           var d2 = geoPathLength(p2);
97349           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
97350
97351           // moving around closed loop?
97352           if (way.isClosed() && insertAt === 0) insertAt = len;
97353
97354           way = way.addNode(orig.id, insertAt);
97355           return graph.replace(orig).replace(way);
97356       }
97357
97358
97359       // Remove duplicate vertex that might have been added by
97360       // replaceMovedVertex.  This is done after the unzorro checks.
97361       function removeDuplicateVertices(wayId, graph) {
97362           var way = graph.entity(wayId);
97363           var epsilon = 1e-6;
97364           var prev, curr;
97365
97366           function isInteresting(node, graph) {
97367               return graph.parentWays(node).length > 1 ||
97368                   graph.parentRelations(node).length ||
97369                   node.hasInterestingTags();
97370           }
97371
97372           for (var i = 0; i < way.nodes.length; i++) {
97373               curr = graph.entity(way.nodes[i]);
97374
97375               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
97376                   if (!isInteresting(prev, graph)) {
97377                       way = way.removeNode(prev.id);
97378                       graph = graph.replace(way).remove(prev);
97379                   } else if (!isInteresting(curr, graph)) {
97380                       way = way.removeNode(curr.id);
97381                       graph = graph.replace(way).remove(curr);
97382                   }
97383               }
97384
97385               prev = curr;
97386           }
97387
97388           return graph;
97389       }
97390
97391
97392       // Reorder nodes around intersections that have moved..
97393       //
97394       //  Start:                way1.nodes: b,e         (moving)
97395       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
97396       //      |                 vertex: b
97397       //      e                 isEP1: true,  isEP2, false
97398       //
97399       //  way1 `b,e` moved here:
97400       //  a ----- c = b - d
97401       //              |
97402       //              e
97403       //
97404       //  reorder nodes         way1.nodes: b,e
97405       //  a ----- c - b - d     way2.nodes: a,c,b,d
97406       //              |
97407       //              e
97408       //
97409       function unZorroIntersection(intersection, graph) {
97410           var vertex = graph.entity(intersection.nodeId);
97411           var way1 = graph.entity(intersection.movedId);
97412           var way2 = graph.entity(intersection.unmovedId);
97413           var isEP1 = intersection.movedIsEP;
97414           var isEP2 = intersection.unmovedIsEP;
97415
97416           // don't move the vertex if it is the endpoint of both ways.
97417           if (isEP1 && isEP2) return graph;
97418
97419           var nodes1 = without(graph.childNodes(way1), vertex);
97420           var nodes2 = without(graph.childNodes(way2), vertex);
97421
97422           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
97423           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
97424
97425           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
97426           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
97427           var loc;
97428
97429           // snap vertex to nearest edge (or some point between them)..
97430           if (!isEP1 && !isEP2) {
97431               var epsilon = 1e-6, maxIter = 10;
97432               for (var i = 0; i < maxIter; i++) {
97433                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
97434                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
97435                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
97436                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
97437               }
97438           } else if (!isEP1) {
97439               loc = edge1.loc;
97440           } else {
97441               loc = edge2.loc;
97442           }
97443
97444           graph = graph.replace(vertex.move(loc));
97445
97446           // if zorro happened, reorder nodes..
97447           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
97448               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
97449               graph = graph.replace(way1);
97450           }
97451           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
97452               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
97453               graph = graph.replace(way2);
97454           }
97455
97456           return graph;
97457       }
97458
97459
97460       function cleanupIntersections(graph) {
97461           for (var i = 0; i < cache.intersections.length; i++) {
97462               var obj = cache.intersections[i];
97463               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
97464               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
97465               graph = unZorroIntersection(obj, graph);
97466               graph = removeDuplicateVertices(obj.movedId, graph);
97467               graph = removeDuplicateVertices(obj.unmovedId, graph);
97468           }
97469
97470           return graph;
97471       }
97472
97473
97474       // check if moving way endpoint can cross an unmoved way, if so limit delta..
97475       function limitDelta(graph) {
97476           function moveNode(loc) {
97477               return geoVecAdd(projection(loc), _delta);
97478           }
97479
97480           for (var i = 0; i < cache.intersections.length; i++) {
97481               var obj = cache.intersections[i];
97482
97483               // Don't limit movement if this is vertex joins 2 endpoints..
97484               if (obj.movedIsEP && obj.unmovedIsEP) continue;
97485               // Don't limit movement if this vertex is not an endpoint anyway..
97486               if (!obj.movedIsEP) continue;
97487
97488               var node = graph.entity(obj.nodeId);
97489               var start = projection(node.loc);
97490               var end = geoVecAdd(start, _delta);
97491               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
97492               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
97493               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
97494               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
97495               var hits = geoPathIntersections(movedPath, unmovedPath);
97496
97497               for (var j = 0; i < hits.length; i++) {
97498                   if (isEqual(hits[j], end)) continue;
97499                   var edge = geoChooseEdge(unmovedNodes, end, projection);
97500                   _delta = geoVecSubtract(projection(edge.loc), start);
97501               }
97502           }
97503       }
97504
97505
97506       var action = function(graph) {
97507           if (_delta[0] === 0 && _delta[1] === 0) return graph;
97508
97509           setupCache(graph);
97510
97511           if (cache.intersections.length) {
97512               limitDelta(graph);
97513           }
97514
97515           for (var i = 0; i < cache.nodes.length; i++) {
97516               var node = graph.entity(cache.nodes[i]);
97517               var start = projection(node.loc);
97518               var end = geoVecAdd(start, _delta);
97519               graph = graph.replace(node.move(projection.invert(end)));
97520           }
97521
97522           if (cache.intersections.length) {
97523               graph = cleanupIntersections(graph);
97524           }
97525
97526           return graph;
97527       };
97528
97529
97530       action.delta = function() {
97531           return _delta;
97532       };
97533
97534
97535       return action;
97536   }
97537
97538   function actionMoveNode(nodeID, toLoc) {
97539
97540       var action = function(graph, t) {
97541           if (t === null || !isFinite(t)) t = 1;
97542           t = Math.min(Math.max(+t, 0), 1);
97543
97544           var node = graph.entity(nodeID);
97545           return graph.replace(
97546               node.move(geoVecInterp(node.loc, toLoc, t))
97547           );
97548       };
97549
97550       action.transitionable = true;
97551
97552       return action;
97553   }
97554
97555   function actionNoop() {
97556       return function(graph) {
97557           return graph;
97558       };
97559   }
97560
97561   /*
97562    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
97563    */
97564   function actionOrthogonalize(wayId, projection) {
97565       var threshold = 12, // degrees within right or straight to alter
97566           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
97567           upperThreshold = Math.cos(threshold * Math.PI / 180);
97568
97569
97570       var action = function(graph, t) {
97571           if (t === null || !isFinite(t)) t = 1;
97572           t = Math.min(Math.max(+t, 0), 1);
97573
97574           var way = graph.entity(wayId),
97575               nodes = graph.childNodes(way),
97576               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
97577               corner = {i: 0, dotp: 1},
97578               epsilon = 1e-4,
97579               node, loc, score, motions, i, j;
97580
97581           if (points.length === 3) {   // move only one vertex for right triangle
97582               for (i = 0; i < 1000; i++) {
97583                   motions = points.map(calcMotion);
97584                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
97585                   score = corner.dotp;
97586                   if (score < epsilon) {
97587                       break;
97588                   }
97589               }
97590
97591               node = graph.entity(nodes[corner.i].id);
97592               loc = projection.invert(points[corner.i]);
97593               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
97594
97595           } else {
97596               var best,
97597                   originalPoints = clone(points);
97598               score = Infinity;
97599
97600               for (i = 0; i < 1000; i++) {
97601                   motions = points.map(calcMotion);
97602                   for (j = 0; j < motions.length; j++) {
97603                       points[j] = addPoints(points[j],motions[j]);
97604                   }
97605                   var newScore = squareness(points);
97606                   if (newScore < score) {
97607                       best = clone(points);
97608                       score = newScore;
97609                   }
97610                   if (score < epsilon) {
97611                       break;
97612                   }
97613               }
97614
97615               points = best;
97616
97617               for (i = 0; i < points.length; i++) {
97618                   // only move the points that actually moved
97619                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
97620                       loc = projection.invert(points[i]);
97621                       node = graph.entity(nodes[i].id);
97622                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
97623                   }
97624               }
97625
97626               // remove empty nodes on straight sections
97627               for (i = 0; t === 1 && i < points.length; i++) {
97628                   node = graph.entity(nodes[i].id);
97629
97630                   if (graph.parentWays(node).length > 1 ||
97631                       graph.parentRelations(node).length ||
97632                       node.hasInterestingTags()) {
97633                       continue;
97634                   }
97635
97636                   var dotp = normalizedDotProduct(i, points);
97637                   if (dotp < -1 + epsilon) {
97638                       graph = actionDeleteNode(node.id)(graph);
97639                   }
97640               }
97641           }
97642
97643           return graph;
97644
97645
97646           function calcMotion(b, i, array) {
97647               var a = array[(i - 1 + array.length) % array.length],
97648                   c = array[(i + 1) % array.length],
97649                   p = subtractPoints(a, b),
97650                   q = subtractPoints(c, b),
97651                   scale, dotp;
97652
97653               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
97654               p = normalizePoint(p, 1.0);
97655               q = normalizePoint(q, 1.0);
97656
97657               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
97658
97659               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
97660               if (array.length > 3) {
97661                   if (dotp < -0.707106781186547) {
97662                       dotp += 1.0;
97663                   }
97664               } else if (dotp && Math.abs(dotp) < corner.dotp) {
97665                   corner.i = i;
97666                   corner.dotp = Math.abs(dotp);
97667               }
97668
97669               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
97670           }
97671       };
97672
97673
97674       function squareness(points) {
97675           return points.reduce(function(sum, val, i, array) {
97676               var dotp = normalizedDotProduct(i, array);
97677
97678               dotp = filterDotProduct(dotp);
97679               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
97680           }, 0);
97681       }
97682
97683
97684       function normalizedDotProduct(i, points) {
97685           var a = points[(i - 1 + points.length) % points.length],
97686               b = points[i],
97687               c = points[(i + 1) % points.length],
97688               p = subtractPoints(a, b),
97689               q = subtractPoints(c, b);
97690
97691           p = normalizePoint(p, 1.0);
97692           q = normalizePoint(q, 1.0);
97693
97694           return p[0] * q[0] + p[1] * q[1];
97695       }
97696
97697
97698       function subtractPoints(a, b) {
97699           return [a[0] - b[0], a[1] - b[1]];
97700       }
97701
97702
97703       function addPoints(a, b) {
97704           return [a[0] + b[0], a[1] + b[1]];
97705       }
97706
97707
97708       function normalizePoint(point, scale) {
97709           var vector = [0, 0];
97710           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
97711           if (length !== 0) {
97712               vector[0] = point[0] / length;
97713               vector[1] = point[1] / length;
97714           }
97715
97716           vector[0] *= scale;
97717           vector[1] *= scale;
97718
97719           return vector;
97720       }
97721
97722
97723       function filterDotProduct(dotp) {
97724           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
97725               return dotp;
97726           }
97727
97728           return 0;
97729       }
97730
97731
97732       action.disabled = function(graph) {
97733           var way = graph.entity(wayId),
97734               nodes = graph.childNodes(way),
97735               points = uniq(nodes).map(function(n) { return projection(n.loc); });
97736
97737           if (squareness(points)) {
97738               return false;
97739           }
97740
97741           return 'not_squarish';
97742       };
97743
97744
97745       action.transitionable = true;
97746
97747
97748       return action;
97749   }
97750
97751   // `actionRestrictTurn` creates a turn restriction relation.
97752   //
97753   // `turn` must be an `osmTurn` object
97754   // see osm/intersection.js, pathToTurn()
97755   //
97756   // This specifies a restriction of type `restriction` when traveling from
97757   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
97758   // (The action does not check that these entities form a valid intersection.)
97759   //
97760   // From, to, and via ways should be split before calling this action.
97761   // (old versions of the code would split the ways here, but we no longer do it)
97762   //
97763   // For testing convenience, accepts a restrictionID to assign to the new
97764   // relation. Normally, this will be undefined and the relation will
97765   // automatically be assigned a new ID.
97766   //
97767   function actionRestrictTurn(turn, restrictionType, restrictionID) {
97768
97769       return function(graph) {
97770           var fromWay = graph.entity(turn.from.way);
97771           var toWay = graph.entity(turn.to.way);
97772           var viaNode = turn.via.node && graph.entity(turn.via.node);
97773           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
97774           var members = [];
97775
97776           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
97777
97778           if (viaNode) {
97779               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
97780           } else if (viaWays) {
97781               viaWays.forEach(function(viaWay) {
97782                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
97783               });
97784           }
97785
97786           members.push({ id: toWay.id, type: 'way',  role: 'to' });
97787
97788           return graph.replace(osmRelation({
97789               id: restrictionID,
97790               tags: {
97791                   type: 'restriction',
97792                   restriction: restrictionType
97793               },
97794               members: members
97795           }));
97796       };
97797   }
97798
97799   function actionRevert(id) {
97800       var action = function(graph) {
97801           var entity = graph.hasEntity(id),
97802               base = graph.base().entities[id];
97803
97804           if (entity && !base) {    // entity will be removed..
97805               if (entity.type === 'node') {
97806                   graph.parentWays(entity)
97807                       .forEach(function(parent) {
97808                           parent = parent.removeNode(id);
97809                           graph = graph.replace(parent);
97810
97811                           if (parent.isDegenerate()) {
97812                               graph = actionDeleteWay(parent.id)(graph);
97813                           }
97814                       });
97815               }
97816
97817               graph.parentRelations(entity)
97818                   .forEach(function(parent) {
97819                       parent = parent.removeMembersWithID(id);
97820                       graph = graph.replace(parent);
97821
97822                       if (parent.isDegenerate()) {
97823                           graph = actionDeleteRelation(parent.id)(graph);
97824                       }
97825                   });
97826           }
97827
97828           return graph.revert(id);
97829       };
97830
97831       return action;
97832   }
97833
97834   function actionRotate(rotateIds, pivot, angle, projection) {
97835
97836       var action = function(graph) {
97837           return graph.update(function(graph) {
97838               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
97839                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
97840                   graph = graph.replace(node.move(projection.invert(point)));
97841               });
97842           });
97843       };
97844
97845       return action;
97846   }
97847
97848   /* Built-in method references for those with the same name as other `lodash` methods. */
97849   var nativeMax$8 = Math.max;
97850
97851   /**
97852    * Gets the index at which the first occurrence of `value` is found in `array`
97853    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
97854    * for equality comparisons. If `fromIndex` is negative, it's used as the
97855    * offset from the end of `array`.
97856    *
97857    * @static
97858    * @memberOf _
97859    * @since 0.1.0
97860    * @category Array
97861    * @param {Array} array The array to inspect.
97862    * @param {*} value The value to search for.
97863    * @param {number} [fromIndex=0] The index to search from.
97864    * @returns {number} Returns the index of the matched value, else `-1`.
97865    * @example
97866    *
97867    * _.indexOf([1, 2, 1, 2], 2);
97868    * // => 1
97869    *
97870    * // Search from the `fromIndex`.
97871    * _.indexOf([1, 2, 1, 2], 2, 2);
97872    * // => 3
97873    */
97874   function indexOf(array, value, fromIndex) {
97875     var length = array == null ? 0 : array.length;
97876     if (!length) {
97877       return -1;
97878     }
97879     var index = fromIndex == null ? 0 : toInteger(fromIndex);
97880     if (index < 0) {
97881       index = nativeMax$8(length + index, 0);
97882     }
97883     return baseIndexOf(array, value, index);
97884   }
97885
97886   // Split a way at the given node.
97887   //
97888   // Optionally, split only the given ways, if multiple ways share
97889   // the given node.
97890   //
97891   // This is the inverse of `iD.actionJoin`.
97892   //
97893   // For testing convenience, accepts an ID to assign to the new way.
97894   // Normally, this will be undefined and the way will automatically
97895   // be assigned a new ID.
97896   //
97897   // Reference:
97898   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
97899   //
97900   function actionSplit(nodeId, newWayIds) {
97901       var _wayIDs;
97902
97903       // If the way is closed, we need to search for a partner node
97904       // to split the way at.
97905       //
97906       // The following looks for a node that is both far away from
97907       // the initial node in terms of way segment length and nearby
97908       // in terms of beeline-distance. This assures that areas get
97909       // split on the most "natural" points (independent of the number
97910       // of nodes).
97911       // For example: bone-shaped areas get split across their waist
97912       // line, circles across the diameter.
97913       function splitArea(nodes, idxA, graph) {
97914           var lengths = new Array(nodes.length);
97915           var length;
97916           var i;
97917           var best = 0;
97918           var idxB;
97919
97920           function wrap(index) {
97921               return utilWrap(index, nodes.length);
97922           }
97923
97924           function dist(nA, nB) {
97925               var locA = graph.entity(nA).loc;
97926               var locB = graph.entity(nB).loc;
97927               var epsilon = 1e-6;
97928               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
97929           }
97930
97931           // calculate lengths
97932           length = 0;
97933           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
97934               length += dist(nodes[i], nodes[wrap(i-1)]);
97935               lengths[i] = length;
97936           }
97937
97938           length = 0;
97939           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
97940               length += dist(nodes[i], nodes[wrap(i+1)]);
97941               if (length < lengths[i])
97942                   lengths[i] = length;
97943           }
97944
97945           // determine best opposite node to split
97946           for (i = 0; i < nodes.length; i++) {
97947               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
97948               if (cost > best) {
97949                   idxB = i;
97950                   best = cost;
97951               }
97952           }
97953
97954           return idxB;
97955       }
97956
97957
97958       function split(graph, wayA, newWayId) {
97959           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
97960           var origNodes = wayA.nodes.slice();
97961           var nodesA;
97962           var nodesB;
97963           var isArea = wayA.isArea();
97964           var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
97965
97966           if (wayA.isClosed()) {
97967               var nodes = wayA.nodes.slice(0, -1);
97968               var idxA = indexOf(nodes, nodeId);
97969               var idxB = splitArea(nodes, idxA, graph);
97970
97971               if (idxB < idxA) {
97972                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
97973                   nodesB = nodes.slice(idxB, idxA + 1);
97974               } else {
97975                   nodesA = nodes.slice(idxA, idxB + 1);
97976                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
97977               }
97978           } else {
97979               var idx = indexOf(wayA.nodes, nodeId, 1);
97980               nodesA = wayA.nodes.slice(0, idx + 1);
97981               nodesB = wayA.nodes.slice(idx);
97982           }
97983
97984           wayA = wayA.update({nodes: nodesA});
97985           wayB = wayB.update({nodes: nodesB});
97986
97987           graph = graph.replace(wayA);
97988           graph = graph.replace(wayB);
97989
97990           graph.parentRelations(wayA).forEach(function(relation) {
97991               var member;
97992
97993               // Turn restrictions - make sure:
97994               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
97995               //    (whichever one is connected to the VIA node/ways)
97996               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
97997               if (relation.isRestriction()) {
97998                   var f = relation.memberByRole('from');
97999                   var v = relation.membersByRole('via');
98000                   var t = relation.memberByRole('to');
98001                   var i;
98002
98003                   // 1. split a FROM/TO
98004                   if (f.id === wayA.id || t.id === wayA.id) {
98005                       var keepB = false;
98006                       if (v.length === 1 && v[0].type === 'node') {   // check via node
98007                           keepB = wayB.contains(v[0].id);
98008                       } else {                                        // check via way(s)
98009                           for (i = 0; i < v.length; i++) {
98010                               if (v[i].type === 'way') {
98011                                   var wayVia = graph.hasEntity(v[i].id);
98012                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
98013                                       keepB = true;
98014                                       break;
98015                                   }
98016                               }
98017                           }
98018                       }
98019
98020                       if (keepB) {
98021                           relation = relation.replaceMember(wayA, wayB);
98022                           graph = graph.replace(relation);
98023                       }
98024
98025                   // 2. split a VIA
98026                   } else {
98027                       for (i = 0; i < v.length; i++) {
98028                           if (v[i].type === 'way' && v[i].id === wayA.id) {
98029                               member = {
98030                                   id: wayB.id,
98031                                   type: 'way',
98032                                   role: 'via'
98033                               };
98034                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
98035                               break;
98036                           }
98037                       }
98038                   }
98039
98040               // All other relations (Routes, Multipolygons, etc):
98041               // 1. Both `wayA` and `wayB` remain in the relation
98042               // 2. But must be inserted as a pair (see `actionAddMember` for details)
98043               } else {
98044                   if (relation === isOuter) {
98045                       graph = graph.replace(relation.mergeTags(wayA.tags));
98046                       graph = graph.replace(wayA.update({tags: {}}));
98047                       graph = graph.replace(wayB.update({tags: {}}));
98048                   }
98049
98050                   member = {
98051                       id: wayB.id,
98052                       type: 'way',
98053                       role: relation.memberById(wayA.id).role
98054                   };
98055
98056                   var insertPair = {
98057                       originalID: wayA.id,
98058                       insertedID: wayB.id,
98059                       nodes: origNodes
98060                   };
98061
98062                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
98063               }
98064           });
98065
98066           if (!isOuter && isArea) {
98067               var multipolygon = osmRelation({
98068                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
98069                   members: [
98070                       {id: wayA.id, role: 'outer', type: 'way'},
98071                       {id: wayB.id, role: 'outer', type: 'way'}
98072                   ]
98073               });
98074
98075               graph = graph.replace(multipolygon);
98076               graph = graph.replace(wayA.update({tags: {}}));
98077               graph = graph.replace(wayB.update({tags: {}}));
98078           }
98079
98080           return graph;
98081       }
98082
98083
98084       var action = function(graph) {
98085           var candidates = action.ways(graph);
98086           for (var i = 0; i < candidates.length; i++) {
98087               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
98088           }
98089           return graph;
98090       };
98091
98092
98093       action.ways = function(graph) {
98094           var node = graph.entity(nodeId);
98095           var parents = graph.parentWays(node);
98096           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
98097
98098           return parents.filter(function(parent) {
98099               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
98100                   return false;
98101
98102               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
98103                   return false;
98104
98105               if (parent.isClosed()) {
98106                   return true;
98107               }
98108
98109               for (var i = 1; i < parent.nodes.length - 1; i++) {
98110                   if (parent.nodes[i] === nodeId) {
98111                       return true;
98112                   }
98113               }
98114
98115               return false;
98116           });
98117       };
98118
98119
98120       action.disabled = function(graph) {
98121           var candidates = action.ways(graph);
98122           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
98123               return 'not_eligible';
98124       };
98125
98126
98127       action.limitWays = function(_) {
98128           if (!arguments.length) return _wayIDs;
98129           _wayIDs = _;
98130           return action;
98131       };
98132
98133
98134       return action;
98135   }
98136
98137   /*
98138    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
98139    */
98140   function actionStraighten(wayId, projection) {
98141
98142       function positionAlongWay(n, s, e) {
98143           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
98144                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
98145       }
98146
98147
98148       var action = function(graph, t) {
98149           if (t === null || !isFinite(t)) t = 1;
98150           t = Math.min(Math.max(+t, 0), 1);
98151
98152           var way = graph.entity(wayId),
98153               nodes = graph.childNodes(way),
98154               points = nodes.map(function(n) { return projection(n.loc); }),
98155               startPoint = points[0],
98156               endPoint = points[points.length-1],
98157               toDelete = [],
98158               i;
98159
98160           for (i = 1; i < points.length-1; i++) {
98161               var node = nodes[i],
98162                   point = points[i];
98163
98164               if (t < 1 || graph.parentWays(node).length > 1 ||
98165                   graph.parentRelations(node).length ||
98166                   node.hasInterestingTags()) {
98167
98168                   var u = positionAlongWay(point, startPoint, endPoint),
98169                       p = [
98170                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
98171                           startPoint[1] + u * (endPoint[1] - startPoint[1])
98172                       ],
98173                       loc2 = projection.invert(p);
98174
98175                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
98176
98177               } else {
98178                   // safe to delete
98179                   if (toDelete.indexOf(node) === -1) {
98180                       toDelete.push(node);
98181                   }
98182               }
98183           }
98184
98185           for (i = 0; i < toDelete.length; i++) {
98186               graph = actionDeleteNode(toDelete[i].id)(graph);
98187           }
98188
98189           return graph;
98190       };
98191
98192
98193       action.disabled = function(graph) {
98194           // check way isn't too bendy
98195           var way = graph.entity(wayId),
98196               nodes = graph.childNodes(way),
98197               points = nodes.map(function(n) { return projection(n.loc); }),
98198               startPoint = points[0],
98199               endPoint = points[points.length-1],
98200               threshold = 0.2 * geoVecLength(startPoint, endPoint),
98201               i;
98202
98203           if (threshold === 0) {
98204               return 'too_bendy';
98205           }
98206
98207           for (i = 1; i < points.length-1; i++) {
98208               var point = points[i],
98209                   u = positionAlongWay(point, startPoint, endPoint),
98210                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
98211                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
98212                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
98213
98214               // to bendy if point is off by 20% of total start/end distance in projected space
98215               if (isNaN(dist) || dist > threshold) {
98216                   return 'too_bendy';
98217               }
98218           }
98219       };
98220
98221
98222       action.transitionable = true;
98223
98224
98225       return action;
98226   }
98227
98228   // `actionUnrestrictTurn` deletes a turn restriction relation.
98229   //
98230   // `turn` must be an `osmTurn` object with a `restrictionID` property.
98231   // see osm/intersection.js, pathToTurn()
98232   //
98233   function actionUnrestrictTurn(turn) {
98234       return function(graph) {
98235           return actionDeleteRelation(turn.restrictionID)(graph);
98236       };
98237   }
98238
98239   /* Reflect the given area around its axis of symmetry */
98240   function actionReflect(reflectIds, projection) {
98241       var useLongAxis = true;
98242
98243
98244       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
98245       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
98246       function getSmallestSurroundingRectangle(graph, nodes) {
98247           var points = nodes.map(function(n) { return projection(n.loc); }),
98248               hull = d3_polygonHull(points),
98249               centroid = d3_polygonCentroid(hull),
98250               minArea = Infinity,
98251               ssrExtent = [],
98252               ssrAngle = 0,
98253               c1 = hull[0];
98254
98255           for (var i = 0; i <= hull.length - 1; i++) {
98256               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
98257                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
98258                   poly = geoRotate(hull, -angle, centroid),
98259                   extent = poly.reduce(function(extent, point) {
98260                           return extent.extend(geoExtent(point));
98261                       }, geoExtent()),
98262                   area = extent.area();
98263
98264               if (area < minArea) {
98265                   minArea = area;
98266                   ssrExtent = extent;
98267                   ssrAngle = angle;
98268               }
98269               c1 = c2;
98270           }
98271
98272           return {
98273               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
98274               angle: ssrAngle
98275           };
98276       }
98277
98278
98279       var action = function(graph, t) {
98280           if (t === null || !isFinite(t)) t = 1;
98281           t = Math.min(Math.max(+t, 0), 1);
98282
98283           var nodes = utilGetAllNodes(reflectIds, graph),
98284               ssr = getSmallestSurroundingRectangle(graph, nodes);
98285
98286           // Choose line pq = axis of symmetry.
98287           // The shape's surrounding rectangle has 2 axes of symmetry.
98288           // Reflect across the longer axis by default.
98289           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
98290               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
98291               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
98292               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
98293               p, q;
98294
98295           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
98296           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
98297               p = p1;
98298               q = q1;
98299           } else {
98300               p = p2;
98301               q = q2;
98302           }
98303
98304           // reflect c across pq
98305           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
98306           var dx = q[0] - p[0];
98307           var dy = q[1] - p[1];
98308           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
98309           var b = 2 * dx * dy / (dx * dx + dy * dy);
98310           for (var i = 0; i < nodes.length; i++) {
98311               var node = nodes[i];
98312               var c = projection(node.loc);
98313               var c2 = [
98314                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
98315                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
98316               ];
98317               var loc2 = projection.invert(c2);
98318               node = node.move(geoVecInterp(node.loc, loc2, t));
98319               graph = graph.replace(node);
98320           }
98321
98322           return graph;
98323       };
98324
98325
98326       action.useLongAxis = function(_) {
98327           if (!arguments.length) return useLongAxis;
98328           useLongAxis = _;
98329           return action;
98330       };
98331
98332
98333       action.transitionable = true;
98334
98335
98336       return action;
98337   }
98338
98339   function actionDetachNode(nodeID) {
98340
98341       var action = function(graph) {
98342           var node = graph.entity(nodeID);
98343
98344           // Create a new node to replace the one we will detach
98345           var replacement = osmNode({ loc: node.loc });
98346           graph = graph.replace(replacement);
98347
98348           // Process each way in turn, updating the graph as we go
98349           graph = graph.parentWays(node)
98350               .reduce(function(accGraph, parentWay) {
98351                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
98352               }, graph);
98353
98354           // Process any relations too
98355           return graph.parentRelations(node)
98356               .reduce(function(accGraph, parentRel) {
98357                   return accGraph.replace(parentRel.replaceMember(node, replacement));
98358               }, graph);
98359       };
98360
98361
98362       action.disabled = function(graph) {
98363           var node = graph.entity(nodeID);
98364           var parentRels = graph.parentRelations(node);
98365
98366           for (var i = 0; i < parentRels.length; i++) {
98367               var relation = parentRels[i];
98368               if (!relation.isValidRestriction()) continue;
98369
98370               for (var j = 0; j < relation.members.length; j++) {
98371                   var m = relation.members[j];
98372                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
98373                       return 'restriction';
98374                   }
98375               }
98376           }
98377
98378           return false;
98379       };
98380
98381
98382       return action;
98383   }
98384
98385   function actionUpgradeTags(entityId, oldTags, replaceTags) {
98386       return function(graph) {
98387           var entity = graph.entity(entityId);
98388           var tags = clone(entity.tags);
98389           var transferValue;
98390           for (var oldTagKey in oldTags) {
98391               if (oldTags[oldTagKey] === '*') {
98392                   transferValue = tags[oldTagKey];
98393               }
98394               delete tags[oldTagKey];
98395           }
98396           if (replaceTags) {
98397               for (var replaceKey in replaceTags) {
98398                   var replaceValue = replaceTags[replaceKey];
98399                   if (replaceValue === '*') {
98400                       if (tags[replaceKey]) {
98401                           // any value is okay and there already
98402                           // is one, so don't update it
98403                           continue;
98404                       } else {
98405                           // otherwise assume `yes` is okay
98406                           tags[replaceKey] = 'yes';
98407                       }
98408                   } else if (replaceValue === '$1') {
98409                       tags[replaceKey] = transferValue;
98410                   } else {
98411                       tags[replaceKey] = replaceValue;
98412                   }
98413               }
98414           }
98415           return graph.replace(entity.update({tags: tags}));
98416       };
98417   }
98418
98419   var Connection = services.osm;
98420
98421   var debug = false;
98422
98423   var iD = /*#__PURE__*/Object.freeze({
98424     Connection: Connection,
98425     debug: debug,
98426     d3: index$3,
98427     coreValidator: coreValidator,
98428     Context: coreContext,
98429     setAreaKeys: setAreaKeys,
98430     get areaKeys () { return areaKeys; },
98431     Difference: coreDifference,
98432     Graph: coreGraph,
98433     History: coreHistory,
98434     Tree: coreTree,
98435     geoCross: geoVecCross,
98436     geoInterp: geoVecInterp,
98437     geoRoundCoordinates: geoVecFloor,
98438     geoEuclideanDistance: geoVecLength,
98439     Entity: osmEntity,
98440     Node: osmNode,
98441     Relation: osmRelation,
98442     Way: osmWay,
98443     BackgroundSource: rendererBackgroundSource,
98444     Background: rendererBackground,
98445     Features: rendererFeatures,
98446     Map: rendererMap,
98447     TileLayer: rendererTileLayer,
98448     Detect: utilDetect,
98449     uiPreset: uiPresetEditor,
98450     actionAddEntity: actionAddEntity,
98451     actionAddMember: actionAddMember,
98452     actionAddMidpoint: actionAddMidpoint,
98453     actionAddVertex: actionAddVertex,
98454     actionChangeMember: actionChangeMember,
98455     actionChangePreset: actionChangePreset,
98456     actionChangeTags: actionChangeTags,
98457     actionCircularize: actionCircularize,
98458     actionConnect: actionConnect,
98459     actionCopyEntities: actionCopyEntities,
98460     actionDeleteMember: actionDeleteMember,
98461     actionDeleteMultiple: actionDeleteMultiple,
98462     actionDeleteNode: actionDeleteNode,
98463     actionDeleteRelation: actionDeleteRelation,
98464     actionDeleteWay: actionDeleteWay,
98465     actionDiscardTags: actionDiscardTags,
98466     actionDisconnect: actionDisconnect,
98467     actionJoin: actionJoin,
98468     actionMerge: actionMerge,
98469     actionMergeNodes: actionMergeNodes,
98470     actionMergePolygon: actionMergePolygon,
98471     actionMergeRemoteChanges: actionMergeRemoteChanges,
98472     actionMove: actionMove,
98473     actionMoveNode: actionMoveNode,
98474     actionNoop: actionNoop,
98475     actionOrthogonalize: actionOrthogonalize,
98476     actionRestrictTurn: actionRestrictTurn,
98477     actionReverse: actionReverse,
98478     actionRevert: actionRevert,
98479     actionRotate: actionRotate,
98480     actionSplit: actionSplit,
98481     actionStraighten: actionStraighten,
98482     actionUnrestrictTurn: actionUnrestrictTurn,
98483     actionReflect: actionReflect,
98484     actionDetachNode: actionDetachNode,
98485     actionUpgradeTags: actionUpgradeTags,
98486     behaviorAddWay: behaviorAddWay,
98487     behaviorBreathe: behaviorBreathe,
98488     behaviorCopy: behaviorCopy,
98489     behaviorDrag: behaviorDrag,
98490     behaviorDrawWay: behaviorDrawWay,
98491     behaviorDraw: behaviorDraw,
98492     behaviorEdit: behaviorEdit,
98493     behaviorHash: behaviorHash,
98494     behaviorHover: behaviorHover,
98495     behaviorLasso: behaviorLasso,
98496     behaviorOperation: behaviorOperation,
98497     behaviorPaste: behaviorPaste,
98498     behaviorSelect: behaviorSelect,
98499     behaviorTail: behaviorTail,
98500     coreContext: coreContext,
98501     coreDifference: coreDifference,
98502     coreGraph: coreGraph,
98503     coreHistory: coreHistory,
98504     coreTree: coreTree,
98505     data: data,
98506     dataWikipedia: wikipedia$2,
98507     dataAddressFormats: dataAddressFormats,
98508     dataDeprecated: dataDeprecated,
98509     dataDiscarded: dataDiscarded,
98510     dataLocales: dataLocales,
98511     dataPhoneFormats: dataPhoneFormats,
98512     dataShortcuts: dataShortcuts,
98513     dataImperial: dataImperial,
98514     dataDriveLeft: dataDriveLeft,
98515     dataEn: en,
98516     geoExtent: geoExtent,
98517     geoLatToMeters: geoLatToMeters,
98518     geoLonToMeters: geoLonToMeters,
98519     geoMetersToLat: geoMetersToLat,
98520     geoMetersToLon: geoMetersToLon,
98521     geoMetersToOffset: geoMetersToOffset,
98522     geoOffsetToMeters: geoOffsetToMeters,
98523     geoScaleToZoom: geoScaleToZoom,
98524     geoSphericalClosestNode: geoSphericalClosestNode,
98525     geoSphericalDistance: geoSphericalDistance,
98526     geoZoomToScale: geoZoomToScale,
98527     geoAngle: geoAngle,
98528     geoChooseEdge: geoChooseEdge,
98529     geoEdgeEqual: geoEdgeEqual,
98530     geoHasLineIntersections: geoHasLineIntersections,
98531     geoHasSelfIntersections: geoHasSelfIntersections,
98532     geoRotate: geoRotate,
98533     geoLineIntersection: geoLineIntersection,
98534     geoPathHasIntersections: geoPathHasIntersections,
98535     geoPathIntersections: geoPathIntersections,
98536     geoPathLength: geoPathLength,
98537     geoPointInPolygon: geoPointInPolygon,
98538     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
98539     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
98540     geoViewportEdge: geoViewportEdge,
98541     geoRawMercator: geoRawMercator,
98542     geoVecAdd: geoVecAdd,
98543     geoVecAngle: geoVecAngle,
98544     geoVecCross: geoVecCross,
98545     geoVecDot: geoVecDot,
98546     geoVecEqual: geoVecEqual,
98547     geoVecFloor: geoVecFloor,
98548     geoVecInterp: geoVecInterp,
98549     geoVecLength: geoVecLength,
98550     geoVecSubtract: geoVecSubtract,
98551     geoVecScale: geoVecScale,
98552     modeAddArea: modeAddArea,
98553     modeAddLine: modeAddLine,
98554     modeAddPoint: modeAddPoint,
98555     modeAddNote: modeAddNote,
98556     modeBrowse: modeBrowse,
98557     modeDragNode: modeDragNode,
98558     modeDragNote: modeDragNote,
98559     modeDrawArea: modeDrawArea,
98560     modeDrawLine: modeDrawLine,
98561     modeMove: modeMove,
98562     modeRotate: modeRotate,
98563     modeSave: modeSave,
98564     modeSelect: modeSelect,
98565     modeSelectData: modeSelectData,
98566     modeSelectError: modeSelectError,
98567     modeSelectNote: modeSelectNote,
98568     operationCircularize: operationCircularize,
98569     operationContinue: operationContinue,
98570     operationDelete: operationDelete,
98571     operationDisconnect: operationDisconnect,
98572     operationMerge: operationMerge,
98573     operationMove: operationMove,
98574     operationOrthogonalize: operationOrthogonalize,
98575     operationReflectShort: operationReflectShort,
98576     operationReflectLong: operationReflectLong,
98577     operationReverse: operationReverse,
98578     operationRotate: operationRotate,
98579     operationSplit: operationSplit,
98580     operationStraighten: operationStraighten,
98581     operationDetachNode: operationDetachNode,
98582     osmChangeset: osmChangeset,
98583     osmEntity: osmEntity,
98584     osmNode: osmNode,
98585     osmNote: osmNote,
98586     osmRelation: osmRelation,
98587     osmWay: osmWay,
98588     qaError: qaError,
98589     osmIntersection: osmIntersection,
98590     osmTurn: osmTurn,
98591     osmInferRestriction: osmInferRestriction,
98592     osmLanes: osmLanes,
98593     osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
98594     osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
98595     osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
98596     osmJoinWays: osmJoinWays,
98597     osmOneWayTags: osmOneWayTags,
98598     osmPavedTags: osmPavedTags,
98599     osmIsInterestingTag: osmIsInterestingTag,
98600     presetCategory: presetCategory,
98601     presetCollection: presetCollection,
98602     presetField: presetField,
98603     presetPreset: presetPreset,
98604     presetIndex: presetIndex,
98605     rendererBackgroundSource: rendererBackgroundSource,
98606     rendererBackground: rendererBackground,
98607     rendererFeatures: rendererFeatures,
98608     rendererMap: rendererMap,
98609     rendererTileLayer: rendererTileLayer,
98610     services: services,
98611     serviceKeepRight: serviceKeepRight,
98612     serviceImproveOSM: serviceImproveOSM,
98613     serviceMapillary: serviceMapillary,
98614     serviceMapRules: serviceMapRules,
98615     serviceNominatim: serviceNominatim,
98616     serviceOpenstreetcam: serviceOpenstreetcam,
98617     serviceOsm: serviceOsm,
98618     serviceOsmWikibase: serviceOsmWikibase,
98619     serviceStreetside: serviceStreetside,
98620     serviceTaginfo: serviceTaginfo,
98621     serviceVectorTile: serviceVectorTile,
98622     serviceWikidata: serviceWikidata,
98623     serviceWikipedia: serviceWikipedia,
98624     svgAreas: svgAreas,
98625     svgData: svgData,
98626     svgDebug: svgDebug,
98627     svgDefs: svgDefs,
98628     svgKeepRight: svgKeepRight,
98629     svgIcon: svgIcon,
98630     svgGeolocate: svgGeolocate,
98631     svgLabels: svgLabels,
98632     svgLayers: svgLayers,
98633     svgLines: svgLines,
98634     svgMapillaryImages: svgMapillaryImages,
98635     svgMapillarySigns: svgMapillarySigns,
98636     svgMidpoints: svgMidpoints,
98637     svgNotes: svgNotes,
98638     svgMarkerSegments: svgMarkerSegments,
98639     svgOpenstreetcamImages: svgOpenstreetcamImages,
98640     svgOsm: svgOsm,
98641     svgPassiveVertex: svgPassiveVertex,
98642     svgPath: svgPath,
98643     svgPointTransform: svgPointTransform,
98644     svgPoints: svgPoints,
98645     svgRelationMemberTags: svgRelationMemberTags,
98646     svgSegmentWay: svgSegmentWay,
98647     svgStreetside: svgStreetside,
98648     svgTagClasses: svgTagClasses,
98649     svgTouch: svgTouch,
98650     svgTurns: svgTurns,
98651     svgVertices: svgVertices,
98652     uiFields: uiFields,
98653     uiFieldDefaultCheck: uiFieldCheck,
98654     uiFieldOnewayCheck: uiFieldCheck,
98655     uiFieldCheck: uiFieldCheck,
98656     uiFieldMultiCombo: uiFieldCombo,
98657     uiFieldNetworkCombo: uiFieldCombo,
98658     uiFieldSemiCombo: uiFieldCombo,
98659     uiFieldTypeCombo: uiFieldCombo,
98660     uiFieldCombo: uiFieldCombo,
98661     uiFieldUrl: uiFieldText,
98662     uiFieldNumber: uiFieldText,
98663     uiFieldTel: uiFieldText,
98664     uiFieldEmail: uiFieldText,
98665     uiFieldText: uiFieldText,
98666     uiFieldAccess: uiFieldAccess,
98667     uiFieldAddress: uiFieldAddress,
98668     uiFieldCycleway: uiFieldCycleway,
98669     uiFieldLanes: uiFieldLanes,
98670     uiFieldLocalized: uiFieldLocalized,
98671     uiFieldMaxspeed: uiFieldMaxspeed,
98672     uiFieldStructureRadio: uiFieldRadio,
98673     uiFieldRadio: uiFieldRadio,
98674     uiFieldRestrictions: uiFieldRestrictions,
98675     uiFieldTextarea: uiFieldTextarea,
98676     uiFieldWikidata: uiFieldWikidata,
98677     uiFieldWikipedia: uiFieldWikipedia,
98678     uiIntro: uiIntro,
98679     uiInfoPanels: uiInfoPanels,
98680     uiPanelBackground: uiPanelBackground,
98681     uiPanelHistory: uiPanelHistory,
98682     uiPanelLocation: uiPanelLocation,
98683     uiPanelMeasurement: uiPanelMeasurement,
98684     uiSettingsCustomBackground: uiSettingsCustomBackground,
98685     uiSettingsCustomData: uiSettingsCustomData,
98686     uiInit: uiInit,
98687     uiAccount: uiAccount,
98688     uiAttribution: uiAttribution,
98689     uiBackground: uiBackground,
98690     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
98691     uiBackgroundOffset: uiBackgroundOffset,
98692     uiChangesetEditor: uiChangesetEditor,
98693     uiCmd: uiCmd,
98694     uiCombobox: uiCombobox,
98695     uiCommit: uiCommit,
98696     uiCommitChanges: uiCommitChanges,
98697     uiCommitWarnings: uiCommitWarnings,
98698     uiConfirm: uiConfirm,
98699     uiConflicts: uiConflicts,
98700     uiContributors: uiContributors,
98701     uiCurtain: uiCurtain,
98702     uiDataEditor: uiDataEditor,
98703     uiDataHeader: uiDataHeader,
98704     uiDisclosure: uiDisclosure,
98705     uiEditMenu: uiEditMenu,
98706     uiEntityEditor: uiEntityEditor,
98707     uiFeatureInfo: uiFeatureInfo,
98708     uiFeatureList: uiFeatureList,
98709     uiField: uiField,
98710     uiFieldHelp: uiFieldHelp,
98711     uiFlash: uiFlash,
98712     uiFormFields: uiFormFields,
98713     uiFullScreen: uiFullScreen,
98714     uiGeolocate: uiGeolocate,
98715     uiHelp: uiHelp,
98716     uiImproveOsmComments: uiImproveOsmComments,
98717     uiImproveOsmDetails: uiImproveOsmDetails,
98718     uiImproveOsmEditor: uiImproveOsmEditor,
98719     uiImproveOsmHeader: uiImproveOsmHeader,
98720     uiInfo: uiInfo,
98721     uiInspector: uiInspector,
98722     uiKeepRightDetails: uiKeepRightDetails,
98723     uiKeepRightEditor: uiKeepRightEditor,
98724     uiKeepRightHeader: uiKeepRightHeader,
98725     uiLasso: uiLasso,
98726     uiLoading: uiLoading,
98727     uiMapData: uiMapData,
98728     uiMapInMap: uiMapInMap,
98729     uiModal: uiModal,
98730     uiModes: uiModes,
98731     uiNotice: uiNotice,
98732     uiNoteComments: uiNoteComments,
98733     uiNoteEditor: uiNoteEditor,
98734     uiNoteHeader: uiNoteHeader,
98735     uiNoteReport: uiNoteReport,
98736     uiPresetEditor: uiPresetEditor,
98737     uiPresetIcon: uiPresetIcon,
98738     uiPresetList: uiPresetList,
98739     uiQuickLinks: uiQuickLinks,
98740     uiRadialMenu: uiRadialMenu,
98741     uiRawMemberEditor: uiRawMemberEditor,
98742     uiRawMembershipEditor: uiRawMembershipEditor,
98743     uiRawTagEditor: uiRawTagEditor,
98744     uiRestore: uiRestore,
98745     uiSave: uiSave,
98746     uiScale: uiScale,
98747     uiSelectionList: uiSelectionList,
98748     uiSidebar: uiSidebar,
98749     uiSourceSwitch: uiSourceSwitch,
98750     uiSpinner: uiSpinner,
98751     uiSplash: uiSplash,
98752     uiStatus: uiStatus,
98753     uiSuccess: uiSuccess,
98754     uiTagReference: uiTagReference,
98755     uiToggle: uiToggle,
98756     uiTooltipHtml: uiTooltipHtml,
98757     uiUndoRedo: uiUndoRedo,
98758     uiVersion: uiVersion,
98759     uiViewOnOSM: uiViewOnOSM,
98760     uiViewOnKeepRight: uiViewOnKeepRight,
98761     uiZoom: uiZoom,
98762     utilAsyncMap: utilAsyncMap,
98763     utilCallWhenIdle: utilCallWhenIdle,
98764     utilCleanTags: utilCleanTags,
98765     utilDisplayName: utilDisplayName,
98766     utilDisplayNameForPath: utilDisplayNameForPath,
98767     utilDisplayType: utilDisplayType,
98768     utilDisplayLabel: utilDisplayLabel,
98769     utilEntityRoot: utilEntityRoot,
98770     utilEditDistance: utilEditDistance,
98771     utilEntitySelector: utilEntitySelector,
98772     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
98773     utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
98774     utilFastMouse: utilFastMouse,
98775     utilFunctor: utilFunctor,
98776     utilGetAllNodes: utilGetAllNodes,
98777     utilGetPrototypeOf: utilGetPrototypeOf,
98778     utilGetSetValue: utilGetSetValue,
98779     utilHashcode: utilHashcode,
98780     utilHighlightEntities: utilHighlightEntities,
98781     utilIdleWorker: utilIdleWorker,
98782     utilKeybinding: utilKeybinding,
98783     utilNoAuto: utilNoAuto,
98784     utilPrefixCSSProperty: utilPrefixCSSProperty,
98785     utilPrefixDOMProperty: utilPrefixDOMProperty,
98786     utilPreset: utilPreset,
98787     utilQsString: utilQsString,
98788     utilRebind: utilRebind,
98789     utilSetTransform: utilSetTransform,
98790     utilSessionMutex: utilSessionMutex,
98791     utilStringQs: utilStringQs,
98792     utilTagText: utilTagText,
98793     utilTiler: utilTiler,
98794     utilTriggerEvent: utilTriggerEvent,
98795     utilWrap: utilWrap,
98796     validationAlmostJunction: validationAlmostJunction,
98797     validationCrossingWays: validationCrossingWays,
98798     validationDeprecatedTag: validationDeprecatedTag,
98799     validationDisconnectedWay: validationDisconnectedWay,
98800     validationGenericName: validationGenericName,
98801     validationManyDeletions: validationManyDeletions,
98802     validationMaprules: validationMaprules,
98803     validationMissingRole: validationMissingRole,
98804     validationMissingTag: validationMissingTag,
98805     validationOldMultipolygon: validationOldMultipolygon,
98806     validationTagSuggestsArea: validationTagSuggestsArea
98807   });
98808
98809   window.iD = iD;
98810
98811 }());
98812 //# sourceMappingURL=iD.js.map